-
07. StepBackEnd/Spring Batch 2021. 12. 21. 07:10반응형
StepBuilderFactory
StepBuilder를 생성하는 팩토리 클래스로서 get(String name) 메서드를 제공합니다. StepBuilderFactory.get("stepName")으로 Step을 생성합니다.
StepBuilder
Step을 구성하는 설정 조건에 따라 다섯 개의 하위 빌더 클래스를 생성하고 실제 Step 생성을 위임합니다. API의 파라미터 타입과 구분에 따라 적절한 하위 빌더가 생성됩니다.
- TaskletStepBuilder: TaskletStep을 생성하는 기본 빌더 클래스
- SimpleStepBuilder: TaskletStep을 생성하며 내부적으로 청크기반의 작업을 처리하는 ChunkOrientedTasklet클래스 생성
- PartitionStepBuilder: PartitionStep을 생성하며 멀티 스레드 방식으로 Job 실행
- JobStepBuilder: JobStep을 생성하여 Step 안에서 Job 실행
- FlowStepBuilder: FlowStep을 생성하여 Step 안에서 Flow 실행
TaskletStep
스프링 배치에서 제공하는 Step의 구현체로서 Tasklet을 실행시키는 도메인 객체입니다. RepeatTemplate를 사용해서 Tasklet의 구문을 트랜잭션 경계 내에서 반복해서 실행합니다. Task기반과 Chunk 기반으로 나누어서 Tasklet을 실행합니다.
chunk 기반
- 하나의 큰 덩어리를 n개씩 나눠서 실행한다는 의미로 대량 처리를 하는 경우 효과적으로 설계 됩니다.
- ItemReader, ItemProcessor, ItemWriter를 사용하며 청크 기반 전용 Tasklet인 ChunkOrientedTasklet 구현체가 제공됩니다.
Task 기반
- 단일 작업 기반으로 처리되는 것이 더 효율적인 경우 사용합니다.
- 주로 Tasklet 구현체를 만들어 사용합니다.
API
// StepBuilderFactory > StepBuilder > TaskletStepBuilder > TaskletStep public Step batchStep() { return stepBuilderFactory // StepBuilder를 생성하는 팩토리, Step의 이름을 매개변수로 받음 .get("batchStep") // Tasklet 클래스 설정, 메서드 실행 시 TaskletStepBuilder 반환 // 익명 클래스 혹은 구현 클래스 만들어 사용 // Step에 오직 하나의 Tasklet 설정 가능 (두 개 이상을 설정 했을 경우 마지막에 설정한 객체 실행) .tasklet(new Tasklet() { @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { // To do Business Logic return RepeatStatus.FINISHED; } } }) // Step의 실행 횟수를 설정, 설정한 만큼 실행되고 초과 시 오류 발생 (기본값: INTEGER.MAX_VALUE) .startLimit(10) // Step의 성공, 실패와 상관 없이 항상 Step을 실행하기 위한 설정, true인 경우 실행 // (실행 마다 유효성을 검증하는 Step이나 사전 작업이 꼭 필요한 Step 등) .allowStartIfComplete(true) // Step 라이프 사이클의 특정 시점에 콜백 제공받도록 StepExecutionListener 설정 .listener(StepExecutionListener) // TaskletStep을 생성 .build(); }
Task 기반으로 TaskletStep 생성 Chunk 기반으로 TaskletStep 생성 public Step step() {
return this.stepBuilderFactory.get("step")
.tasklet(customTasklet())
.build();
}public Step step() {
return this.stepBuilderFactory.get("step")
.<String, String>chunk(100)
.reader().writer().build();
}Tasklet
Step 내에서 구성되고 실행되는 도메인 객체로서 주로 단일 태스크를 수행하기 위한 것입니다. TaskletStep에 의해 반복적으로 수행되며 반환 값에 따라 계속 수행 혹은 종료합니다. Tasklet의 반복 여부 상태 값은 RepeatStatus입니다.
- RepeatStatus.FINISHED: Tasklet 종료, RepeatStatus을 null로 반환하면 RepeatStatus.FINISHED로 해석
- RepeatStatus.CONTINUABLE: Tasklet 반복
- RepeatStatus.FINISHED가 리턴되거나 실패 예외가 던져지기 전까지 TaskletStep에 의해 반복 호출됨(무한루프 주의)
JobStep
Job에 속하는 Step 중 외부의 Job을 포함하고 있는 Step입니다. (Job > Step > Job 호출 구조)
외부의 Job이 실패하면 해당 Step이 실패하므로 결국 최종 기본 Job도 실패합니다. 모든 메타데이터는 기본 Job과 외부 Job별로 각각 저장됩니다. 커다란 시스템을 작은 모듈로 쪼개고 Job의 흐름을 관리하고자 할 때 사용할 수 있습니다.
API
// StepBuilderFactory > StepBuilder > JobStepBuilder > JobStep public Step jobStep() { return stepBuilderFactory .get("jobStep") // JobStep 내에서 실행 될 Job, JobStepBuilder 반환 .job(Job) // Job을 실행할 JobLauncher 설정 .launcher(JobLauncher) // Step의 ExecutionContext를 Job이 실행되는 데 필요한 JobParameters로 반환 .parametersExtractor(JobParametersExtractor) // JobStep을 생성 .build(); }
[참고자료]
반응형'BackEnd > Spring Batch' 카테고리의 다른 글
09. Flow (0) 2021.12.23 08. 배치 상태 유형 (0) 2021.12.22 06. Job (0) 2021.12.16 05. 스프링 배치 초기화 설정 (0) 2021.12.16 04. 도메인 언어(Domain Language) (0) 2021.12.15