Spring Batch는 대량의 데이터를 처리하기 위한 프레임워크로, 다양한 방식으로 작업을 정의할 수 있습니다. 그 중 하나가 바로 Tasklet 기반의 처리입니다.
Tasklet은 Spring Batch에서 단일 작업 단위를 수행하는 인터페이스입니다. 말 그대로 하나의 작업(Task) 을 수행하는 구성 요소이며, 반복적인 처리를 수행하기보다는 단순하거나 명확한 목적을 가진 작업에 적합합니다.
public interface Tasklet {
RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception;
}
Tasklet은 주로 다음과 같은 상황에서 사용됩니다:
아래는 간단한 Tasklet 구현 예제입니다. 이 Tasklet은 로그를 출력하고 작업을 완료합니다.
@Component
public class SimpleTasklet implements Tasklet {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("Tasklet 실행 중!");
return RepeatStatus.FINISHED;
}
}
이후, Step과 Job에 등록해서 사용할 수 있습니다.
@Bean
public Step taskletStep() {
return stepBuilderFactory.get("taskletStep")
.tasklet(simpleTasklet)
.build();
}
RepeatStatus는 Tasklet이 작업을 반복할지 여부를 결정하는 enum입니다.
예를 들어, 무한 루프나 조건 기반 반복이 필요할 경우 CONTINUABLE을 반환하고 내부에서 반복 조건을 제어할 수 있습니다.
Spring Batch에서 Tasklet은 기본적으로 Step 단위로 트랜잭션이 적용됩니다. 즉, Tasklet 내의 execute 메서드 전체가 하나의 트랜잭션으로 처리됩니다.
트랜잭션을 세밀하게 제어하려면 Step 설정 시 transactionManager를 커스터마이징하거나, Tasklet 내에서 명시적으로 트랜잭션 처리를 해줘야 할 수 있습니다.
Spring Batch는 대량 데이터를 효율적으로 처리하기 위해 Chunk 기반 처리 모델을 제공합니다. 이는 많은 데이터 처리 작업에서 가장 흔히 사용되는 방식이며, 대규모 데이터 배치에 최적화되어 있습니다.
Chunk는 “일정 단위의 데이터를 모아 한 번에 처리하는 방식” 입니다. 예를 들어, 1000개의 데이터를 10개씩 나눠서 처리한다고 하면, 이 “10개 단위”가 하나의 Chunk가 됩니다.
이 모델은 다음과 같은 구조로 구성됩니다:
[Read] → [Process] → [Write]
(Chunk 단위로 반복)
Chunk 기반 처리는 다음과 같은 순서로 진행됩니다:
1. ItemReader를 통해 데이터를 1건씩 읽고,
2. ItemProcessor로 읽은 데이터를 가공하고,
3. ItemWriter가 일정 개수(Chunk size)만큼 모아서 한 번에 저장합니다.
이 처리는 반복적으로 실행되며, 아래와 같은 순서로 진행됩니다:
for each chunk:
read item → process item → accumulate
...
when chunk is full:
write all items
public interface ItemReader<T> {
T read() throws Exception;
}
public interface ItemProcessor<I, O> {
O process(I item) throws Exception;
}
public interface ItemWriter<O> {
void write(List<? extends O> items) throws Exception;
}
Chunk 기반 처리는 아래와 같은 상황에서 매우 효과적입니다:
Step 시작
↓
[ItemReader] → item1
[ItemProcessor] → processedItem1
[ItemReader] → item2
[ItemProcessor] → processedItem2
...
Chunk Size 도달 (예: 10건)
↓
[ItemWriter] → List<processedItem1...10> 저장
↓
트랜잭션 커밋
↓
다음 Chunk 반복
## Chunk와 트랜잭션
Spring Batch는 Chunk 단위로 트랜잭션을 처리합니다. 즉, 하나의 Chunk가 읽기 → 처리 → 쓰기까지 모두 성공해야 커밋됩니다.
- 실패 시 해당 Chunk 전체가 롤백
- 트랜잭션 경계는 다음과 같습니다:
[Chunk 시작]
이 덕분에 부분 커밋 방지 및 데이터 정합성 보장이 가능해집니다.
주의사항:
- Chunk size가 너무 크면 메모리 사용량이 증가
- 너무 작으면 트랜잭션 오버헤드가 커짐 → 성능 저하 가능