Chunk Processing의 필요성
Batch 프로세싱의 가장 큰 특징이 일괄 처리이면서 동시에 가장 큰 문제가 일괄 처리이다. 일괄로 한번에 데이터를 처리한다는 것은 시스템의 리소스가 한순간에 많이 필요하다는 것을 말한다. 포인트 관리 배치 프로그램이 있는데 오늘 만료 시켜야 할 포인트가 십만개라면 어떨까? 서비스가 대성공해서 백만개, 천만개라면 어떨까? 그 어떤 서버도 한번에 천만개를 처리하기 쉽지 않을 것이다. 이를 해결하기 위해서 Spring Batch에서는 Chunk라는 개념을 만들었다. Chunk는 일정 개수만큼 잘라서 처리하겠다는 의미로, Chunk Size가 1000이면 한번에 1000개씩 처리하고 완료하고 그 다음 1000개 처리하고 완료하겠다는 의미이다. 이렇게 하면 한순간에는 1000개에 해당하는 리소스만 있으면 된다.
일반적인 Chunk 기반 Step 흐름
- 1 → 트랜잭션 시작
- 2 → ItemReader가 데이터 1개 제공하기
- 3 → ItemProcessor를 통해 데이터 1개를 가공하기
- 4 → Chunk Size만큼 데이터가 쌓일때까지 2-3번을 반복
- 5 → ItemWriter에게 데이터 전달하기 (보통의 경우, DB에 저장)
- 6 → 트랜잭션 종료
- 7 → 2번이 더이상 진행할 수 없을때까지, 1-6번을 계속해서 반복
ChunkProcessing 구현방법
Step을 Chunk방식으로 구현하기 위해서는 다음과 같이 <A, B>chunk(...)를 사용하면 된다.
@Bean
@JobScope
public Step saveOrderedPriceStep(JobRepository jobRepository,
PlatformTransactionManager transactionManager,
JpaPagingItemReader<Order> orderReader,
ItemProcessor<Order, Price> orderToPriceProcessor,
ItemWriter<Price> priceWriter) {
return new StepBuilder("saveOrderedPriceStep", jobRepository)
.<Order, Price>chunk(1000, transactionManager)
.reader(orderReader)
.processor(orderToPriceProcessor)
.writer(priceWriter)
.build();
}
- Chunk Processing을 구현할 때는, ItemReader, ItemWriter만 필수이고 ItemProcessor는 필요없다면 없어도 된다.
- 그리고 ItemReader<T>, ItemProcessor<T, G>, ItemWriter<T>는 <T,G>chunk(...) 형식이 맞아야 한다.
그럼 Chunk Size는 얼마가 적당할까?
정답은 없다. 업무의 종류, 코드의 로직, 환경등에 따라 다르다. Chunk Size가 너무 작으면, 일괄처리 효율이 떨어지고, 또 반대로 Chunk Size가 너무 커도 리소스 문제나 처리량의 한계 등 문제가 있을 수 있다. 적당한 크기의 사이즈를 찾는것도 Batch 성능에 큰 도움이 된다.
다시 보는 StepExecutionContext
StepExecutionContext를 사용하면, 1개의 Step안에서 공유하는 공간을 만들 수 있다고 했다. 즉, 1개의 Step안에 있는 ItemReader, ItemProcessor, ItemWriter가 같은 공간을 접근할 수 있다.
다시 보는 PlatformTransactionManager
@EnableBatchProcessing을 달면, 기본 트랜잭션 매니저를 가져올 수 있고 이걸 StepBuilder에서 등록할 수 있다고 했다. 이 트랜잭션 매니저를 StepBuilder에서 사용하게 되면 1개 Chunk 단위로 트랜잭션이 생기게 된다. 따라서 1개 Chunk가 끝나면 일괄적으로 트랜잭션이 끝나게 되고 ItemWriter에서 저장한 모든 대상들의 Commit은 Chunk가 끝나면 발생한다.
정리를 하자면
Chunk Processing에 대해 알아보았다. 정해진 크기만큼 쪼개서 여러번 일괄처리를 하는 방법이다. 이제는 그 방법을 사용하기 위한 ItemReader, ItemProcessor, ItemWriter에 대해 알아보자!
'Spring Batch' 카테고리의 다른 글
ItemProcessor (2) | 2024.10.09 |
---|---|
ItemReader (1) | 2024.10.09 |
Tasklet (0) | 2024.10.09 |
Step (2) | 2024.10.09 |
Job (7) | 2024.10.09 |