[Spring] Spring Batch: 대용량 배치 처리의 핵심 프레임워크

박상민·2025년 7월 1일

Spring

목록 보기
12/12
post-thumbnail

Spring Batch란?

Spring Batch는 대용량 데이터를 효율적으로 처리하기 위한 배치 처리 프레임워크이다.
주기적으로 반복되는 작업(예: 통계 계산, 로그 분석, DB 정리 등)을 안정적으로 실행하고, 실패 복구 및 재시작 기능까지 제공합니다.

대량의 데이터를 "읽고 -> 가공하고 -> 저장하는" 흐름을 체계적으로 관리할 수 있게 도와주는 틀입니다.


언제 사용할까?

  • 매일 자정에 주문 데이터 정산
  • 100만 건 이상의 로그를 DB에 저장
  • CSV 파일을 읽어 데이터베이스에 이관
  • 사용자 가입 내역을 분석해 레포트 생성

Spring Batch의 기본 구조

Job: 전체 배치 작업의 단위

  • 하나의 Job은 여러 Step으로 구성

Step: Job 안의 실행 단위

ItemReader: 데이터 입력

  • CSV, DB, XML, API 등에서 데이터를 읽어옴

ItemProcessor (선택): 데이터 가공

  • 필터링, 변환, 유효성 검사 등 수행

ItemWriter: 데이터 출력

  • DB 저장, 파일 쓰기 등 출력 작업

청크 기반 처리

Spring Batch는 데이터를 청크(chunk) 단위로 처리한다.

예를 들어:

  • 청크 크기: 10
  • 10건의 데이터를 읽고 -> 처리하고 -> 저장
  • 하나의 청크는 트랜잭션 단위로 관리 (중간 실패 시 전체 청크 롤백)
[읽기] 10건 -> [가공] 10건 -> [저장] 10건 (커밋)

예시 코드

@Bean
public Job exampleJob(JobBuilderFactory jobBuilderFactory, Step step) {
    return jobBuilderFactory.get("exampleJob")
        .start(step)
        .build();
}

@Bean
public Step step(StepBuilderFactory stepBuilderFactory,
                 ItemReader<MyItem> reader,
                 ItemProcessor<MyItem, MyItem> processor,
                 ItemWriter<MyItem> writer) {
    return stepBuilderFactory.get("step")
        .<MyItem, MyItem>chunk(10)
        .reader(reader)
        .processor(processor)
        .writer(writer)
        .build();
}

스케줄링과 연동

Spring Batch 자체에는 스케줄링 기능이 없지만, 아래 도구들과 함께 사용 가능

  • @@cheduled (Spring Scheduler)
  • Quartz
  • cron (리눅스 기반)

트랜잭션 & 예외 처리

  • 트랜잭션은 청크 단위로 관리
  • 예외가 발생하면 해당 청크 전체가 롤백
  • skip, retry, listener 등을 통해 예외 상황에 유연하게 대응 가능

주의 사항

  • 청크 사이즈 조절: 너무 작으면 느리고, 너무 크면 메모리 부담 -> 서비스에 맞는 적당한 청크 사이즈 조절 필요
  • 로깅 필수: 처리된 건수, 실패 건수, 소요 시간 로그를 남기는 것을 추천
  • JobParameter 사용: 동일 Job을 반복 실행하려면 유니크한 파라미터 필요 (ex. UUID)
  • 병렬 처리 고려: 대용량 데이터는 TaskExecutor, Partitioner, Multi-threaded Step으로 병렬화 가능

0개의 댓글