2023. 2. 14. 23:18ㆍBackEnd(Java)/Spring Batch
✅ 아래 내용들에 대해서 알아보자
- Job
- JobInstance
- JobParameters
- JobExecution
Job
- 배치 계층 구조에서 가장 상위에 있는 개념으로서 하나의 배치작업 자체를 의미
- Job Configuration을 통해 생성되는 객체 단위로서 배치작업을 어떻게 구성하고 실행할 것인지 전체적으로 설정하고 명세해 놓은 객체
- 배치 Job을 구성하기 위한 최상위 인터페이스이며 스프링 배치가 기본 구현체를 제공한다
- 여러 Step 을 포함하고 있는 컨테이너로서 반드시 한 개 이상의 Step으로 구성해야 함
- Job은 SimpleJob과 FlowJob으로 구성도미
SimpleJob
- 순차적으로 Step 을 실행시키는 Job
- 모든 Job에서 유용하게 사용할 수 있는 표준 기능을 갖고 있음
FlowJob
- 특정한 조건과 흐름에 따라 Step을 구성하여 실행시키는 Job
- Flow 객체를 실행시켜서 작업을 진행함
간단한 예시코드를 보자.(아래 코드 참고)
JobBuilderFactory.get을 통해 잡을 가져와 Job을 구성하고 잡에 스텝을 2개 구성하여 start(), next() 메서드 안에 스텝을 넣고 최종적으로 build 하여 Job을 Return 한다. 잡의 Bean Name을 "jcJob"으로 설정하였다.
. start() 메서드와. next() 메서드를 내부코드를 타고 들어가 보자.
JobBuilder 클래스 내부로 들어오게 되고 SimpleJobBuilder와 JobFlowBuilder start()/flow() 등 여러 가지 메서드가 보인다.
(SimpeJob / FlowJob 마다 호출되는 메서드가 다르다)
그리고 다시 Job 클래스로 돌아와. build() 메서드 내부코드를 타고 들어가 보자.
내부로 들어오면 SimpleJobBuilder 클래스 내부로 오는데 빨간색 테두리로 색칠한 부분을 보면 SimpleJob을 생성하여 내부 로직이 수행되는 것이 보인다.
그리고 실제 잡은 JobLauncher를 Implements 하는 SimpleJobLauncher의 run 메서드가 실행하게 된다. 디버깅으로 찍어보면 우리가 실행한 Job의 들어오게 되고 잡의 실행하기 위한 로직들이 실행된다.
JobInstance
- Job이 실행될 때 생성되는 Job의 논리적 실행 단위 객체, 고유하게 식별 가능한 작업 실행을 나타냄
- Job의 설정과 구성을 동일하지만 Job이 실행되는 시점에 처리하는 내용은 다르기 때문에 Job의 실행을 구분해야 함
- JobInstance 생성 및 실행
- 처음 시작하는 Job + JobParameter일 경우 새로운 JobInstance 생성
- 이전과 동일한 Job + JobParameter으로 실행할 경우 이미 존재하는 JobInstance 리턴 (내부적으로 JobName + JobKey(JobParameters의 해시값)을 가지고 JobInstance 객체를 얻음)
- Job과 1:N 관계
- Job_Name과 Job_Key가 동일한 데이터는 중복해서 저장할 수 없음 -> 즉, 동일한 잡+파라미터는 고유하다(Unique)
동일한 JobInstance + JobParamter로 실행 시 아래와 같이 잡이 이미 실행되고 있다고 발생된다.
JobParameters
- Job을 실행할 때 함께 포함되어 사용되는 파라미터를 가진 도메인 객체
- 하나의 Job에 존재할 수 있는 여러개의 JobInstance를 구분하기 위한 용도
- JobInstance와 1:1 관계
- JobExecution과 1:M 관계
JobParameter 생성 방법
어플리케이션 실행 시 주입
: java -jar xxx.jar requestDate=2023-02-11
코드로 생성
: JobParameterBuilder, DefaultParametersConverter
SpEL(스프링 표현 언어) 사용
: @Value("#{jobParameter[requestDate]}", @JobScope, @StepScope 선언 필수
JobExecution
- JobInstance와 1:N 관계로, JobInstance에 대한 성공/실패 내역을 가지고 있음 -> JobInstance에 대한 한 번의 시도를 의미하는 객체로, Job 실행 중에 발생한 정보들을 저장하고 있는 객체
- JobExecution은 'FAILED', 'COMPLETED' 등의 Job의 실행 결과 상태를 가지고 있음
- JobExecution 실행 상태 결과가 'COMPLETED' 면 JobInstance 실행이 완료된 것으로 간주해서 재 실행이 불가
- JobExecution 실행 상태 결과가 'FAILED' 면 Jobinstance 실행이 완료되지 않은 것으로 간주해서 재실행이 가능함 -> JobParameter가 동일한 값으로 Job을 실행할지라도 JobInstance를 계속 실행할 수 있음
- JobExecution 실행 상태 결과가 'COMPLETED' 될 때까지 하나의 Jobinstnace 내에서 여러 번의 시도가 생길 수 있음
위의 순서도를 보면 BatchStatus(아래 그림의 Status 필드 [COMPLETED, FAILED .. ])를 확인하여 재실행할지 여부를 판별한다.
이글은 인프런 정수원 님의 ‘스프링 배치 - Spring Boot 기반으로 개발하는 Spring Batch’ 강의 내용을 바탕으로 정리 및 복습하기 위해 작성하였습니다.(링크)
'BackEnd(Java) > Spring Batch' 카테고리의 다른 글
배치 실행 시 잡파라미터 null 바인딩 현상 (0) | 2023.02.08 |
---|---|
2. 배치 메타 데이터 분석 (0) | 2023.02.06 |
1.스프링 배치 소개 및 프로젝트 구성 (0) | 2022.09.27 |