Spring Batch - 08. Step

출처

목차

Step

  • Batch Job 을 구성하는 독립적인 하나의 단계로서 실제 배치 처리를 정의하고 컨트롤하는 데 필요한 모든 정보를 가지고 있는 도메인 객체
  • 단순한 단일 테스크 뿐 아리나 입력, 처리 그리고 출력과 관련된 복잡한 비즈니스 로직을 포함하는 모든 설정들을 담고 있다.
  • 배치 작업을 어떻게 구성하고 실행할 것인지 Job 의 세부 작업을 Task 기반으로 설정하고 명세해 놓은 객체
  • 모든 Job 은 하나 이상의 step 으로 구성된다.

Step은 하나 이상의 Batch 작업을 수행하는 논리적인 단위입니다. 각 Step은 하나의 Tasklet 또는 하나 이상의 Reader, Processor 및 Writer 구성 요소를 포함할 수 있습니다.

Reader는 데이터 소스에서 데이터를 읽고 Processor는 읽어온 데이터를 가공하고 Writer는 가공된 데이터를 결과 저장소에 씁니다. 이러한 구성 요소는 일련의 스텝으로 연결되어 Batch 작업의 흐름을 제어합니다.

Step은 각 스텝의 실행 전/후에 수행해야 할 작업을 처리하기 위한 Tasklet도 지원합니다. 예를 들어, 스텝이 실행되기 전에 데이터베이스 테이블을 비워야 하는 경우, 이러한 작업을 Tasklet에 포함시킬 수 있습니다.

Spring Batch는 스텝 간에 데이터를 공유하는 방법도 제공합니다. 이를 통해 하나의 스텝이 처리한 결과를 다음 스텝에서 사용할 수 있습니다.

Spring Batch에서는 JobLauncher를 사용하여 Batch 작업을 실행합니다. JobLauncher는 Job을 실행하고 Job은 하나 이상의 Step을 포함합니다. Step은 각각의 Batch 작업을 실행하고 결과를 제공합니다.

따라서 Spring Batch에서 Step은 Batch 작업의 핵심적인 구성 요소 중 하나이며, 데이터를 처리하고 흐름을 제어하는 데 중요한 역할을 합니다.

Step 인터페이스

public interface Step {

static final String STEP_TYPE_KEY = "batch.stepType";

String getName();

boolean isAllowStartIfComplete();

int getStartLimit();

void execute(StepExecution stepExecution) throws JobInterruptedException;
}

Step 기본 구현체

  • TaskletStep
    • 가장 기본이 되는 클래스로 Tasklet 타입의 구현체들을 제어한다.
  • PartitionStep
    • 멀티 스레드 방식으로 Step 을 여러개로 분리해 실행한다.
  • JobStep
    • Step 내에서 Job 을 실행하도록 한다.
  • FlowStep
    • Step 내에서 Flow 를 실행하도록 한다.

Step 생성

@RequiredArgsConstructor
@Configuration
public class StepConfiguration {

private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;

@Bean
public Job BatchJob() {
return this.jobBuilderFactory.get("Job")
.start(step1())
.next(step2())
.build();
}

@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("step1 has executed");
return RepeatStatus.FINISHED;
}
})
.build();
}
@Bean
public Step step2() {
return stepBuilderFactory.get("step2")
.tasklet((contribution, chunkContext) -> {
System.out.println("step2 has executed");
return RepeatStatus.FINISHED;
})
.build();
}
}
Share