본문 바로가기

트러블슈팅

[Java] 비동기 상황에서는 ArrayList가 아닌 ConcurrentLinkedQueue

회사에서 데이터 마이그레이션을 했는데요.

데이터 양이 몇십만건 수준으로 많지 않고 일정에 대한 압박이 있기 때문에

공수 최소화를 위해 기존 애플리케이션에 별도 Interface를 만들고 이를 활용하기로 했습니다.

 

빠른 마이그레이션을 위해 데이터를 적절한 단위로(서로 동시성 이슈가 없게) 나누어 병렬로 실행했는데요.

이 과정에서 놓쳤던 것이 여러 쓰레드의 데이터를 합칠 때 ArrayList를 사용했던 것입니다.

 

처음에는 동기 방식으로 코드를 작성했다 보니 ArrayList를 사용했고

이 것이 비동기 방식으로 바뀐 다음에도 남아 있었습니다.

 

아니나 다를까 작업 후 소량의 데이터로 마이그레이션 하고 정합성을 확인하는 과정에서 비는 데이터들이 발견되었습니다.

 

다행히 자료구조와 동시성 이슈에 대해 인지하고 있었기 때문에 ArrayList가 문제되는 것을 쉽게 찾을 수 있었고

간단하게 ConcurrentLinkedQueue를 사용하여 해결하였습니다.

 

java.util.concurrent 패키지를 보면 ConcurrentLinkedQueue외에도 ConcurrentHashMap 등의 동시성을 지원하는 자료구조들이 있는데요.

 

이 자료구조들을 활용하면 직접 동기화(syncronized) 처리를 구현하지 않고도 쉽게 관련 이슈들을 해결할 수 있습니다.