Spring Batch 기본 개념

Spring Batch Docs 번역&공부
정찬's avatar
May 29, 2025
Spring Batch 기본 개념
 
목차

Spring Batch Architecture

 
notion image
 
 
Spring Batch는 세개의 계층형 구조를 이루고 있다.
  1. Application
    1. Spring Batch를 사용하는 개발자가 작성한 모든 배치 작업과 커스텀 코드가 포함된다.
  1. Batch Core
    1. 배치 작업을 실행하고 제어하는 데 필요한 핵심 런타임 클래스가 포함된다. e.g) JobLauncher, Job, Step
  1. Batch Infrastructure
    1. Application, Batch Core는 모두 공통 인프라를 기반을 구축된다. 이 인프라에는 readers, writers, services (RetryTemplate)를 포함한다.
 

The Domain Language of Batch

 
notion image
 
 
위 다이어그램은 배치 참조 아키텍처를 단순화한 버전이다.
한개의 Job은 Step과 일대다 관계이다. 각각의 Step은 하나의 ItemReader, ItemProcessor, ItemWriter를 가진다. Job은 JobLauncher를 사용하여 시작되어야 하며, 현재 실행 중인 프로세스에 대한 메타데이터는 JobRepository에 저장된다.

Job

 
notion image
 
 
  • 전체 배치 프로세스를 캡슐화하는 엔티티
  • Job은 위 다이어그램과 같이 전체 계층 구조의 최상위에 위치
  • Spring Batch에서, Job은 Step 객체들의 경량화된 컨테이너
  • 논리적으로 하나의 흐름에 속하는 여러 Steps를 결합하고, 모든 Steps에 적용되는 속성을 설정할 수 있다
  • Job의 구성
    • Job 이름
    • 정의, Step 객체들의 순서
    • Job의 재시작 여부
 

Job Configuration

 
Spring Batch에서, 기본적으로 Job interface의 구현체인 SimpleJob 클래스를 제공한다. Java 기반의 설정을 사용하려면, 아래와 같이 JobBuilder를 사용해 Job 객체를 생성할 수 있다.
 
@Bean public Job footballJob(JobRepository jobRepository) { return new JobBuilder("footballJob", jobRepository) .start(playerLoad()) .next(gameLoad()) .next(playerSummarization()) .build(); }
 

JobInstance

 
  • JobInstance는 논리적 작업 실행의 개념을 나타낸다
    • 예를 들어 EndOfDay job이 있을 때, 하루에 하나의 논리적인 JobInstance가 존재한다. 각각의 JobInstance는 여러 번의 JobExcution을 가질 수 있다.
  • JobInstance의 정의는 로드할 데이터와 관련이 없다
    • 데이터를 로드하는 것은 ItemReader에서 결정한다.
  • 동일한 JobInstance를 사용하면, 중단한 곳에서 시작한다. 반대로, 새 인스턴스를 사용하면 처음부터 시작한다. 이는 뒤에서 더 자세하게 설명하겠다.
 

JobParameters

 
  • JobParameter들은 Job과 JobInstance를 구별한다
    • JobInstance = Job + JobPrameters(식별)
  • JobParameters 객체는 배치 작업을 시작하는 데 사용되는 매개변수 집합을 보유한다
 

JobExecution

 
  • JobExecution은 작업 실행을 위한 ‘단일’ 시도라는 기술적 의미가 있다
  • JobInstance는 여러 번의 JobExcution을 가질 수 있다.
  • JobExcution은 실행 중 실제로 발생한 일을 저장하는 저장 메커니즘이다. 따라서 JobExcution의 속성을 보면, 메타데이터의 성격을 가지고 있다.
  • JobExcution 속성:
    • Status
      • 실행 상태를 나타내는 객체. 상태의 종류로는 STARTED, FAILED, COMPLETED가 있다.
    • startTime
      • 작업이 시작된 시간. 만약 작업이 시작되지 않은 경우 이 필드는 비어있다.
    • endTime
      • 실행이 완료된 시간. 만약 작업이 완료되지 않은 경우 이 필드는 비어있다.
    • exitStatus
      • 실행 결과를 나타내는 필드. 만약 작업이 완료되지 않은 경우 이 필드는 비어있다.
    • createTime
      • 생성된 시간
    • lastUpdated
      • JobExcution이 마지막으로 업데이트 된 시간. 만약 작업이 시작되지 않은 경우 이 필드는 비어있다.
    • executionContext
      • 실행 간 유지되어야 하는 문맥 정보
    • failureExceptions
      • 실행 중 발생한 예외 목록들을 저장한다
 

Step

 
notion image
 
  • Step은 배치 작업의 독립적이고 순차적인 단계를 캡슐화하는 도메인이다
  • 모든 Job은 하나 이상의 Step으로 구성된다
 

Step Execution

 
  • StepExecution은 Step의 ‘단일’ 시도라는 기술적 의미를 가진다
  • 이전 Step이 실패하여 실행에 실패했을 때, 해당 단계의 실행은 유지되지 않는다
    • JobExecution은 이전 JobExecution이 실패했을 때, JobRepository에 저장된 메타데이터를 기반으로 이전에 실패한 Job을 재시작할 수 있다. 이 때 실패한 Step부터 다시 시작된다. 하지만 StepExecution이 실패했을 경우에는 Job 전체를 재시작해야 한다.
 

Execution Context

 
  • ExecutionContext는 프레임워크에 의해 유지되고 제어되는 키/값 쌍의 모음을 나타내며, 개발자에게 객체 또는 상태를 저장할 수 있는 공간을 제공한다
  • 대표적으로 재시작을 용이하게 하는 역할을 한다
    • 만약 Job 실행 중 치명적인 오류가 발생했을 때 컨텍스트에 저장된 메타데이터를 통해 작업의 경과를 확인하고, 나머지 작업을 처리한다
  • JobExecution에 최소 하나의 ExecutionContext가 존재한다
 

Job Repository

 
  • JobRepository는 앞서 언급된 모든 도메인에 대한 지속성 메커니즘이다
  • JobLauncher, Job, Step 구현에 대한 CRUD 작업을 제공한다
 

Job Launcher

 
  • jobLuancher는 Job을 주어진 집합으로 실행하기 위한 간단한 인터페이스이다
 
public interface JobLauncher { public JobExecution run(Job job, JobParameters jobParameters) throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException; }
 
 

Reference

 
Share article

lushlife99