The Domain Language of Batch

숭맹이·2025년 4월 25일
0

🔧 Spring Batch 핵심 개념

Job

  • 정의: 전체 배치 작업을 의미하는 컨테이너
  • 구성: 하나 이상의 Step으로 구성됨
  • 설정: Java DSL 또는 XML 설정 가능
@Bean
public Job sampleJob(JobRepository jobRepository) {
    return new JobBuilder("sampleJob", jobRepository)
            .start(step1())
            .next(step2())
            .build();
}

🧱 실행 단위와 흐름

JobInstance

  • Job 정의 + 식별자(JobParameters)
  • 동일한 Job 정의라도 다른 파라미터로 실행되면 새로운 JobInstance 생성

JobParameters

  • JobInstance를 유일하게 식별하는 파라미터 집합
  • 날짜, 버전, ID 등 비즈니스 키 포함 가능

JobExecution

  • 하나의 JobInstance 실행 시도 (성공/실패 관계없이 1회 실행)
  • 재시도 시 새로운 JobExecution 생성됨

Step

  • Job을 구성하는 단위 실행 블록
  • 독립적으로 구성 가능
  • ItemReader, ItemProcessor, ItemWriter를 조합

StepExecution

  • Step의 실행 이력 단위
  • JobExecution과 매핑됨

ExecutionContext

  • JobExecution 또는 StepExecution에 종속된 상태 저장소
  • 직렬화 가능해야 하며, 재시작 시 상태 복구에 사용됨
ExecutionContext ec = stepExecution.getExecutionContext();
ec.putLong("linesRead", 40321L);

📦 처리 구성요소

ItemReader

  • 입력 데이터 소스로부터 데이터를 읽는 컴포넌트
  • null 반환 시 더 이상 읽을 데이터가 없음을 의미

ItemProcessor

  • 비즈니스 로직을 수행하는 처리 컴포넌트
  • 유효하지 않은 데이터는 null 반환으로 필터링 가능

ItemWriter

  • 처리된 데이터를 출력하는 컴포넌트

🗃️ 메타데이터 저장 구조

Spring Batch는 실행 이력을 아래와 같은 테이블에 저장합니다:

  • BATCH_JOB_INSTANCE: Job 이름 및 파라미터
  • BATCH_JOB_EXECUTION: Job 실행 정보 (상태, 시작/종료 시간 등)
  • BATCH_STEP_EXECUTION: Step 실행 정보
  • BATCH_EXECUTION_CONTEXT: 상태 정보

🧪 예제 시나리오로 이해하기

  1. EndOfDayJob을 01-01에 실행 → 실패
  2. 01-01 동일 파라미터로 재실행 → 성공
  3. 01-02 파라미터로 실행 → 성공

→ JobInstance는 2개, JobExecution은 3개 생성됨


⚙️ Java 기반 설정 시 참고

@Configuration
@EnableBatchProcessing
public class BatchConfig {

    @Bean
    public JobLauncher jobLauncher(JobRepository jobRepository) {
        return new SimpleJobLauncher(jobRepository);
    }

    @Bean
    public Step sampleStep() {
        return stepBuilderFactory.get("sampleStep")
            .<Input, Output>chunk(10)
            .reader(reader())
            .processor(processor())
            .writer(writer())
            .build();
    }

    // reader(), processor(), writer() 구현 생략
}

✅ 실무에서 얻는 이점

장점설명
책임 분리각 컴포넌트가 단일 책임을 갖도록 분리되어 있음
확장성커스텀 구현이 용이함 (예: 커스텀 ItemReader)
재시작 가능성실패한 지점에서의 복구를 자동으로 처리 가능
표준화명확한 실행 흐름과 메타데이터 관리로 운영이 수월함
profile
👨🏻‍💻 Backend Developer

0개의 댓글