본문으로 건너뛰기
Advertisement

15.1 단위/청크(Chunk) 기반 Spring Batch 아키텍처

Spring Batch는 대용량 데이터를 정해진 시간에 일괄 처리하는 배치 작업(예: 월말 정산, 대규모 CSV 파일 파싱, 이메일 대량 발송)을 구조화된 방식으로 처리합니다.

1. 핵심 아키텍처 개요

Spring Batch의 전체 흐름은 Job → Step → Chunk(Read → Process → Write) 구조로 이루어집니다.

Job
└── Step 1: 청크 기반 처리
│ └── [chunk=1000]
│ ├── ItemReader : DB/파일에서 1000건씩 읽기
│ ├── ItemProcessor : 각 아이템 변환/필터링
│ └── ItemWriter : DB/파일에 1000건씩 쓰기
└── Step 2: Tasklet 기반 처리 (단순 실행 로직)
  • Job: 배치 작업 전체 단위. 유일하게 식별되는 이름을 가집니다.
  • Step: Job 안에서 실제 처리를 담당하는 단계.
  • Chunk-Oriented Processing: 데이터를 n건(chunk)씩 묶어 읽고, 처리하고, 쓰는 3단계 트랜잭션 구조. 청크 단위로 트랜잭션을 커밋하므로 수백만 건 중 일부가 실패해도 앞서 성공한 청크는 보호됩니다.

2. 기본 설정 및 JobRepository

implementation 'org.springframework.boot:spring-boot-starter-batch'

Spring Batch는 Job 실행 이력(성공/실패/재시작 정보)을 별도의 메타데이터 테이블(JobRepository)에 DB로 자동 기록합니다. 스프링 부트가 자동으로 테이블을 생성해 줍니다(spring.batch.jdbc.initialize-schema: always).

spring:
batch:
jdbc:
initialize-schema: always # 최초 실행 시 메타데이터 테이블 자동 생성
job:
enabled: false # 앱 시작 시 자동 실행 방지 (스케줄러나 API로 수동 트리거 권장)

3. Tasklet을 이용한 단순 Step

청크 처리가 아닌 단순한 로직(예: 임시 파일 삭제, 알림 전송) 하나를 담을 때 Tasklet 인터페이스를 씁니다.

@Component
public class CleanupTasklet implements Tasklet {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) {
log.info("임시 파일 정리 작업 실행...");
// 임시 파일 삭제 로직
return RepeatStatus.FINISHED; // 정상 완료 (CONTINUABLE이면 반복 실행)
}
}
Advertisement