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;
}
}
- JobBuilderFactory의 생성자를 살펴봅시다. JobBuilder를 생성하는 JobBuilderFactory가 생성되는 시점에 JobRepository를 주입하여 JobBuilder에서 사용할 Repository로 설정합니다. 이 말인 즉슨, JobBuilder가 생성되기 전에 JobBuilderFactory는 JobRepository를 주입받게 되고 결국 JobBuiler는 해당 JobRepository를 그대로 사용하게 되니 결국에는 모든 JobBuilder는 모두 동일한 JobRepository를 사용하게 되겠죠.
- 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인 것으로보아 사용하려는 의도에 따라 각각 다른 빌더 메서드가 분류되어 있는 것처럼 보입니다.
- JobBuilderFactory에서 JobBuilder를 만들고
- JobBuilder에서 Job을 생성하기 위한 Step(or Flow) 파라미터를 받아 그 목적에 맞는 JobBuilder를 생성합니다.
- Job은 Step(or Flow) 인스턴스의 컨테이너가 되기 때문에 생성하기 직전에 인스턴스를 전달받습니다.
참고 블로그
'JAVA' 카테고리의 다른 글
[Java] mockito JUnit 5 에서 의존성 주입 - 테스트코드 작성(1) (0) | 2024.02.19 |
---|---|
[Gradle] gradle version 확인 방법 (0) | 2024.02.16 |
[Gradle][오류] variable * not initialized in the default constructor (0) | 2024.02.16 |
[Java] String, StringBuffer, StringBuilder 차이 및 장단점 (0) | 2021.04.02 |