반응형
스프링 배치의 도메인 - Step, 나머지
Step
- 스프링 배치에서 Step이란 Job을 구성하는 하나의 단계로, 실제 배치가 실행되는 처리를 정의하고 컨트롤하는데 필요한 모든 정보를 가지고 있는 도메인 객체이다.
- 배치 작업을 어떻게 구성하고 실행할 것인지 Job의 세부 작업을 Task 기반으로 설정하고 명세해 놓은 객체이다.
- 단순한 단인 테스크부터 입력, 처리, 출력과 관련된 비즈니스 로직을 포함하는 모든 설정을 담고 있다.
모든 Job은 하나 이상의 Step으로 구성
된다.
Step의 기본 구현체
TaskletStep
: 가장 기본이 되는 클래스,Tasklet
타입의 구현체들을 제어한다.PartitionStep
: 멀티 스레드 방식으로Step
을 여러 개로 분리해서 실행한다.JobStep
:Step
내에서Job
을 실행하도록 한다.FlowStep
:Step
내에서Flow
를 실행하도록 한다.
StepExecution
Step에 대한 한번의 시도
를 의미한다.- Step 실행 중에 발생한 정보들을 저장하고 있는 객체이다.
- 시작시간, 종료시간, 상태, commit count, rollback count 등
- Step이 매번 시도될 때마다 생성되고, 각 Step별로 생성된다.
- Job이 재시작 하더라도 이미 성공적으로 완료된 Step은 재 실행되지 않고
실패한 Step만 실행
된다. - 이전 단계의 Step이 실패하였다면 다음 단계의 StepExecution은 생성되지 않는다. 즉, 실제로 실행된 Step만 StepExecution이 생성된다.
StepContribution
- 청크 프로세스의 변경 사항을 버퍼링 한 후 StepExecution상태를 업데이트하는 도메인 객체
- 청크 커밋 직전에 StepExecution의 apply 메서드를 호출해 상태를 업데이트 한다.
- ExitStatus의 기본 종료코드 외 사용자 정의 종료코드를 생성해서 적용할 수 있다.
ExecutionContext
- 프레임워크에서 유지, 관리하는 키/값으로 된 컬렉션으로 StepExecution 또는 JobExecution 객체의 상태를 젖아하는 공유 객체
JOB_EXECUTION
,STEP_EXECUTION
- DB에 직렬화 한 값으로 저장된다.
{"key", "value"}
- 공유범위
Step 범위
: 각 Step의 StepExecution에 저장되며 Step간 서로 공유되지 않는다.Job 범위
: 각 Jbo의 JobExecution에 저장되며 Job간 서로 공유되지 않으며 해당 Job의 Step간 서로 공유된다.
- Job 재 시작시 이미 처리된 Row 데이터는 건너뛰고 이후로 수행하도록 할 때 상태 정보를 활용한다.
JobRepository
- 배치 작업 중에 생성된 정보를 저장하는 저장소 역할을 한다.
- Job이 언제 수행되었고, 언제 끝나고, 몇 번 실행되었는지, 실행에 대한 결과 등의 배치 작업의 수행과 관련된 모든 데이터를 저장한다.
- JobLauncher, Job, Step 구현체 내부에서 CRUD 기능을 처리한다.
JobRepository 설정
@EnableBatchProcessing
어노테이션 선언 시 JobRepository가 자동으로 빈으로 생성된다.- BatchConfigurer 인터페이스를 구현하거나 BasicBatchConfigurer를 상속해서 JobRepository 설정을 커스터마이징 할 수 있다.
- JDBC 방식: JobRepositoryFactoryBean
- 내부적으로 AOP 기술을 통해 트랜잭션 처리르 해준다.
- 트랜잭션 isolation의 기본값은 SERIALIZEBLE로 최고 수준이며, 다른 레벨로 지정할 수 있다.
- 메타테이블의 Table Prefix를 변경할 수 있다. (기본값
BATCH_
)
- In Memory 방식: MapJobRepositoryFactoryBean
- 성능 등의 이유로 도메인 오브젝트를 굳이 데이터베이스에 저장하고 싶지 않을 때 사용
- 보통 Test나 프로토타입의 빠른 개발이 필요할 때 사용한다.
JobLauncher
- 배치 Job을 실행시키는 역할을 한다.
Job
과Job Parameters
를 인자로 받으며 요청된 배치 작업을 수행한 후 최종client
에게JobExecution
을 반환한다.- 스프링 부트 배치가 구동되면
JobLauncher
빈이 자동 생성된다. - 스프링 부트 배치에서는
JobLauncherApplicationRunner
가 자동적으로JobLauncher
을 실행시킨다.
JobLauncher 동기적 실행
- taskExecutor를 SyncTaskExecutor로 설정할 경우 (기본값: SyncTaskExecutor)
- JobExecution을 획득하고 배치 처리를 최종 완료한 이후 Client에게 JobExecution을 반환한다.
스케줄러에 의한 배치처리에 적합
하다. (배치처리시간이 상관 없는 경우)
JobLauncher 비동기적 실행
- taskExecutor가 SimpleAsyncTaskExecutor로 설정할 경우
- JobExecution을 획득한 후 Client에게 바로 JobExecution을 반환하고 배치처리를 완료한다.
- HTTP 요청에 의한 배치처리에 적합하다.
- 요청시 배치처리가 완료되기 전에 응답할 수 있다.
반응형
'Java & Kotlin > Spring Batch' 카테고리의 다른 글
[Spring Batch] 스프링 배치 실행 - Flow (0) | 2022.05.28 |
---|---|
[Spring Batch] 스프링 배치 실행 - Step (0) | 2022.05.28 |
[Spring Batch] 스프링 배치 실행 - Job (0) | 2022.05.28 |
[Spring Batch] 스프링 배치 도메인 - Job (0) | 2022.05.28 |
[Spring Batch] 스프링 배치의 DB 스키마 (0) | 2022.05.18 |
[Spring Batch] 스프링 배치와 구성 (0) | 2022.05.18 |