[SpringBatch] AbstractPagingItemReader 와 CopyOnWriteArrayList

Cho-D-YoungRae·2023년 5월 30일
0
post-thumbnail

인턴 근무를 할 때 팀에서 사용하던 페이징을 하는 ItemReader 가 AbstractPagingItemReader 를 구현하지 않았었던 것을 발견했습니다. AbstractPagingItemReader 를 구현하도록 개선하기 위해 이를 구현한 다른 클래스를 참고하던 중 CopyOnWriteArrayList 를 사용하는 것을 봤습니다. 이것에 대해서 정리해보려 합니다.

AbstractPagingItemReader 장점

  • Step이 예외 상황 등으로 중지된 후 해당 Step이 재실행 되었을때, 중지되었을 시점의 item부터 읽을 수 있도록 해줌
  • 페이지를 읽는 부분만 구현하면 나머지는 상위 클래스에 구현되어있음
  • Step이 멀티쓰레드 환경에서 실행될 때 쓰레드 안정성을 보장하도록 구현하기 좋음
    • 여기서 말하는 멀티쓰레드 환경은 여러 개의 Job이 실행되는 상황(같은 ItemReader 사용)이 아니라 1개의 Job 내에서의 멀티쓰레드입니다.
    • 여러 개의 Job이 실행되는 상황에서는 @StepScope 를 구현해서 Job마다, Step마다 별도의 ItemReader가 생성되도록 해야합니다.

AbstractPagingItemReader 에서 CopyOnWriteArrayList

AbstractPagingItemReader 를 살펴보면 synchronized 를 통해서 상태값들에 접근하는 코드에 대해서 동기화를 해주고 있습니다. 이것으로 충분할까요?

위 코드는 JpaPagingItemReader의 doReadPage 메서드 일부입니다. results 를 보면 CopyOnWriteArrayList 인 것을 볼 수 있는데요.
AbstractPagingItemReader 에서 results 는 읽어들인 데이터, item 들이 담기는 리스트입니다. 이는 여러 스레드에서 접근되기 때문에 쓰레드에 안전하지 않은 ArrayList가 아니라 쓰레드에 안전한 CopyOnWriteArrayList 를 사용해야 합니다.

0개의 댓글