AtomicInteger를 활용한 파일 저장 순서 동기화 문제 해결
📌 서론
멀티스레드 환경에서 동기화 문제는 개발자에게 항상 도전적인 문제 중 하나다. 특히, 파일 업로드 기능을 구현할 때 여러 파일을 순차적으로 저장하려고 할 때, 동일한 순서 값이 중복되어 발생하는 문제는 더욱 복잡하다. 이 글에서는 Java의 AtomicInteger 클래스를 사용하여 이러한 동기화 문제를 어떻게 해결했는지 공유하고자 한다.
문제 상황
Spring Boot와 AWS S3를 사용하여 파일을 업로드하고 관리하는 레시피 관리 시스템을 개발 중이었다. 각 레시피에 여러 이미지 파일을 첨부할 수 있으며, 각 파일은 순서대로 저장되어야 했다. 그러나 여러 파일을 동시에 업로드할 때, 모든 파일의 순서(fileOrder)가 동일한 값으로 저장되는 문제가 발생했다. 이는 파일 저장 순서를 결정하는 로직이 멀티스레드 환경에서 안전하게 동작하지 않기 때문이었다.
해결 방안
문제의 원인을 파악한 후, Java의 AtomicInteger 클래스를 사용하여 해결하기로 했다. AtomicInteger는 멀티스레드 환경에서도 원자성을 보장하는 정수 값을 제공한다. 이 클래스의 incrementAndGet() 메서드를 사용하면 현재 값에서 1을 더한 후 결과값을 반환한다. 이 메서드는 연산 과정에서의 동시성 문제를 내부적으로 처리하여, 동일한 순간에 여러 스레드가 접근하더라도 각각 고유한 값을 얻을 수 있도록 해준다.
구현 과정
1. AtomicInteger 초기화
레시피 파일의 최대 파일 순서 값을 조회하여 AtomicInteger 인스턴스를 초기화한다. 이 값은 파일을 순차적으로 저장할 때 시작 지점으로 사용된다.
AtomicInteger currentMaxFileOrder = new AtomicInteger(recipePort.findMaxFileOrder(savedRecipeId));
2. 파일 저장 로직에 적용
파일을 저장할 때 currentMaxFileOrder.incrementAndGet()을 호출하여 파일의 순서를 결정한다. 이 방법을 통해 각 파일은 고유한 순서 값을 가지며, 동시에 여러 파일이 업로드되어도 순서가 중복되지 않는다.
List<RecipeFile> recipeFileList = files.stream().map(file -> {
return imageS3Service.createRecipeFile(file, savedRecipeId, currentMaxFileOrder.incrementAndGet());
}).collect(Collectors.toList());
결론
AtomicInteger의 incrementAndGet() 메서드를 활용하여 멀티스레드 환경에서 발생하는 파일 저장 순서 문제를 해결할 수 있었다. 이 방법은 파일 업로드뿐만 아니라 다른 순차적 작업을 처리할 때도 유용하게 사용될 수 있다. Java에서 제공하는 동시성 유틸리티를 적절히 활용하면, 복잡한 동기화 문제도 간단하고 효율적으로 해결할 수 있다는 것을 다시 한번 확인할 수 있었다.
QueryDSL 사용 시 자동 업데이트 되지 않는 JPA Auditing 수정 날짜 문제 해결 방법
📣 이 글은 내가 소속된 Team Chillwave에서 진행한 사이드 프로젝트에서 경험한 내용을 정리한 것이다.
다른 팀원인 "개발자의 서랍" 님의 블로그도 방문하면 도움이 될 것 같다 :)
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
폴링(Polling) 사용해서 CompletableFuture 결과 확인하기 (0) | 2024.02.07 |
---|---|
CompletableFuture를 활용한 비동기 메일 전송 구현 (1) | 2024.02.06 |
[JAVA] 코드 최적화를 위한 매직 상수 사용법 (4) | 2023.12.31 |
[JAVA] 자바 인터페이스에서 public과 private 접근 제한자 활용하기 (3) | 2023.12.24 |
[JAVA] 람다 표현식에서 final 변수나 effectively final 변수를 사용해야 하는 이유 (0) | 2023.12.01 |