Spring Batch : Job 도메인 이해

    이 글은 인프런 정수원님의 강의를 듣고 복습하며 작성한 글입니다. 

     

    Job Instance

    기본개념

    • Job Instance는 Job이 실행될 때 만들어지는 고유한 객체임. Job name + Job Parameter의 해쉬 값을 더해서 만들어지기 때문임.
    • Job Instance는 동일 Job name + Job Parameter에 대해서는 단 하나의 Instance만 만들어짐.
    • 동일한 Job을 Job Parameter로 나눠서 저장하기 위한 것임. (1/1일 일별 정산, 1/2일 일병 정산 Job은 다른 Job이다)
    • Job Instance가 있으면 기존 Job Instance를 반환(재실행), 없으면 새로 만들어 반환한다.
    • Job과 Job Instance는 1:M 관계(Job Parameter의 영향성)
    • JobInstance는 DB 스키마의 BATCH_JOB_INSTANCE와 매핑됨.

     

    동작 방식

    1. JobLauncher는 Job name + Job Parameter로 Job을 실행한다.
    2. Job이 실행되면 JobRepository를 통해 JobName + Job Parameter에 해당되는 Job Instance를 DB에서 확인함.
    3. DB에 Job Instance 있으면 반환, 없으면 새로 만들어서 반환해줌. 

     

    DB 스키마 확인

    동일한 JOB_NAME을 가지지만, 전달된 JOB PARAMETER가 다르기 때문에 JOB_INSTANCE는 두개 생성되었다.

     

    JOB PARAMETER

    기본 개념

    • Job Instance를 생성하는데 필요한 파라메터다.
    • 하나의 Job을 여러 개의 Job Instance로 구분하는데 사용됨.
    • JobParamter와 JobInstance는 1:1 관계

     

    Job Parameter 주입 방법

    • 어플리케이션 실행 시 주입 / 인텔리제이 활용
      • Java -jar LogBatch.jar requestDate = 20210101 
    • 코드로 생성
      • JobParameterBuilder, DefaultJobParametersConverter

     

    DB 스키마 맵핑

    BATCH_JOB_EXECUTION_PARAM 테이블과 매핑됨.

     

    JobParameter 부가 설명 + DB 데이터

    jobParametersBuilder.addString();
    jobParametersBuilder.addDate();
    jobParametersBuilder.addDouble();
    jobParametersBuilder.addDate(

    JobParameter는 내부적으로 LinkedHashMap을 가지고 있다. 이 HashMap에는 4개 타입의 값을 저장할 수 있으며 String, Date, Long, Double 객체를 저장할 수 있다. 

    DB 테이블에서는 다음과 같이 KEY_NAME / Value 형식으로 값을 가지고 있는 것을 확인할 수 있다. 이 때, Job_Execution_ID와 매칭되는 것도 같이 확인할 수 있다. 

     

    JobParameter 인텔리제이 지원

    다음과 같이 인텔리제이 Build를 하기 전에 "name = user1"같은 형식으로 Job Parameter를 전달할 수 있다. 이건 위에 적힌 어플리케이션 실행 시 주입하는 것과 동일한 방법이다. 

     

     

    Job Execution

    기본개념

    • Job Instance가 실행될 때 마다 만들어지는 객체다.
    • Job Instance의 실행 정보를 저장하고 있는 객체다.
    • JobExecution의 실행상태가 COMPLETED면 Job Instance는 정상 종료되었음. 만약 FAILED면 비정상 종료로, 해당 Job Instance는 재실행 가능함. 

     

    테이블 맵핑

    • BATCH_JOB_EXECUTION 테이블과 맵핑됨.
    • JOB_INSTANCE와 JOB_EXECUTION은 1:M 관계임.

     

    Column 설명

    • JobParameters : JobParameter 객체 PK
    • JobInstance : JobInstance 객체 PK
    • ExecutionContext : 실행하는 동안 유지해야하는 데이터
    • BatchStatus : 현재 Job의 실행 상태를 나타냄
    • ExitStatus : 실행 결과를 나타냄. BatchStatus와는 다름

    이 외에도 여러 Column이 있으나, 위 Column의 내용만 알고 있어도 크게 무리는 없을 듯 하다. 

     

    테이블 확인

    다음과 같이 정리되어 저장되는 것을 볼 수 있다. 여기서 Status Batch Job의 현재 실행 상태를 보는 거라보면 되고, Exit Code는 실행 결과 어떻게 마무리 되었는지를 볼 수 있다. 

     

    JobExecution 부가 정보

    JobExecution은 실행 상태 정보를 가지고 있다. 따라서 Job Instance가 실행할 때, Job Instance는 Job Execution이 있다면 Job Execution의 정보를 확인한다. Job Execution의 Batch 정보가 Completed 인지를 확인한다. 이 때 Completed 상태면, Job Instance를 추가 실행하지 않고 Exception을 발생시킨다. Completed가 아닌 경우에는 Job을 계속 실행해준다. 

     

    Job Instance / Job Parameter / Job Execution 테이블의 관계

    1. Job Parameter가 user1인 Job은 성공한다.
    2. Job Parameter가 user2인 Job은 한번 실패했다가, 성공한다. 

    상황은 위와 같다. 이 때, 각각의 DB 스키마의 값은 어떤지 확인해서 관계를 좀 더 명확히 보고자 한다.

    JOB INSTANCE

    Job Parameter는 user1 / user2가 주어졌기 때문에 총 Job Instance는 2개가 만들어지는 것이 확인되었다.

    JOB EXECUTION

    이 때, JOB EXECUTION은 총 3개의 Row가 만들어진다. 왜냐하면 JOB INSTANCE ID = 2가 실패했다가 다시 실행되었기 때문이다. 이 때, 처음 Batch Status는 Failed이고 마지막은 정상 성공했으니 Completed가 된다. 

    Job Execution Params

    JobExecutionParams도 3개가 생긴다. 왜냐하면 Job Execution 실행 시 전달된 Parameter에 대한 정보이기 때문이다. 따라서 정리하면 다음과 같은 형태로 이해를 할 수 있다. 

    Job Instance → Job Execution → Job Execution Params

    댓글

    Designed by JB FACTORY