[스프링 배치] Job 사용하기

조갱·2025년 4월 5일
0

스프링 배치

목록 보기
7/9

Job 아키텍쳐 톺아보기

사진으로 보는 아키텍처

JobBuilderFactory

  • JobBuilder 를 생성하기 위한 팩토리 클래스
  • JobBuilderFactory.get(jobName) 을 통해 JobBuilder 를 생성한다.

JobBuilder

  • JobBuilder 는 직접적으로 Job 생성을 담당하지 않는다.
  • JobBuilder 는 start, flow 메소드를 통해 하위 JobBuilder 를 생성하는 역할을 한다.
  • 실제 Job 생성은 하위 JobBuilder 에게 위임한다.
  • SimpleJobBuilder (SimpleJob 생성)
    • JobBuilder 의 start(Step) 을 호출하여 SimpleJobBuilder 를 생성할 수 있다.
  • FlowJobBuilder (FlowJob 생성)
    • JobBuilder 의 start(Flow), flow(Step) 을 호출하여 FlowJobBuilder 를 생성할 수 있다.
      • 정확히는, FlowJobBuilder 가 생성됨과 동시에 JobFlowBuilder 을 생성하여 반환한다.
      • 말로만 들으면 어렵다. 아래 JobBuilder 소스코드와, 위의 아키텍처 그림을 통해 자세히 확인하자.
  • JobFlowBuilder (SimpleFlow 를 래핑한 FlowJobBuilder 생성)
    • JobBuilder 를 통해 FlowJob 를 만들 때 실제로 사용되는 객체
    • FlowBuilder 클래스를 상속받는다.
    • FlowJobBuilder를 감싸서 개발자와 FlowJobBuilder 사이의 외부 인터페이스로 활용된다.
    • 이렇게 중간 계층을 따로 두는 이유?
      • FlowJobBuilder 는 JobBuilderHelper 클래스를 상속받고, JobFlowBuilder 는 FlowBuilder 클래스를 상속받는다. 자바는 다중상속이 불가능하기 때문에 중간 계층을 두어 우회한다.
      • JobBuilderHelper, FlowBuilder 각각을 따로 상속받음으로써 각 클래스의 역할을 분리, 확장성을 향상시킨다.
      • FlowJobBuilder 는 Flow 처리에 특화된 빌더이고, JobFlowBuilder 는 Job 구성의 기본 기능에 특화된 빌더이다. JobFlowBuilder 가 FlowJobBuilder 를 포함하고 활용하여 고수준의 API 를 개발자에게 제공한다. 이렇게 역할을 분리하여 단일책임원칙을 따르게 된다.

JobBuilder 소스코드

public class JobBuilder extends JobBuilderHelper<JobBuilder> {
    // JobBuilder의 생성자. 여기에 전달하는 name의 Job의 name이 된다.
	public JobBuilder(String name) {
		super(name);
	}

	// start 메소드를 오버라이드 한다. Step을 넘길 경우 SimpleJobBuilder 를 반환한다.
	public SimpleJobBuilder start(Step step) {
		return new SimpleJobBuilder(this).start(step);
	}

	// start 메소드에 Flow 객체를 넘기면,
    // FlowJobBuilder 의 start가 자동으로 호출되면서 JobFlowBuilder 를 반환한다.
	public JobFlowBuilder start(Flow flow) {
		return new FlowJobBuilder(this).start(flow);
	}
    
	// flow 메소드에 Step 객체를 넘기면,
    // FlowJobBuilder 의 start 가 자동으로 호출되면서 JobFlowBuilder 를 반환한다.
	public JobFlowBuilder flow(Step step) {
		return new FlowJobBuilder(this).start(step);
	}
}

SimpleJob 생성하기

순차적으로 Step을 실행하는 Job

SimpleJob 흐름도 한눈에 보기

start(Step) 를 사용하여 생성

// jobBuilderFactory 는 Autowired 되어있어야 한다.

@Bean
public Job batchJob() {
	return jobBuilderFactory.get(“batchJob") // JobBuilder 를 반환한다.
		.start(Step) // 최초에 실행할 Step. SimpleJobBuilder 를 반환한다.
		.next(Step) // 이후에 실행할 Step. SimpleJobBuilder 를 반환한다.
		.incrementer(JobParametersIncrementer) // jobParameter 를 자동으로 증가시켜준다.
		.preventRestart() // 재시작을 방지할지 여부. 기본값은 true이다. 이걸 설정하면 false로 바뀜
		.validator(JobParameterValidator) // jobParameter 의 구성이 올바른지 검증하는 Validator
		.listener(JobExecutionListener) // Job 의 라이프사이클의 특정 시점에 콜백받기 위한 리스너 설정
		.build(); // SimpleJob 반환
}

가장 간단한 SimpleJob

// jobBuilderFactory 는 Autowired 되어있어야 한다.

@Bean
public Job batchJob() {
	return jobBuilderFactory.get(“batchJob")
		.start(Step)
		.build();
}

FlowJob 생성하기

특정한 조건에 따라 Step을 실행할지 말지 구성하여 실행시키는 Job

start(Flow)

// jobBuilderFactory 는 Autowired 되어있어야 한다.

@Bean
public Job batchJob() {
	return jobBuilderFactory.get(“batchJob") // JobBuilder 반환
		.start(Flow) // JobFlowBuilder 반환
		.on(String pattern) // Transition : 배치 동작의 흐름을 변경하기 위해 사용
		.to(Step / Flow / JobExecutionDecider) / stop() / fail() / end() / stopAndRestart(Step / Flow / JobExecutionDecider) // Transition : 배치 동작의 흐름을 변경하기 위해 사용
		.from(Step / Flow / JobExecutionDecider) // Transition : 배치 동작의 흐름을 변경하기 위해 사용
		.next(Step / Flow / JobExecutionDecider) // 위 from 이 성공했을 때 실행
		.end() // FlowBuilder 를 종료하고, SimpleFlow 를 생성. 그리고 SimpleFlow를 래핑한 FlowJobBuilder 를 반환. (build 전에 반드시 필요)
		.build() // FlowJob 을 반환한다.
}

FlowJob 을 구성할 때에는 Transition 이 중요하다. 추후에 예제와 함께 자세히 알아보자.

flow(Step)

// jobBuilderFactory 는 Autowired 되어있어야 한다.

@Bean
public Job batchJob() {
	return jobBuilderFactory.get(“batchJob") // JobBuilder 반환
		.flow(Step) // JobFlowBuilder 반환
		... // 나머지는 위에 start(Flow) 와 동일하여 별도 작성 안함.
}

가장 간단한 FlowJob

// jobBuilderFactory 는 Autowired 되어있어야 한다.

@Bean
public Job batchJob() {
	return jobBuilderFactory.get(“batchJob")
		.start(Flow)
		.end()
		.build()
}
profile
A fast learner.

0개의 댓글