새소식

framework/spring-batch

[Spring Batch] Job 관련 내용 정리

  • -

Job 관련 내용 정리

개요

스프링 배치의 Job에 대해 학습한 내용을 기록하려 한다.

먼저 Job에 대해서 알아본다.
Job의 개념은 무엇인지, 스프링 배치에서 제공하는 Job에는 어떤 것들이 있는지 알아본다.

다음으로 Job을 생성하고 설정하기 위해 어떻게 해야하는지 알아본다.

Job 개념

Job은 배치 계층 구조에서 가장 상위에 있는 개념으로 하나의 배치 작업 자체를 의미한다.
Job Configuration을 통해 생성되는 객체 단위로서 배치 작업을 어떻게 구성하고 실행할 것인지 전체적으로 설정하고 명세해 놓은 객체이다.
Job은 여러 Step을 포함하고 있는 컨테이너로서 반드시 한개 이상의 Step으로 구성해야 한다.

스프링 배치는 Job을 인터페이스로 제공하며, Job의 기본 구현체도 함께 제공한다.
SimpleJobFlowJobJob의 기본 구현체인데, 이들이 각각 어떤 역할을 하는지 알아보자.

SimpleJob

SimpleJob은 등록된 Step들을 순차적으로 실행시키는 Job이다.
모든 Step이 성공적으로 실행되고 완료되어야 Job이 성공적으로 완료된다.
Step이 실패 상태로 종료되면, SimpleJob은 실패한 Step 이후의 Step들은 실행하지 않고, 실패한 StepBatchStatus를 자신의 BatchStatus로 설정하고 종료한다.

SimpleJob에는 모든 Job에서 유용하게 사용할 수 있는 표준 기능을 가지고 있다.

FlowJob

FlowJobStep을 순차적으로만 구성하는 것이 아니라 특정한 조건에 따라 흐름을 전환하도록 구성한 Job을 말한다.
내부적으로 Flow 객체를 포함하고 있으며, Flow를 통해 어떤 흐름으로 Step을 실행할지 결정한다.

Job 생성하기

그러면 Job을 생성하고 스프링 배치에 이를 등록하려면 어떻게 해야할까?

스프링 배치는 Job을 쉽게 생성하고 설정할 수 있도록 유틸리티 성격의 빌더 클래스들인 JobBuilderFactoryJobBuilder를 제공한다.
아래에서 알아보자.

JobBuilderFactory

JobBuilderFactoryJobBuilder를 생성하는 팩토리 클래스로서 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

JobBuilderJob을 구성하는 설정 조건에 따라 생성할 빌더 클래스를 선택하여 생성하고 실제 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는 무엇일까?

SimpleJobBuilderSimpleJob을 생성하는 빌더 클래스이다.
FlowJobBuilderFlowJob을 생성하는 빌더 클래스이다.
JobFlowBuilderFlow를 생성하는 빌더 클래스이다.

주의!
FlowJobBuilderJobFlowBuilder는 이름이 비슷해서 햇갈리기 쉽다.
FlowJobBuilderFlow를 가진 Job을 생성하는 빌더 클래스이고, JobFlowBuilderJobFlow를 생성하는 빌더 클래스이다.

JobBuilderSimpleJobBuilder, FlowJobBuilderJobBuilderHelper 추상 클래스를 상속받는다.

JobBuilderHelper

JobBuilderHelper 클래스는 추상 클래스로 JobBuilderSimpleJobBuilder, FlowJobBuilder에서 이를 상속하여 사용한다.
JobBuilderHelper 클래스에는 이를 상속받은 클래스들이 공통적으로 사용할 수 있는 Job 설정과 관련된 API를 제공한다.

  • validator(JobParamtersValidator)
    • Job 실행에 필요한 파라미터를 검증하는 용도이다.
    • DefaultJobParametersValidator 구현체를 제공하며, 필요에 따라 JobParametersValidator 인터페이스를 직접 구현하여 사용할 수 있다.
  • incrementer(JobParametersIncrementer)
    • JobParameters에서 필요한 값을 증가시켜 다음에 사용될 JobParameters 오브젝트를 리턴한다.
    • 기존의 JobParameter 변경없이 Job을 여러번 시작하고자 할 때 유용하다.
    • JobParametersIncrementer 인터페이스의 구현체로 RunIdIncrementer를 기본적으로 제공하며 인터페이스를 직접 구현하여 사용할 수도 있다.
  • repository(JobRepository)
    • JobJobRepository를 설정한다.
  • listener(JobExecutionListener)
    • JobJobExecutionListener를 설정한다.
  • preventRestart()
    • Job의 재시작 여부를 false로 설정한다.
    • JobAbstractJob 클래스에 재시작 여부를 설정하는 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

FlowJobBuilderFlowJob을 생성하는 빌더 클래스이다.
start(Flow), start(Step), build() API를 제공한다.

  • start(Flow) : JobFlowBuilder를 생성해서 반환한다.
  • start(Step) : JobFlowBuilder를 생성해서 반환한다.
  • build() : Flow를 가지고 있는 FlowJob을 생성해서 반환한다.

FlowJobBuilder의 API를 살펴보면 생각보다 간단하다.
build()를 제외하면 나머지 메서드는 JobFlowBuilder를 생성하고, 이를 반환하는 기능밖에 없다.

JobFlowBuilder

JobFlowBuilderFlowBuilder를 상속받아 FlowBuilder 클래스의 메서드를 통해 Flow를 생성하고, 생성된 Flow를 자신을 생성한 FlowJobBuilder에 담아 반환하는 역할을 한다.

FlowBuilder에 대해서는 추후 Flow를 다루는 포스팅에서 정리하겠다.

[Spring Batch] Job 관련 내용 정리

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.