003 Job Instance

강의메모 #

스프링 배치 도메인 이해 - JobInstance #

기본 개념 #

  • Job 이 실행될 때 생성되는 Job의 논리적 실행 단위 객체
    • 고유하게 식별 가능한 작업 실행을 나타냄
  • Job 의 설정과 구성은 동일하지만 Job 이 실행되는 시점에 처리하는 내용은 다르기 때문에 Job 의 실행을 구분해야 함
    • ex) 하루에 한 번 씩 배치 Job이 실행된다면 매일 실행되는 각각의 Job 을 JobInstance 로 표현
  • JobInstance 생성 및 실행
    • 처음 시작하는 Job + JobParameter 일 경우 새로운 JobInstance 생성
    • 이전과 동일한 Job + JobParameter 으로 실행 할 경우 이미 존재하는 JobInstance 리턴
    • 내부적으로 JobName + jobKey (jobParametes 의 해시값) 를 가지고 JobInstance 객체를 얻음
    • Job 과는 1:M 관계

BATCH_JOB_INSTANCE 테이블과 매핑 #

JOB_NAME (Job) 과 JOB_KEY (JobParameter 해시값) 가 동일한 데이터는 중복해서 저장할 수 없음

BATCH_JOB_INSTANCE 테이블 #

잡을 식별하는 고유 정보가 포함된 잡 파라미터로 잡을 처음 실행하면 단일 JobInstance 레코드가 테이블에 등록된다.

필드 설명
JOB_EXECUTION_ID 테이블의 기본 키
VERSION oplimistic locking 에 사용되는 레코드 버전
JOB_NAME 실행된 잡의 이름
JOB_KEY 잡 이름과 잡 파라미터의 해시 값으로, JobInstance 를 고유하게 식별하는 데 사용되는 값

예제 수행 #

@Configuration
@RequiredArgsConstructor
public class JobInstanceConfiguration {
    // job 생성
    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job jobInstanceTestJob() {
        return this.jobBuilderFactory.get("jobInstanceTestJob")
                /* step start */
                .start(jobInstanceTestStep1())
                .next(jobInstanceTestStep2())
                .build();
    }

    @Bean
    public Step jobInstanceTestStep1() {
        return stepBuilderFactory.get("jobInstanceTestStep1")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                        /**
                         * Tasklet 은 무한반복되어 FINISHED 를 리턴하여 종료
                         */
                        System.out.println("jobInstanceTestStep1 was executed");
                        return RepeatStatus.FINISHED;
                    }
                })
                .build();
    }

    @Bean
    public Step jobInstanceTestStep2() {
        return stepBuilderFactory.get("jobInstanceTestStep2")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                        System.out.println("jobInstanceTestStep2 was executed");
                        return RepeatStatus.FINISHED;
                    }
                })
                .build();
    }
}
  • BATCH_JOB_INSTANCE 테이블 조회 img_3.png

JobInstance 객체 생성 과정 #

img_1.png