Spring Batch : SimpleJob의 구조도

    SimpleJob의 구조도

    이번 포스팅에서는 SimpelJob이 어떻게 실행되고, 실행되는 과정에서 어떤 것이 생성되고 반환되는지를 구조와 코드로 한번 파악을 해보고자 한다. 

     


    SimpleJob의 구조도 확인

    SimpelJob이 실행되는 과정과 만들어지는 값들을 순서대로 정리를 해보고자 한다.

    1. SimpleJobLauncher는 SimpleJob, JobParameters를 전달받아 Job을 실행한다.
    2. Job이 실행되기 전, SimpleJobLauncher는 JobExecution, JobInstance, ExecutionContext를 만들어둔다. 이 때, BatchStatus.Started 설정해준다.
    3. SimpleJob은 실행 전 JobListner의 Before 메서드와 관련된 것이 있다면 수행한다.
    4. Step에 등록된 것을 순서대로 실행한다. 이 때, Step은 실행되면서 StepExecution, ExecutionContext를 만든다.
    5. Step이 모두 실행되면 Listener에 등록된 After 메서드가 있는지 확인하고 수행한다.
    6. SimpleJob이 수행이 완료되면, 1에서 만들어둔 JobExecution의 상태를 마지막으로 실행된 StepExecution의 상태와 동일하게 만들어둔다. 이 때, 마지막 Step이 실패했으면 JobExecution도 실패상태가 된다. 

    위 순서대로 Job이 실행된다. 그렇다면 코드에서 어떻게 되는지를 한번 더 확인해보려고 한다.

     


    SimpleJob 실행순서 코드로 확인하기

    위의 순서를 이제 코드에서 하나하나 확인해보고자 한다. 

    SimpleJobLauncher

    SimpleJobLauncher를 Run 메서드로 실행을 할 수 있다. Run 메서드에 Job과 JobParameter를 넘겨준다. 

    이 때, 동일한 Job 이름 + Job Parameter로 실행된 JobExecution이 DB에 존재하는지 먼저 확인한다. 

    만약 DB에 LastExecution이 있다면, 이것이 재시작 속성이 true인지 확인을 하고, 재시작을 해주는 작업을 해준다. 그렇지 않을 경우 새로운 Execution을 만들어야 한다. 

    새로운 JobExecution을 만들기 위해서 먼저 전달된 JobParameters가 정상적인 값인지를 Validator를 이용해서 검증한다.

    JobParameter가 정상이라면 createJobExecution 메서드에 Job Name + JobParameters를 넘겨서 JobExecution을 새로 만든다. 

    createJobExecution 메서드

    메서드 안으로 좀 더 들어가보면 JobInstance가 존재하는지 가져오는 것을 확인할 수 있다. 만약 JobInstance가 예전 것이 존재한다면, 이런저런 처리를 해준다.

    createJobExecution 메서드

    만약 JobInstance가 존재하지 않는다면, JobInstance와 ExecutionContext도 함께 만들어준다. 

    createJobExecution 메서드

    그리고 JobExecution을 생성하고, JobExecution에 ExecutionContext를 등록해준다. 

    SimpleJobLauncher

    SimpleJobLauncher는 필요한 도메인 객체를 만들고 job.execute()를 통해 Job을 실행해준다.

    AbstractJob

    Job.execute()는 실제로 AbstractJob의 execute 메서드로 넘어오게 된다.

    AbstractJob → execute()

    AbstractJob의 Execute 메서드에서는 listner.beforeJob을 통해 Step 실행 전 설정된 리스너의 업무가 있으면 일을 처리해준다. 그리고 다 처리가 되면 doExecute 메서드를 통해서 실제로 Job을 처리해준다.

    SimpleJob → doExecute

    SimpleJob의 doExecute()로 오게 되면 For문을 돌면서 Steps가 가지고 있는 Step을 하나하나 실행해준다. 이 때, handleStep을 이용해서 각 Step을 실행해준다.

    SimpleStepHandler

    SimpleStepHandler는 Step 실행 전, 필요한 StepExecution을 만들고 Step을 실행시킨다. 

    AbstractJob

    SimpleJob에서 모든 Step을 실행시키고 나면 다시 AbstractJob으로 돌아온다. AbstractJob의 doExecute() 구문 뒷쪽에는 listner.afterJob이라는 메서드가 있다. 여기서 스텝 실행 후 해야하는 Listener의 일이 있으면 처리를 해준다.

    SimpleJobLauncher

    리스너의 업무까지 처리해줬으면, 다시 SimpleJobLauncher 클래스로 돌아온다. 그리고 마지막 스텝의 StepExecution과 현재 JobExecution를 동기화 해주고(성공했으면 성공, 실패했으면 실패), jobExecution을 Return 해주면서 실행이 끝나게 된다. 

     


     SimpleJob 클래스의 상속도

    JobBuilderFactory는 JobBuilderHelper를 구현한 SimpleJobBuilder를 제공해준다. 그리고 SimpleJobBuilder는 SimpleJob을 생성해준다. 

    댓글

    Designed by JB FACTORY