-
04. 도메인 언어(Domain Language)BackEnd/Spring Batch 2021. 12. 15. 21:26반응형
JobLauncher
Job과 Job Parameters를 인자로 받아 배치 Job을 실행시키는 역할을 합니다. 배치 작업을 수행한 후에는 최종 클라이언트에게 JobExecution을 반환합니다. 스프링 부트 배치가 구동이 되면 JobLauncher 빈이 자동으로 생성되며 JobLauncher.run(Job, JobParameters)로 Job을 실행합니다.
동기적 실행
기본값으로 taskExecutor를 SyncTaskExecutor로 설정할 경우 동기적으로 실행됩니다. JobExecution을 획득하고 배치 처리를 최종 완료한 이후 클라이언트에게 JobExecution을 반환합니다. 스케줄러에 의한 배치처리(배치처리 시간이 길어도 상관없는 경우)에 적합합니다.
비동기적 실행
taskExecutor를 SimpleAsyncTaskExecutor로 설정할 경우 비동기적으로 실행됩니다. JobExecution을 획득한 후 클라이언트에게 바로 JobExecution을 반환하고 배치처리를 완료합니다. 배치처리 시간이 길지 않은 HTTP 요청에 의한 배치처리에 적합합니다.
Job배치 계층 구조에서 가장 상위에 있는 개념(최상위 인터페이스로 스프링 배치가 기본 구현체를 제공합니다.)으로 하나의 배치작업 자체를 의미합니다. Job Configuration을 통해 생성되는 객체 단위로서 배치작업을 어떻게 구성하고 실행할 것인지 전체적으로 설정하고 명세해 놓은 객체입니다. Job은 여러 Step을 포함하고 있는 컨테이너로서 반드시 한개 이상의 Step으로 구성해야 합니다.
기본 구현체- SimpleJob: 순차적으로 Step을 실행시키는 Job으로 모든 Job에서 유용하게 사용할 수 있는 표준 기능을 갖고 있습니다.
- FlowJob: 특정한 조건과 흐름에 따라 Step을 구성하여 실행시키는 Job으로 Flow 객체를 실행시켜서 작업을 진행합니다.
JobInstance
Job이 실행될 때 생성되는 논리적 실행 단위 객체로서 고유하게 식별 가능한 작업 실행을 나타냅니다. Job의 설정과 구성은 동일하지만 Job이 실행되는 시점에 처리하는 내용은 다르기 때문에 Job의 실행을 구분합니다. 예를 들어 하루에 한 번 씩 배치 Job이 실행된다면 매일 실행되는 각각의 Job을 JobInstance로 표현합니다.
JobInstance 생성 및 실행- 처음 시작하는 Job+JobParameter일 경우 새로운 JobInstance를 생성합니다.
- 이전과 동일한 Job+JobParameter로 실행할 경우 이미 존재하는 JobInstance을 반환합니다. (내부적으로 JobName + JobKey(JobParameter 의 해시값)를 가지고 JobInstance 객체를 얻습니다.) JobExecution의 실행 상태 결과가 'COMPLETED'면 JobInstance 실행이 완료된 것으로 간주해서 재실행이 불가하며, 'FAILED'면 JobInstance 실행이 완료되지 않은 것으로 간주해서 재실행이 가능합니다.
JobParameter
Job을 실행할 때 함께 포함되어 사용되는 파라미터를 가진 도메인 객체입니다. 하나의 Job에 존재할 수 있는 여러 개의 JobInstance를 구분하기 위한 용도입니다.
생성 및 바인딩- 어플리케이션 실행 시 주입: Java -jar SpringBatch.jar requestDate=20211215
- 코드로 생성: JobParameterBuilder, DefaultJobParametersConverter
- SpEL 이용: @Value("#{jobParameter[requestDate]}"), @JobScope, @StepScope 선언 필수
파라미터 타입: STRING, DATE, LONG, DOUBLE
JobExecution
JobInstance에 대한 한 번의 시도를 의미하는 객체로서 Job 실행 중에 발생한 정보들(시작시간, 종료시간, 상태 등)을 저장하고 있는 객체입니다. JobExecution은 'FAILED' 또는 'COMPLETED' 등의 Job의 실행 결과 상태를 가지고 있습니다.
StepBatch Job을 구성하는 독립적인 하나의 단계로서 실제 배치 처리를 정의하고 컨트롤하는 데 필요한 모든 정보를 가지고 있는 도메인 객체입니다. 단순한 단일 태스크 뿐 아니라 입력과 처리 그리고 출력과 관련된 복잡한 비즈니스 로직을 포함하는 모든 설정을 담고 있습니다. 배치작업을 어떻게 구성하고 실행할 것인지 Job의 세부 작업을 Task 기반으로 설정하고 명세해 놓은 객체입니다. 모든 Job은 하나 이상의 Step으로 구성됩니다.
기본 구현체- TaskletStep: 가장 기본이 되는 클래스로서 Tasklet 타입의 구현체들을 제어합니다.
- PartitionStep: 멀티 스레드 방식으로 Step을 여러 개로 분리해서 실행합니다.
- JobStep: Step 내에서 Job을 실행하도록 합니다.
- FlowStep: Step 내에서 Flow를 실행하도록 합니다.
StepExecutionStep에 대한 한 번의 시도를 의미하는 객체로서 Step 실행 중에 발생한 정보들을 저장하고 있는 객체입니다. 시작시간, 종료시간, 상태(시작됨, 완료, 실패), commit count, rollback count 등의 속성을 가집니다. Step이 매번 시도될 때마다 생성되며 각 Step 별로 생성됩니다. Job이 재시작 하더라도 이미 성공적으로 완료된 Step은 재실행되지 않고 실패한 Step만 실행됩니다. Step의 StepExecution이 모두 정상적으로 완료 되어야 JobExecution이 정상적으로 완료됩니다.
StepContribution청크 프로세스의 변경 사항을 버퍼링 한 후 StepExecution 상태를 업데이트하는 도메인 객체입니다. 청크 커밋 직전에 StepExecution의 apply 메서드를 호출하여 상태를 업데이트 합니다. (ExitStatus의 기본 종료코드 외 사용자 정의 종료코드를 생성해서 적용할 수 있습니다.)
ExecutionContext
프레임워크에서 유지 및 관리하는 키/값으로 된 컬렉션으로 StepExecution 또는 JobExecution 객체의 상태를 저장하는 공유 객체입니다. DB에 직렬화 한 값으로 저장됩니다({"key": "value"}). Job 재시작 시 이미 처리한 로우 데이터는 건너 뛰고 이후로 수행하도록 할 때 상태 정보를 활용합니다.
공유 범위
- Step 범위: 각 Step의 StepExecution에 저장되며 Step 간 서로 공유되지 않습니다.
- Job 범위: 각 Job의 JobExecution에 저장되며 Job 간 서로 공유되지 않지만, 해당 Job의 Step 간 서로 공유됩니다.
JobRepository
배치 작업 중의 정보를 저장하는 저장소 역할을 합니다. Job이 언제 수행되었고, 언제 끝났으며, 몇 번이 실행되었고 실행에 대한 결과 등의 배치 작업의 수행과 관련된 모든 meta data를 저장합니다. @EnableBatchProcessing 어노테이션만 선언하면 JobRepository가 자동으로 빈으로 생성됩니다. BatchConfigurer 인터페이스를 구현하거나 BasicBatchConfigurer를 상속해서 JobRepository설정을 커스터마이징 할 수 있습니다.
[참고자료]
https://docs.spring.io/spring-batch/docs/current/reference/html/domain.html#domainLanguageOfBatch
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98/dashboard
반응형'BackEnd > Spring Batch' 카테고리의 다른 글
06. Job (0) 2021.12.16 05. 스프링 배치 초기화 설정 (0) 2021.12.16 03. 메타데이터 스키마(Meta-Data Schema) (0) 2021.12.11 02. Hello Spring Batch Project (0) 2021.12.11 01. Spring Batch (0) 2021.12.07