현재 재직중인 곳에서는 일마감/월마감이 존재합니다. 업무 인수인계를 받고 배치라는 것을 처음 접해봤는데, 배치 중에서도 chunk batch형태로 돌더라구요. Springboot를 공부하면서 접해보지 못했던 것이라..Spring batch에 대해 한 번 정리해보면서 이해해보겠습니다.
배치(Batch)는 일괄처리라는 뜻을 가집니다.
매일 하루에 1번, 전날의 데이터를 집계해야 하는 상황이라면?
기본적인 Spring MVC 패턴에서 규모가 큰 전날의 데이터를 Read/Process/Write하는 과정거친다고 가정해봅시다. 이런 패턴에서는 순식간에 CPU자원을 써버려서 다른 Request처리를 하지 못하게 됩니다.(물론 이런 작업은 사용자 사용시간이 적은 새벽시간을 이용하겠지만요!) 그럼에도 해당 과정을 위한 API도 구성해야 하는 불편함이 존재합니다.
이를 해결하기 위해 배치를 사용합니다.
Spring batch는 Spring의 특성을 같이 가져갑니다. (*DI, AOP, 추상화 등)
여기서 더해서 Chunk가 붙었는데요, Chunk란 Spring Batch 프로세스에서 (ItemReader -> ItemProcessor -> ItemWriter)과정에서 한 번에 커밋되는 작업 단위(=트랜잭션의 단위)를 말합니다. 결과적으로 DB에 저장되는(Write) 사이즈는 Chunk사이즈이겠죠!
프로세스 별로 자세히 알아보면
여기서 중요한 것은
Reader와 Processor에서는 1건씩 다뤄지고, Writer에선 Chunk 단위로 처리된다는 것입니다.
코드로 chunkSize를 묶어서 처리하는 것을 간단히 보면 다음과 같이 쓸 수 있습니다.
for(int i=0; i<totalSize; i+=chunkSize){ // 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);
}