JAVA

Spring Boot Batch(Job, Step) #2

우엥우아앙 2021. 2. 28. 16:49

img

Step

기본구조(일고, 처리하고, 저장한다.)는 Step이라는 객체에서 정의됩니다. 1개의 Step은 읽고, 처리하고, 저장하는 구조를 가지고 있는 가장 실질적인 배치처리를 담당하는 도메인 개게입니다. 그리고 이 Step은 한 개 혹은 여러 개가 이루어 Job을 표현합니다. 그리고 1개의 Step은 위에서 설명한 것과 같이 ItemReader(읽고), ItemProcessor(처리하고), ItemWriter(저장하고)를 정의합니다.

 

Job

한 개 혹은 여러 개의 Step을 이루어 하나의 단위로 만들어 표현한 객체입니다. 스프링 부트 배치 처리에 가장 윗 계층에 있는 객체입니다. Job 객체는 JobBuiderFactory 클래스에서 Job을 생성할 수 있습니다. 더 정확하게 표현하자면 JobBuiderFactory에서 생성된 JobBuilder를 통해 Job을 생성할 수 있습니다.

 

1) JobBuilderFactory

JobBuilderFactory 클래스를 살펴보면 다음과 같습니다.

package org.springframework.batch.core.configuration.annotation;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.repository.JobRepository;

public class JobBuilderFactory {     

    private JobRepository jobRepository;

    public JobBuilderFactory(JobRepository jobRepository) {  // 1         this.jobRepository = jobRepository; 
    }

    public JobBuilder get(String name) {  // 2
        JobBuilder builder = new JobBuilder(name).repository(jobRepository);
        return builder; 
    } 
}
  1. JobBuilderFactory의 생성자를 살펴봅시다. JobBuilder를 생성하는 JobBuilderFactory가 생성되는 시점에 JobRepository를 주입하여 JobBuilder에서 사용할 Repository로 설정합니다. 이 말인 즉슨, JobBuilder가 생성되기 전에 JobBuilderFactory는 JobRepository를 주입받게 되고 결국 JobBuiler는 해당 JobRepository를 그대로 사용하게 되니 결국에는 모든 JobBuilder는 모두 동일한 JobRepository를 사용하게 되겠죠.
  1. get 메소드가 JobBuilder 인스턴스를 생성 후 반환하고 있네요. 그러니까 JobBuilderFactory에서 get메소드를 호출하게 되면 새로운 JobBuilder가 생성된다는 사실을 알 수 있습니다.

 

2) JobBuilder

JobBuilderFactory를 통해 JobBuilder를 반환받았습니다. 이제 JobBuilder를 통해 Job을 생성할 수 있습니다. JobBuiler의 내부를 살펴보도록 하겠습니다.

package org.springframework.batch.core.job.builder;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.job.flow.Flow;

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);
    }
}

각각 다르게 정의된 2개의 start메서드 그리고 1개의 flow메서드가 있네요.

반환 탕비이 모두 Builder인 것으로보아 사용하려는 의도에 따라 각각 다른 빌더 메서드가 분류되어 있는 것처럼 보입니다.

  1. JobBuilderFactory에서 JobBuilder를 만들고
  2. JobBuilder에서 Job을 생성하기 위한 Step(or Flow) 파라미터를 받아 그 목적에 맞는 JobBuilder를 생성합니다.
  3. Job은 Step(or Flow) 인스턴스의 컨테이너가 되기 때문에 생성하기 직전에 인스턴스를 전달받습니다.

 

참고 블로그

https://ahndy84.tistory.com/18