[ 스프링 배치 입문 #6 ] - 멀티 Step과 Step 간 분기

정동욱·2023년 7월 5일
0
post-thumbnail

이번 글에서는 Step을 여러 개 생성해 사용하고 또 Step 사이에 분기처리를 통해 동적으로 실행하는 방법에 대해 알아보겠습니다.

먼저, 여러 Step을 사용하는 것은 매우 쉽습니다. 3개의 Step을 준비해놓고, 순서대로 실행시키기만 하면 됩니다.

@Configuration
@RequiredArgsConstructor
public class MultiStepJobConfig {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    // 잡
    @Bean
    public Job multiStepJob(Step multiStepStep1,
                            Step multiStepStep2,
                            Step multiStepStep3 ) {
        return jobBuilderFactory.get("multiStepJob") // 이 Job의 이름을 지정
                .incrementer(new RunIdIncrementer()) // Job의 식별자인 id값 자동 증가
                .start(multiStepStep1) // 실행될 Step을 지정
                .next(multiStepStep2)
                .next(multiStepStep3)
                .build();
    }

    // 스텝 1
    @Bean
    @JobScope
    public Step multiStepStep1() {
        return stepBuilderFactory.get("multiStepStep1")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution contribution, 
                                                ChunkContext chunkContext) throws Exception {
                        System.out.println("First Step Start");

                        return RepeatStatus.FINISHED;
                    }
                })
                .build();
    }

    // 스텝 2
    @Bean
    @JobScope
    public Step multiStepStep2() {
        return stepBuilderFactory.get("multiStepStep2")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution contribution, 
                                                ChunkContext chunkContext) throws Exception {
                        System.out.println("Second Step Start");

                        return RepeatStatus.FINISHED;
                    }
                })
                .build();
    }

    // 스텝 3
    @Bean
    @JobScope
    public Step multiStepStep3() {
        return stepBuilderFactory.get("multiStepStep3")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution contribution, 
                                                ChunkContext chunkContext) throws Exception {
                        System.out.println("Third Step Start");

                        return RepeatStatus.FINISHED;
                    }
                })
                .build();
    }
}

그리고 Step 간의 분기처리를 하려면 Job에서 start(), on(), to(), from()의 코드를 사용해아래와 같이 설정하면 됩니다.

@Configuration
@RequiredArgsConstructor
public class ConditionalStepJobConfig {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    // 잡
    @Bean
    public Job conditionalStepJob(Step conditionalStepStep,
                                  Step conditionalAllStepStep,
                                  Step conditionalCompliteStepStep,
                                  Step conditionalFailStepStep) {
        return jobBuilderFactory.get("conditionalStepJob") // 이 Job의 이름을 지정
                .incrementer(new RunIdIncrementer()) // Job의 식별자인 id값 자동 증가
                .start(conditionalStepStep)
                    .on("FAILED").to(conditionalFailStepStep)
                .from(conditionalStepStep)
                    .on("COMLETED").to(conditionalCompliteStepStep)
                .from(conditionalStepStep)
                    .on("*").to(conditionalAllStepStep)
                .end()
                .build();
    }

    // 스텝 1
    @Bean
    @JobScope
    public Step conditionalStepStep() {
        return stepBuilderFactory.get("conditionalStepStep")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution contribution, 
                                                ChunkContext chunkContext) throws Exception {
                        System.out.println("First Step Start");
                        return RepeatStatus.FINISHED;
                    }
                })
                .build();
    }

    // 스텝 전체
    @Bean
    @JobScope
    public Step conditionalAllStepStep() {
        return stepBuilderFactory.get("conditionalAllStepStep")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution contribution, 
                                                ChunkContext chunkContext) throws Exception {
                        System.out.println("conditionalAllStepStep Start");
                        return RepeatStatus.FINISHED;
                    }
                })
                .build();
    }

    // 스텝 성공
    @Bean
    @JobScope
    public Step conditionalCompliteStepStep() {
        return stepBuilderFactory.get("conditionalCompliteStepStep")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution contribution, 
                                                ChunkContext chunkContext) throws Exception {
                        System.out.println("conditionalCompliteStepStep Start");
                        return RepeatStatus.FINISHED;
                    }
                })
                .build();
    }

    // 스텝 실패
    @Bean
    @JobScope
    public Step conditionalFailStepStep() {
        return stepBuilderFactory.get("conditionalFailStepStep")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution contribution, 
                                                ChunkContext chunkContext) throws Exception {
                        System.out.println("conditionalFailStepStep Start");
                        return RepeatStatus.FINISHED;
                    }
                })
                .build();
    }

}

다음 글에서는 이제껏 만든 배치 프로그램을 실행시키는 방법에 대해 알아보겠습니다.

profile
거인의 어깨 위에서 탭댄스를

0개의 댓글