안녕하세요.
Spring Batch에서 Step을 구현할 때 가장 먼저 마주치는 갈림길이 있습니다.
“Tasklet으로 만들까? 아니면 Chunk로 만들까?”
이 둘의 차이를 명확히 모르고 무작정 코드를 짜면, 나중에 구조를 다 뜯어고쳐야 하는 불상사가 생깁니다. 오늘은 두 방식의 차이점과 사용 시나리오를 명쾌하게 정리해 드립니다.

1. Chunk 방식 (Chunk-oriented Processing)
앞선 포스팅에서 자세히 다뤘듯이, “읽기(Reader) -> 가공(Processor) -> 쓰기(Writer)”의 정형화된 패턴을 가집니다.
- 특징: 데이터를 일정 단위(Chunk)로 끊어서 반복 처리합니다.
- 장점: 대용량 데이터 처리에 최적화되어 있으며, 트랜잭션 관리가 자동화됩니다.
- 사용 시나리오:
- DB에 있는 100만 명 회원 등급을 조정할 때
- 대용량 로그 파일을 읽어 통계 테이블에 적재할 때
- 데이터 마이그레이션
2. Tasklet 방식 (Tasklet Implementation)
Tasklet은 “단일 작업”을 수행하기 위한 방식입니다. Reader/Processor/Writer 구조 없이, execute 메서드 하나에서 모든 로직을 수행합니다.
- 특징: 자유도가 높고 구조가 단순합니다. 한 번 실행하고 끝납니다(RepeatStatus.FINISHED).
- 장점: 복잡한 설정 없이 간단한 로직을 빠르게 구현할 수 있습니다.
- 사용 시나리오:
- 배치 작업 전후로 파일을 삭제하거나 이동할 때
- 단순히 Stored Procedure 하나만 호출하면 될 때
- 배치 완료 알림 이메일을 전송할 때
- 데이터 양이 매우 적어서 굳이 Chunk로 나눌 필요가 없을 때
3. 코드 비교
Chunk 방식 코드
// Reader -> Processor -> Writer 구조가 명확함
return new StepBuilder("chunkStep", jobRepository)
.<Input, Output>chunk(100, transactionManager)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
Tasklet 방식 코드
// 하나의 람다식(또는 클래스) 안에서 자유롭게 구현
return new StepBuilder("taskletStep", jobRepository)
.tasklet((contribution, chunkContext) -> {
// 1. 파일 삭제 로직
File file = new File("temp.txt");
file.delete();
// 2. 로그 남기기
log.info("임시 파일 삭제 완료");
return RepeatStatus.FINISHED; // 종료 신호
}, transactionManager)
.build();
4. 결정 가이드 (Decision Matrix)

| 상황 | 추천 방식 | 이유 |
|---|---|---|
| 대용량 데이터(DB, 파일) 처리 | Chunk | 메모리 효율, 트랜잭션 관리 필수 |
| 단순 파일 조작 (삭제, 이동) | Tasklet | 데이터 입출력(I/O) 흐름이 없음 |
| 외부 API 호출 (단발성) | Tasklet | 1회성 호출에 Reader/Writer는 과함 |
| 복잡한 로직의 데이터 처리 | Chunk | 로직 분리(Processor)가 유리함 |
| 프로시저(Procedure) 호출 | Tasklet | 프로시저 자체가 일괄 처리 수행 |
5. 결론
“데이터가 흐르는가? 아니면 단순 동작인가?”를 생각하세요.
- 데이터가 물처럼 흘러가며 변환되고 저장된다면 Chunk가 정답입니다.
- 단순히 문을 닫거나, 스위치를 켜는 단발성 동작이라면 Tasklet이 정답입니다.
이 기준만 확실히 잡으셔도 배치 설계가 훨씬 깔끔해질 것입니다. Spring Batch는 이 두 가지 도구를 적재적소에 활용할 때 가장 빛을 발합니다.






