Spring Batch : Job 도메인 이해
- Spring/Spring Batch
- 2022. 3. 9.
이 글은 인프런 정수원님의 강의를 듣고 복습하며 작성한 글입니다.
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와 매핑됨.
동작 방식
- JobLauncher는 Job name + Job Parameter로 Job을 실행한다.
- Job이 실행되면 JobRepository를 통해 JobName + Job Parameter에 해당되는 Job Instance를 DB에서 확인함.
- 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 테이블의 관계
- Job Parameter가 user1인 Job은 성공한다.
- Job Parameter가 user2인 Job은 한번 실패했다가, 성공한다.
상황은 위와 같다. 이 때, 각각의 DB 스키마의 값은 어떤지 확인해서 관계를 좀 더 명확히 보고자 한다.
Job Parameter는 user1 / user2가 주어졌기 때문에 총 Job Instance는 2개가 만들어지는 것이 확인되었다.
이 때, JOB EXECUTION은 총 3개의 Row가 만들어진다. 왜냐하면 JOB INSTANCE ID = 2가 실패했다가 다시 실행되었기 때문이다. 이 때, 처음 Batch Status는 Failed이고 마지막은 정상 성공했으니 Completed가 된다.
JobExecutionParams도 3개가 생긴다. 왜냐하면 Job Execution 실행 시 전달된 Parameter에 대한 정보이기 때문이다. 따라서 정리하면 다음과 같은 형태로 이해를 할 수 있다.
Job Instance → Job Execution → Job Execution Params
'Spring > Spring Batch' 카테고리의 다른 글
Spring Batch : JdbcCursorItemReader (0) | 2022.03.13 |
---|---|
Spring Batch : Step 도메인 이해 (0) | 2022.03.09 |
Spring Batch : DB ItemReader, Cursor / Paging (0) | 2022.03.09 |
Spring Batch : ChunkOrientedTaskletStep 순서도 (0) | 2022.03.09 |
Spring Batch : ItemReader / ItemProcessor / ItemWriter / ItemStream (0) | 2022.03.09 |