Job 관련 내용 정리
개요
스프링 배치의 Job
에 대해 학습한 내용을 기록하려 한다.
먼저 Job
에 대해서 알아본다.
Job
의 개념은 무엇인지, 스프링 배치에서 제공하는 Job
에는 어떤 것들이 있는지 알아본다.
다음으로 Job
을 생성하고 설정하기 위해 어떻게 해야하는지 알아본다.
Job 개념
Job
은 배치 계층 구조에서 가장 상위에 있는 개념으로 하나의 배치 작업 자체를 의미한다.
Job Configuration
을 통해 생성되는 객체 단위로서 배치 작업을 어떻게 구성하고 실행할 것인지 전체적으로 설정하고 명세해 놓은 객체이다.
Job
은 여러 Step
을 포함하고 있는 컨테이너로서 반드시 한개 이상의 Step
으로 구성해야 한다.
스프링 배치는 Job
을 인터페이스로 제공하며, Job
의 기본 구현체도 함께 제공한다.
SimpleJob
과 FlowJob
이 Job
의 기본 구현체인데, 이들이 각각 어떤 역할을 하는지 알아보자.
SimpleJob
SimpleJob
은 등록된 Step
들을 순차적으로 실행시키는 Job
이다.
모든 Step
이 성공적으로 실행되고 완료되어야 Job
이 성공적으로 완료된다.
Step
이 실패 상태로 종료되면, SimpleJob
은 실패한 Step
이후의 Step
들은 실행하지 않고, 실패한 Step
의 BatchStatus
를 자신의 BatchStatus
로 설정하고 종료한다.
SimpleJob
에는 모든 Job
에서 유용하게 사용할 수 있는 표준 기능을 가지고 있다.
FlowJob
FlowJob
은 Step
을 순차적으로만 구성하는 것이 아니라 특정한 조건에 따라 흐름을 전환하도록 구성한 Job
을 말한다.
내부적으로 Flow
객체를 포함하고 있으며, Flow
를 통해 어떤 흐름으로 Step
을 실행할지 결정한다.
Job 생성하기
그러면 Job
을 생성하고 스프링 배치에 이를 등록하려면 어떻게 해야할까?
스프링 배치는 Job
을 쉽게 생성하고 설정할 수 있도록 유틸리티 성격의 빌더 클래스들인 JobBuilderFactory
와 JobBuilder
를 제공한다.
아래에서 알아보자.
JobBuilderFactory
JobBuilderFactory
는 JobBuilder
를 생성하는 팩토리 클래스로서 get(String name)
메서드를 제공한다.
public class JobBuilderFactory {
private JobRepository jobRepository;
public JobBuilderFactory(JobRepository jobRepository) {
this.jobRepository = jobRepository;
}
public JobBuilder get(String name) {
JobBuilder builder = new JobBuilder(name).repository(jobRepository);
return builder;
}
}
JobBuilderFactory
는 단순히 get(String)
메서드를 통해 JobBuilder
를 생성하고 이를 반환하는 역할을 한다.
JobBuilder
JobBuilder
는 Job
을 구성하는 설정 조건에 따라 생성할 빌더 클래스를 선택하여 생성하고 실제 Job
생성을 위임하는 역할을 한다.
JobBuilder
클래스의 코드를 확인해보자.
public class JobBuilder extends JobBuilderHelper<JobBuilder> {
public JobBuilder(String name) {
super(name);
}
public SimpleJobBuilder start(Step step) {
return new SimpleJobBuilder(this).start(step);
}
public JobFlowBuilder start(Flow flow) {
return new FlowJobBuilder(this).start(flow);
}
public JobFlowBuilder flow(Step step) {
return new FlowJobBuilder(this).start(step);
}
}
JobBuilder
클래스의 start(Step)
메서드를 통해 SimpleJobBuilder
를 생성하여 반환하거나, start(Flow)
, flow(Step)
메서드를 통해 FlowJobBuilder
를 생성하고 이를 통해 JobFlowBuilder
를 반환한다.
SimpleJobBuilder
, FlowJobBuilder
, JobFlowBuilder
는 무엇일까?
SimpleJobBuilder
는 SimpleJob
을 생성하는 빌더 클래스이다.
FlowJobBuilder
는 FlowJob
을 생성하는 빌더 클래스이다.
JobFlowBuilder
는 Flow
를 생성하는 빌더 클래스이다.
주의!
FlowJobBuilder
와 JobFlowBuilder
는 이름이 비슷해서 햇갈리기 쉽다.
FlowJobBuilder
는 Flow
를 가진 Job
을 생성하는 빌더 클래스이고, JobFlowBuilder
는 Job
의 Flow
를 생성하는 빌더 클래스이다.
JobBuilder
와 SimpleJobBuilder
, FlowJobBuilder
는 JobBuilderHelper
추상 클래스를 상속받는다.
JobBuilderHelper
JobBuilderHelper
클래스는 추상 클래스로 JobBuilder
와 SimpleJobBuilder
, FlowJobBuilder
에서 이를 상속하여 사용한다.
JobBuilderHelper
클래스에는 이를 상속받은 클래스들이 공통적으로 사용할 수 있는 Job
설정과 관련된 API를 제공한다.
validator(JobParamtersValidator)
Job
실행에 필요한 파라미터를 검증하는 용도이다.
DefaultJobParametersValidator
구현체를 제공하며, 필요에 따라 JobParametersValidator
인터페이스를 직접 구현하여 사용할 수 있다.
incrementer(JobParametersIncrementer)
JobParameters
에서 필요한 값을 증가시켜 다음에 사용될 JobParameters
오브젝트를 리턴한다.
- 기존의
JobParameter
변경없이 Job
을 여러번 시작하고자 할 때 유용하다.
JobParametersIncrementer
인터페이스의 구현체로 RunIdIncrementer
를 기본적으로 제공하며 인터페이스를 직접 구현하여 사용할 수도 있다.
repository(JobRepository)
Job
의 JobRepository
를 설정한다.
listener(JobExecutionListener)
Job
의 JobExecutionListener
를 설정한다.
preventRestart()
Job
의 재시작 여부를 false
로 설정한다.
- 각
Job
은 AbstractJob
클래스에 재시작 여부를 설정하는 restartable
필드를 가진다. 해당 필드는 기본적으로 true
로 설정되어 있다.
- 이를
false
로 변경하여 재시작을 지원하지 않도록 설정한다.
Job
이 실패해도 재시작을 할 수 없으며 재시작을 시도하면 JobRestartExecption
이 발생한다.
SimpleJobBuilder
SimpleJobBuilder
클래스는 SimpleJob
을 생성하는 빌더 클래스로 Job
실행과 관련된 여러 설정 API를 제공한다.
start(Step)
과 next(Step)
메서드를 제외한 메서드들은 SimpleJobBuilder
를 반환하지 않으므로 주의해서 사용하자.
제공되는 메서드들은 다음과 같다.
start(Step)
: Job
의 처음 실행할 Step
을 설정한다. SimpleJobBuilder
를 반환한다.
next(Step)
: 다음에 실행할 Step
들을 순차적으로 연결하도록 설정한다. 여러번 설정이 가능하며 등록된 모든 Step
이 종료되면 Job
이 종료된다.
start(JobExecutionDecider)
: JobFlowBuilder
를 반환한다.
next(JobExecutionDecider)
: JobFlowBuilder
를 반환한다.
split(TaskExecutor)
: JobFlowBuilder.SplitBuilder
를 반환한다.
on(String)
: FlowBuilder.TransitionBuilder
를 반환한다.
build()
: Job
의 설정 내용을 바탕으로 SimpleJob
을 생성해서 반환한다.
FlowJobBuilder
FlowJobBuilder
는 FlowJob
을 생성하는 빌더 클래스이다.
start(Flow)
, start(Step)
, build()
API를 제공한다.
start(Flow)
: JobFlowBuilder
를 생성해서 반환한다.
start(Step)
: JobFlowBuilder
를 생성해서 반환한다.
build()
: Flow
를 가지고 있는 FlowJob
을 생성해서 반환한다.
FlowJobBuilder
의 API를 살펴보면 생각보다 간단하다.
build()
를 제외하면 나머지 메서드는 JobFlowBuilder
를 생성하고, 이를 반환하는 기능밖에 없다.
JobFlowBuilder
JobFlowBuilder
는 FlowBuilder
를 상속받아 FlowBuilder
클래스의 메서드를 통해 Flow
를 생성하고, 생성된 Flow
를 자신을 생성한 FlowJobBuilder
에 담아 반환하는 역할을 한다.
FlowBuilder
에 대해서는 추후 Flow
를 다루는 포스팅에서 정리하겠다.