본문 바로가기
Java & Kotlin/Spring Batch

[Spring Batch] 스프링 배치 실행 - Step

by heekng 2022. 5. 28.
반응형

스프링 배치 실행 - Step

StepBuilderFactory

@Bean
public Step step1() {
    return stepBuilderFactory.get("step1")
            .tasklet((contribution, chunkContext) -> {
                System.out.println("step1 has executed");
                return RepeatStatus.FINISHED;
            })
            .build();
}
  • StepBuilder를 생성하는 팩토리 클래스, get(String name) 메서드를 제공한다.

StepBuidler

  • Step을 구성하는 설정 조건에 따라 다섯개의 하위 빌더 클래스를 생성하고, Step 생성을 위임한다.
  • TaskletStepBuilder
    • TaskletStep을 생성하는 기본 빌더 클래스
  • SimpleStepBuilder
    • TaskletStep을 생성하며 내부적으로 청크기반의 작업을 처리하는 ChunkOrientedTasklet 클래스를 생성한다.
  • PartitionStepBuilder
    • PartitionStep을 생성하며 멀티 스레드 방식으로 Job을 실행한다.
  • JobStepBuilder
    • JobStep을 생성하여 Step 안에서 Job을 실행한다.
  • FlowStepBuilder
    • FlowStep을 생성하여 Step 안에서 Flow를 실행한다.

TaskletStep

@Bean
public Step taskStep() {
    return stepBuilderFactory.get("taskStep")
            .tasklet(new Tasklet() {
                @Override
                public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                    System.out.println("step was executed");
                    return RepeatStatus.FINISHED;
                }
            })
            .build();
}
  • 스프링 배치에서 제공하는 Step의 구현체, Tasklet을 실행시키는 도메인 객체이다.
  • RepeatTemplate를 사용해서 Tasklet의 구문을 트랜젝션 경계 내에서 반복 실행한다.
  • Task기반과 Chunk기반으로 실행 단위가 나뉜다.

Task 기반 Step

  • ItemReader과 ItemWriter와 같은 청크 기반의 작업보다 단일 작업 기반으로 처리되는 것이 더 효율적인 경우 사용한다.
  • 주로 Tasklet 구현체를 만들어서 사용한다.
  • 대량 처리를 하는 경우 chunk기반에 비해 더 복잡한 구현이 필요하다.

chunk 기반 Step

  • 하나의 큰 덩어리를 n개씩 나눠서 실행한다는 의미
  • 대량 처리를 하는 경우 효과적으로 설계된다.
  • ItemReader, ItemProcessor, ItemWriter를 사용한다.
  • 청크 기반 전용 Tasklet인 ChunkOrientedTasklet 구현체가 제공된다.

API

  • stepBuilderFactory.get(): StepBuilder를 생성하는 팩토리, Step의 이름을 매개변수로 받는다.
  • tasklet(Tasklet): Tasklet 클래스 설정, TaskletStepBuidler를 반환한다.
  • startLimit(Integer): Step의 실행 횟수를 설정한다. 설정한 만큼 실행되고 초과시 오류를 발생한다.
    • 기본값: INTEGER.MAX_VALUE
    • Step의 실행 횟수를 조정할 수 있다.
    • Step마다 설정할 수 있다.
    • 설정 값을 초과해서 다시 실행하려고 하면 StartLimitExceededException이 발생한다.
    • startLimit의 디폴트 값으 Integer.MAX_VALUE
  • allowStartIfComplete(Boolean): Step의 성공, 실패와 상관없이 Step을 실행하기 위한 설정
    • 재시작 가능한 Job에서 Step의 이전 성공 여부와 상관없이 항상 step을 실행하기 위한 설정이다.
    • 실행마다 유효성을 검증하는 Step이나 사전 작업이 꼭 필요한 Step 등에 사용한다.
    • 기본적으로 COMPLETED상태를 가진 Step은 Job 재시작시 실행하지 않고 스킵한다.
    • allowStartIfCompletetrue로 설정된 Step은 항상 실행한다.
  • listener(StepExecutionListner): Step 라이프사이클의 특정 시점에 콜백 제공받도록 StepExcutionListener을 설정한다.
  • build(): TaskletStep 생성

Tesklet

public Step step1() {
    return stepBuilderFactory.get("step1")
            .tasklet((contribution, chunkContext) -> {
                return RepeatStatus.FINISHED;
            })
            .build();
}
  • Step 내에서 구성되고 실행되는 도메인 객체로, 주로 단일 테스크를 수행하기 위해 사용한다.
  • TaskletStep에 의해 반복적으로 수행되며 반환값에 따라 계속 수행하거나 종료한다.
  • RepeatStatus: Tasklet의 반복 여부 상태 값
    • RepeatStatus.FINISHED: Tasklet 종료, RepeatStatus를 null로 반환하면 RepeatStatus.FINISHED으로 해석된다.
    • RepeatStatus.CONTINUABLE: Tasklet 반복
    • RepeatStatus.FINISHED가 리턴되거나 실패 예외가 던져지기 전까지 TaskletStep에 의해 while문 안에서 반복적으로 호출된다.
  • 익명 클래스 또는 구현 클래스를 만들어서 사용한다.
  • Tasklet()메서드를 실행하게 되면 TaskletStepBuilder가 반환되어 관련된 API를 설정할 수 있다.
  • Step에 오직 하나의 Tasklet 설정이 가능하며, 두개 이상을 설정할 경우 마지막에 설정한 객체가 실행된다.

JobStep

@Bean
public Step jobStep(JobLauncher jobLauncher) {
    return stepBuilderFactory.get("jobStep")
            .job(childJob())
            .launcher(jobLauncher)
            .parametersExtractor(jobParametersExtractor())
            .build();
}
  • Job에 속하는 Step중 외부의 Job을 포함하고 있는 Step
  • 외부의 Job이 실패하면 해당 Step이 실패하므로 결국 최종 기본 Job도 실패하게 된다.
  • 모든 메타데이터는 기본 Job과 외부 Job별로 각각 저장된다.
  • 커다란 시스템을 모듈로 쪼개고 흐름관리를 위해 사용한다.

API

  • job(Job): JobStep 내에서 실행 될 Job 설정, JobStepBuilder를 반환한다.
  • launcher(JobLauncher): Job을 실행할 JobLauncher를 설정한다.
  • parametersExtractor(JobParameterExtractor): Step의 ExecutionContext를 Job이 실행되는데 피룡한 JobParameters로 변환한다.
  • build(): JobStep을 생성한다.
반응형