Spring Batch Tasklet vs Chunk 방식 비교: 언제 무엇을 써야 할까?

안녕하세요.

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 호출 (단발성)Tasklet1회성 호출에 Reader/Writer는 과함
복잡한 로직의 데이터 처리Chunk로직 분리(Processor)가 유리함
프로시저(Procedure) 호출Tasklet프로시저 자체가 일괄 처리 수행

5. 결론

“데이터가 흐르는가? 아니면 단순 동작인가?”를 생각하세요.

  • 데이터가 물처럼 흘러가며 변환되고 저장된다면 Chunk가 정답입니다.
  • 단순히 문을 닫거나, 스위치를 켜는 단발성 동작이라면 Tasklet이 정답입니다.

이 기준만 확실히 잡으셔도 배치 설계가 훨씬 깔끔해질 것입니다. Spring Batch는 이 두 가지 도구를 적재적소에 활용할 때 가장 빛을 발합니다.

관련 글 보기