Batch Job Flow
Batch Step
Step은 실제 Batch 작업을 수행하는 역할을 한다. 즉, 실제 비지니스 로직을 처리하는 기능은 Step에 구현되어있다.
이처럼 Step 에서는 Batch에서 처리하고자 하는 기능과 설정을 모두 포함하는 장소라 생각하면된다.
Next
.next()는 순차적으로 Step 들을 연결시킬때 사용한다.
@Slf4j
@Configuration
@RequiredArgsConstructor
public class StepNextJobConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job stepNextJob(){
return jobBuilderFactory.get("stepNextJob")
.start(step1())
.next(step2())
.next(step3())
.build();
}
@Bean
public Step step1(){
return stepBuilderFactory.get("step1")
.tasklet((stepContribution, chunkContext) -> {
log.info(">>> this is step1");
return RepeatStatus.FINISHED;
}).build();
}
@Bean
public Step step2(){
return stepBuilderFactory.get("step2")
.tasklet((stepContribution, chunkContext) -> {
log.info(">>> this is step2");
return RepeatStatus.FINISHED;
}).build();
}
@Bean
public Step step3(){
return stepBuilderFactory.get("step3")
.tasklet((stepContribution, chunkContext) -> {
log.info(">>> this is step3");
return RepeatStatus.FINISHED;
}).build();
}
}Flow
Next는 순차적으로 Step의 순서를 제어하지만, 앞의 Step에서 오류가 발생하게 되면, 뒤의 Step들은 실행되지 못하게 된다. 하지만 상황에 따라 정상 수행인 경우엔 Step B로, 오류가 발생했을 땐 Step C로 수행해야하는 경우가 있다.

이러한 경우에 대비해 조건별로 Step을 사용할 수 있다.
.on()
.on()ExitStatus를 지정한다.*의 경우 모든ExitStatus가 지정된다.
.to()
.to()다음으로 이동할 Step을 지정한다.
.from()
.from()상태값을 보고 일치하는 상태라면
to()에 포함된step을 호출하며, 일종의 이벤트 리스너 역할을 한다고 보면 된다.추가로 이벤트를 캐치하는 경우에 사용한다.
.end()
.end()FlowBuilder를 반환
.on("*")뒤에 있는end()FlowBuilder를 반환하는
end()의 경우 계속해서from()을 이어갈 수 있다.
FlowBuilder 종료
build()앞에 있는end()
Flow 수행 해보기
ExitStatus.FAILED로 수행하는 경우 step1 -> step3이 수행되고 종료되는 것을 볼 수 있다.
ExitStatus 설정한 부분을 주석 처리한 후 수행 결과를 보면 step1 -> step2 -> step3 순서대로 수행된 것을 확인할 수 있다.
하지만 이렇게 Step을 수행하게 되면 다음 두가지 문제가 있다.
Step이 담당하는 역할이 2개 이상이다. 실제 해당 Step이 처리해야할 로직외에도 분기처리를 위한
ExitStatus조작이 필요하다.다양한 분기 로직 처리의 어려움이 있다.
ExitStatus를 커스텀하게 고치려면Listener를 생성하고, Job Flow에 등록하는 등 번거로움이 존재한다.
Decide
Spring Batch에서 JobExecutionDecider는 Step들의 Flow속에서 분기만 담당하는 타입이다.
계속해서 수행하면, 홀수와 짝수가 번갈아가면서 수행되는 것을 볼 수 있다.
BatchStatus vs ExitStatus
BatchStatus
Job 혹은 Step의 실행 결과를 Spring에 기록할 때 사용하는 Enum이다.
ExitStatus
Step의 실행 후 상태를 말하며, ExitStatus는 Enum이 아니다.
Custom ExitStatus
본인만의 custom ExitStatus가 필요한 경우가 있다.
step1 FAILED -> job 실패
step1 성공적으로 완료되어,
COMPLETED WITH SKIPS로 종료step1 성공 -> step2 성공
참고
Last updated
Was this helpful?