Spring Batch의 단계 범위

Siddharth Bishnoi 2023년10월12일
  1. Spring Batch의 작업 및 단계
  2. Spring Batch의 단계 범위
Spring Batch의 단계 범위

이 튜토리얼은 Spring Batch에서 Step Scope의 작업에 대해 가르칩니다. Spring Batch에는 Application, Batch Core 및 Batch Infrastructure의 세 가지 주요 상위 구성 요소가 있습니다.

Spring Batch의 작업 및 단계

작업은 전체 일괄 처리를 캡슐화하는 엔터티입니다. 즉, 작업 계층 구조의 맨 위에 있습니다. 모든 작업에는 하나 이상의 단계가 포함됩니다.

각 단계에 하나의 ItemReader, ItemProcessorItemWriter가 있는 단계 인스턴스의 컨테이너입니다. 작업에 포함된 일부 개념은 JobInstance, JobParametersJobExecution입니다.

단계는 배치 프로세스를 정의하고 제어하는 데 필요한 모든 정보를 포함하는 배치 작업의 독립적인 도메인 개체입니다. 작업과 마찬가지로 단계에는 작업에서와 같이 JobExecution과 상관 관계가 있는 StepExecution이 있습니다.

Spring은 StepScopeJobScope라는 두 가지 범위를 정의합니다.

Spring Batch의 단계 범위

후기 바인딩을 사용하는 Bean은 항상 단계를 범위로 선언해야 합니다. 이는 scope="step"을 설정하여 수행할 수 있지만 단계 범위는 단계 Bean과 함께 사용할 수 없습니다.

필요한 경우 단계의 구성 요소는 대신 단계 범위를 지정해야 합니다. Spring Batch에서 작업은 XML 구성 파일 또는 Java 기반 구성과 연결되며 구성을 JobConfiguration이라고 합니다.

아래에 표시된 예는 XML 및 JAVA에서 단계 범위에 대한 바인딩을 보여줍니다.

XML 구성:

<bean id="flatFileItemReader" scope="step"
  class="org.springframework.batch.item.file.FlatFileItemReader">
  <property name="resource" value="#{jobParameters[input.file.name]}" />
</bean>

Java 기반 구성:

@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("
#{jobParameters[input.file.name] } ") String name) {
  return new FlatFileItemReaderBuilder<Foo>()
  .name("flatFileItemReader")
  .resource(new FileSystemResource(name))
  ...
}

StepScope 객체는 여러 면에서 유용합니다. 그 이유 중 하나는 StepScope가 콩의 수명을 정의하는 데 도움이 되기 때문입니다.

기본적으로 Bean 범위는 싱글톤입니다. 빈이 @singleton으로 어노테이션되면 처음에 한 번 생성되고 마지막에 소멸되지만 StepScope는 싱글톤이 아닌 특정 단계에 고유합니다.

구성 요소를 StepScope로 지정하면 스프링 컨테이너가 각 단계에 대해 새 인스턴스를 시작합니다. 단계 범위 Bean의 수명은 단계의 수명에 따라 다릅니다.

단계 범위 빈에서 빈은 시작 시 생성되고 각 단계가 끝날 때 소멸됩니다. 주석은 @StepScope입니다.

StepScope를 사용하는 또 다른 이유는 빈의 상태를 격리하기 때문에 단계가 병렬로 실행될 때입니다. 이를 통해 각 단계의 각 스레드는 자신의 인스턴스를 가지며 다른 스레드가 관리하는 상태를 수정하지 않습니다.

그렇지 않으면 여러 스레드가 빈의 상태를 변경하여 일관성이 없게 만듭니다. 또한 StepScope를 통해 stepExecutionContextstepExecutionListener를 통해 매개변수의 후기 바인딩을 수행하는 동안 단계 간에 정보를 전달할 수 있습니다.

따라서 StepScope는 빈의 수명을 정의하는 데 도움이 되며 단계 간에 데이터를 전달할 수 있습니다. 다음 예제는 XML 및 JAVA 구성에서 stepExecutionContext의 사용을 보여줍니다.

XML 구성:

<bean id="flatFileItemReader" scope="step"
  class="org.springframework.batch.item.file.FlatFileItemReader">
  <property name="resource" value="#{stepExecutionContext['input.file.name']}" />
</bean>

Java 기반 구성:

@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(
    @Value("#{stepExecutionContext['input.file.name']}") String name) {
  return new FlatFileItemReaderBuilder<Foo>()
      .name("flatFileItemReader")
      .resource(new FileSystemResource(name))...
}

예제와 함께 Spring Batch에서 StepScope 객체가 어떻게 작동하는지 논의했습니다. Spring Batch에 대한 자세한 내용은 Spring Batch의 공식 문서를 참조하십시오.