본문 바로가기

Backend/Batch

[Batch] 1. Spring Batch 의 구조 및 개념

Spring Batch는 대용량 데이터를 효율적으로 처리하기 위한 배치(일괄 처리) 프레임워크다.

주기적으로 반복되는 작업(예: 데이터 정산, 통계 생성, 로그 정리 등)을 안정적으로 수행할 수 있게 해준다.

 

 

1.  배치(Batch)란?

Batch Processing은 일정한 주기로 대량의 데이터를 모아서 한 번에 처리하는 방식이다.

보통 다음과 같은 작업에 사용된다.

  • 매일 자정에 결제 데이터 정산
  • 뉴스/로그 수집 및 통계 생성
  • 외부 API에서 데이터 동기화
  • 백업, 이메일·알림 발송 등 정기 업무 자동화

실시간 시스템처럼 빠르게 응답을 주는 대신, 정확하고 안정적인 처리가 핵심이다.

 

 

 

 

2. Spring Batch 구조

Spring Batch는 세 가지 주요 단위로 구성된다 👇

✔️ 1) Job

  • 하나의 “배치 작업 단위”
  • 여러 Step을 포함할 수 있음
  • 예: “회원 데이터 정산 Job”, “결제 통계 Job”

✔️ 2) Step

  • Job 내부의 실행 단위
  • 실제 처리 로직이 들어있는 부분
  • ItemReaderItemProcessorItemWriter 로 구성됨

✔️ 3) Chunk (청크 단위 처리)

  • 데이터를 일정 개수(Chunk)로 나눠서 읽고, 처리하고, 쓰는 단위
  • 예: 1000건의 데이터를 100건씩 나누어 DB에 저장
  • 실패 시 해당 Chunk 단위로 롤백 가능

 

 

 3. 기본 동작 흐름

Job → Step → (Reader → Processor → Writer)

1. Reader: DB, CSV, API 등에서 데이터를 읽어옴

2. Processor: 비즈니스 로직 수행 (필터링, 가공 등)

3. Writer: 결과를 DB나 파일에 저장

 

💡 Spring Batch는 트랜잭션 관리가 자동으로 이루어져, 중간에 오류가 나도 안전하게 재시작 가능하다.

 

 

 

4. 예제 코드 (간단한 회원 데이터 처리)

@Bean
public Job userDataJob(JobRepository jobRepository, Step userDataStep) {
    return new JobBuilder("userDataJob", jobRepository)
            .start(userDataStep)
            .build();
}

@Bean
public Step userDataStep(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
    return new StepBuilder("userDataStep", jobRepository)
            .<User, ProcessedUser>chunk(100, transactionManager)
            .reader(userItemReader())
            .processor(userItemProcessor())
            .writer(userItemWriter())
            .build();
}

핵심 포인트

  • chunk(100) : 100건 단위로 트랜잭션 처리
  • reader(), processor(), writer() : 각 역할을 분리해 유지보수성 향상
  • 실패 시 해당 Chunk만 롤백됨

 

 

5. Spring Scheduler or Kafka 와 함께 쓰는 이유

실무에서는 Batch Job을 Spring SchedulerKafka Consumer와 함께 사용한다.

  • Scheduler → 특정 시간(매일 00시)에 Job 실행
  • Kafka → 이벤트가 발생했을 때 비동기적으로 Job 실행

예를 들어,

Kafka에서 “결제 완료 이벤트”가 오면 Batch Job이 실행되어 정산 데이터를 생성하는 식이다.