SpringBatch의 SimpleJob 수행과정을 예제코드 디버깅으로 분석하기

반응형
728x90
반응형

들어가며

간단한 SimpleJob 예제의 실행 흐름을 디버깅을 통해 직접 확인해보자. 이번기회에 실행 흐름을 정리해서 앞으로 BatchJob 예제를 수행할때마다 흐름을 따라갈 수 있도록 글을 남긴다.

 

 

예제코드

JobTextConfiguration.java
@Configuration
@RequiredArgsConstructor
public class JobTestConfiguration {

    // job 생성
    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job testJob() {
        return this.jobBuilderFactory.get("testJob")
                .start(testStep1())
                .next(testStep2())
                .build();
    }

    @Bean
    public Step testStep1() {
        return stepBuilderFactory.get("testStep1")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                        System.out.println("step1");
                        return RepeatStatus.FINISHED;
                    }
                })
                .build();
    }

    @Bean
    public Step testStep2() {
        return stepBuilderFactory.get("testStep2")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                        System.out.println("step2");
                        return RepeatStatus.FINISHED;
                    }
                })
                .build();
    }

 

 

SimpleJob 실행흐름

출처 : 인프런 '스프링 배치 - Spring Boot 기반으로 개발하는 Spring Batch' 강의

 

 

디버깅을 통한 실행흐름 분석

1) SimpleJobLauncher.java

JobExecution 객체를 생성하는 getLastJobExecution() 메서드를 호출한다.

 

2) SimpleJobRepository.java

제일 최근에 생성된 배치 정보의 JobInstance 객체를 가져온다.

비어있다면, null을 리턴한다. (여기서, 해당 Job을 중복 실행이 아니라면 null을 리턴하고, 중복 실행이라면 else문을 타게된다.)

 

3) SimpleJobLauncher.java

위 2)번에서 null을 리턴받았으므로 다시 돌아온 SimpleJobLauncher.java 에서 if문 수행을 생략하고 다음 코드를 수행한다.

 

4) SimpleJobLauncher.java > run()

위 3)번의 이미지의 if문 코드를 생략한 후, 아래의 코드를 수행한다.

 

5) DefaultJobParametersValidator.java

Job 파라미터의 validation 체크를 수행한다.

 

6) SimpleJobLauncher.java > run()

다시 돌아와, JobExecution 객체를 생성하는 createJobExecution() 메서드를 실행한다.

 

7) SimpleJobRepository.java > createJobExecution()

1. JobInstance 객체 생성

 

2. ExecutionContext 객체 생성

 

3. 위에서 생성한 jobInstance, executionContext 객체를 set한 JobExecution 객체 생성

 

 

8) SimpleJobLauncher.java > run()

다시 돌아와서, Job을 수행한다.

 

9) AbstractJob.java > execute()

1. updateStatus() 메서드로 BatchStatus.STARTED 상태로 변경한다.

 

> AbstractJob.java > updateStatus()

 

2. Listener가 있었다면 Job 수행 전에 실행된다.

 

3. Job을 수행한다.

 

10) SimpleJob.java > doExecute()

while()문 안에서 Job 안의 Step들을 수행한다.

만약 Step 수행 중 COMPLTED 상태가 아닌 Step으로 끝난다면 break;를 통해서 그 이후 STEP은 실행되지 않는다.

 

11) Step 실행 > AbstractJob.java > handleStep()

 

12) Step 실행 > SimpleStepHandler.java > handleStep()

 

> execute() 수행

 

13) AbstractStep.java > execute()

 

14) AbstractJob.java > execute()

Step 실행 후, Job의 작업상태를 마지막 Step 단계와 동일하게 업데이트한다.

 

15) AbstractJob.java > execute()

리스너가 있었다면, Job 수행 이후 리스너를 수행한다.

 

 

실행결과
step1
step2

 

 

반응형

Designed by JB FACTORY