Spring Batch에 대해 공부하면서 플로우에 대해 이해는 했지만, Batch와 Scheduler와의 개념이 모호하게 다가와 둘의 차이에 대해 간략하게 알아보고 Spring batch의 동작 방식에 대해 정리해보려고 한다.
일괄처리
의 의미를 가지며, 사용자와 상호작용 없이 여러 개의 작업을 미리 정해진 순서에 따라 중단 없이 처리하는 것
시간할당
의 의미를 가지며, 특정한 시간에 등록한 작업을 자동으로 실행시키는 것
정리하자면, 특정 시간에 데이터를 전송하는 것을 예약하는 기능은 Scheduler를 통해 이뤄지고, 해당 전송 요청을 일괄적으로 처리해주는 것은 Batch를 통해 이루어진다.
Spring Batch는 엔터프라이즈 시스템의 운영에 있어 대용량 일괄처리의 편의를 위해 설계된 가볍고 포괄적인 배치 프레임워크다.
Spring Batch의 계층 구조는 아래와 같이 설계되어 있기 때문에 Application 계층의 비즈니스 로직에 집중할 수 있고, 배치의 동작과 관련된 것은 Batch Core에 있는 클래스들을 이용하여 제어할 수 있다.
일반적으로 스프링 배치는 대용량 데이터를 다루는 경우가 많기 때문에 Tasklet보다 상대적으로 트랜잭션의 단위를 짧게 하여 처리할 수 있는 ItemReader, ItemProcessor, ItemWriter를 이용한 Chunk 지향 프로세싱을 이용한다.
Chunk 기반 Step은 위의 그림과 같이 ItemReader, ItemProcessor, ItemWriter라는 3개의 주요 부분으로 구성되며, ItemReader와 ItemProcessor에서 데이터는 1건씩 다뤄지고, Writer에선 Chunk 단위로 처리된다.
위의 과정을 코드를 통해 나타내면 아래와 같다
for(int i=0; i<totalSize; i+=chunkSize){
List items = new Arraylist();
for(int j = 0; j < chunkSize; j++){
Object item = itemReader.read()
Object processedItem = itemProcessor.process(item);
items.add(processedItem);
}
itemWriter.write(items);
}
Spring Batch에는 다양한 ItemReader와 ItemWriter가 존재한다.
대용량 배치 처리를 하게 되면 Item을 읽어 올 때 Paging 처리를 하는게 효과적이기 때문에 Spring Batch Reader에서는 지원하는 Paging 처리를 대체로 이용한다. 또한 적절한 Paging처리와 Chunk Size(한번에 처리 될 트랜잭션)를 설정하여 더욱 효과적인 배치 처리를 할 수 있다.
Chunk Size는 한번에 처리될 트랜잭션 단위
를 얘기하며,
Page Size는 한번에 조회할 Item의 양
을 의미한다.
chunk size 가 100이고 page size가 10일 경우 10번의 쿼리가 실행되게 된다. 이때 JpaPagingItemReader를 사용하게 되는데, 해당 클래스는 페이지를 읽을 때 트랜잭션을 초기화 한다.
Spring Batch chunk 기반 방식은 chunk 단위로 reader에서 processor로 전달되기에 100개를 채워야만 processor로 데이터가 전달된다는 특징이 있어 마지막 조회를 제외한 9번의 조회결과들의 세션이 종료가 되어 문제가 발생하게 되는 것이다.
*JpaPagingItemReader의 상위 클래스인 AbstractPagingItemReader 에서는 page size가 기본 10으로 설정되어 있음
또한 한번의 트랜잭션 처리를 위해 10번의 쿼리 조회가 발생하기 때문에 성능상 이슈가 발생할 수 있다. 그래서 Spring Batch의 PagingItemReader의 공식문서에 아래와 같은 내용을 담고 있다.
따라서 구현 시에는 chunk size와 page size를 일치시켜주는 것이 좋다.