
위에서 Job을 코드로 정의해 봤습니다. 그렇다면 이 Job을 run하는 순간, 내부에서는 어떤 일이 벌어질까요? 지금부터는 Job 실행을 관리하는 핵심 컴포넌트들을 하나씩 살펴보겠습니다.
JobLauncher는 이름 그대로 Job을 실행하는 역할을 하는 인터페이스입니다. 클라이언트가 Job을 실행하기 위한 가장 기본적인 진입점입니다.
핵심 메서드: JobExecution run(Job job, JobParameters jobParameters)
동작 과정: run 메서드가 호출되면, JobLauncher는 전달받은 Job과 JobParameters를 JobRepository에 넘겨 유효한 JobExecution을 얻어온 뒤, Job의 execute() 메서드를 호출하여 실질적인 실행을 위임합니다.
주요 구현체:
TaskExecutorJobLauncher (Spring Batch 5 이전 SimpleJobLauncher): 내부적으로 TaskExecutor를 사용하여 Job을 비동기적으로 실행합니다. run 메서드는 Job의 실행을 요청한 뒤 즉시 JobExecution을 반환하므로, 호출 스레드가 블로킹되지 않습니다. 웹 요청으로 배치를 트리거하는 경우 등에 유용합니다.SyncTaskExecutor를 주입하여 구성할 수 있습니다.JobParameters는 Job을 실행할 때 외부에서 주입하는 파라미터들의 묶음(Map
JobInstance를 고유하게 식별하는 역할을 합니다. 동일한 Job이라도 JobParameters가 다르면 완전히 다른 JobInstance로 취급됩니다.String, Long, Double, Date 타입을 값으로 가질 수 있으며, Spring Batch 5부터는 java.time 패키지의 타입도 네이티브로 지원합니다.JobParametersIncrementer: 매번 다른 파라미터로 Job을 실행해야 할 때 유용합니다. 이 인터페이스를 Job에 등록하면, JobLauncher가 실행 시마다 기존 JobParameters를 기반으로 새로운 값을 자동으로 추가하여 JobInstance가 중복되지 않도록 보장합니다.RunIdIncrementer: JobParametersIncrementer의 가장 대표적인 구현체입니다. run.id라는 키(key)로 파라미터를 자동 추가하며, Job이 실행될 때마다 이전에 가장 높았던 run.id 값에 1을 더한 값을 사용합니다. 매일 동일한 조건으로 실행되어야 하지만, 실행 자체는 고유해야 하는 스케줄링 Job에 매우 유용합니다.JobRepository는 Spring Batch의 메타데이터를 관리하는 핵심 퍼시스턴스 컴포넌트입니다. 위에서 설명한 모든 컴포넌트들이 JobRepository를 통해 상태를 저장하고 조회합니다.
JobInstance, JobExecution, StepExecution 등 배치 실행에 관련된 모든 메타데이터의 CRUD(생성, 조회, 수정, 삭제)를 담당합니다.JobLauncher는 JobRepository에 JobInstance가 있는지 확인하고, JobExecution을 생성합니다.Job이 실행되는 동안, 각 Step의 시작과 끝에서 JobRepository를 통해 JobExecution과 StepExecution의 상태(STARTED, COMPLETED, FAILED 등)를 지속적으로 업데이트합니다.spring-boot-starter-batch 의존성과 DataSource 빈(Bean)만 있으면, DataSource에 연결된 RDB 기반의 JobRepository가 자동으로 구성됩니다. (@EnableBatchProcessing 어노테이션은 더 이상 필요하지 않으며, 사용할 경우 자동 설정을 방해할 수 있습니다.)JobLauncher가 실행되면, Spring Batch는 가장 먼저 Job의 이름과 JobParameters를 조합하여 JobInstance를 찾거나 생성합니다. 즉, JobInstance는 '논리적인 Job 실행' 그 자체입니다.
식별 방법: Job 이름 + 식별 JobParameters의 조합으로 고유하게 식별됩니다.
동작과정:
JobRepository는 BATCH_JOB_INSTANCE 테이블에서 동일한 Job 이름과 JobParameters를 가진 JobInstance가 있는지 조회합니다.
JobInstance를 사용합니다.JobInstance를 생성하고 테이블에 저장합니다.핵심 원리: 이 개념 덕분에 "2025년 7월 10일자 일일 정산 배치"와 같은 특정 논리적 작업이 단 한 번만 성공적으로 완료되도록 보장할 수 있습니다. 이미 성공한 JobInstance와 동일한 파라미터로 다시 실행을 요청하면, Spring Batch는 이를 중복 실행으로 간주하고 JobInstanceAlreadyCompleteException을 발생시킵니다.
JobExecution은 JobInstance에 대한 **'물리적인 단일 실행 시도'를 의미하는 객체입니다.
JobLauncher가 run 메서드를 호출하여 JobInstance에 대한 실행을 시도할 때마다 JobRepository에 의해 새로 생성됩니다.BatchStatus: STARTING, COMPLETED, FAILED 등 Job 실행의 현재 상태를 나타냅니다.ExitStatus: COMPLETED, FAILED 또는 개발자가 정의한 커스텀 코드를 통해 Job의 종료 상태를 나타냅니다. FlowJob의 분기 처리 시 이 ExitStatus를 사용합니다.JobInstance는 여러 개의 JobExecution을 가질 수 있습니다. (예: 최초 실행이 실패(FAILED)하고, 두 번째 시도에서 성공(COMPLETED)한 경우, 해당 JobInstance는 2개의 JobExecution을 갖게 됩니다.)
Spring Batch 5에서는 JobBuilder와 StepBuilder에 JobRepository를 직접 주입하여 Job과 Step을 구성합니다.
JobLauncher는 Job의 실행을 시작하는 진입점이며, 이때 전달하는 JobParameters는 JobInstance의 고유성을 결정합니다. (RunIdIncrementer로 자동화 가능)
JobRepository는 배치 메타데이터의 영속성을 책임지는 핵심 저장소로, 모든 컴포넌트의 상태를 관리합니다.
논리적 실행 단위인 JobInstance와 물리적 시도 단위인 JobExecution이 생성 및 관리됩니다.