Spring Batch의 단계 범위
이 튜토리얼은 Spring Batch에서 Step Scope의 작업에 대해 가르칩니다. Spring Batch에는 Application, Batch Core 및 Batch Infrastructure의 세 가지 주요 상위 구성 요소가 있습니다.
Spring Batch의 작업 및 단계
작업은 전체 일괄 처리를 캡슐화하는 엔터티입니다. 즉, 작업 계층 구조의 맨 위에 있습니다. 모든 작업에는 하나 이상의 단계가 포함됩니다.
각 단계에 하나의 ItemReader
, ItemProcessor
및 ItemWriter
가 있는 단계 인스턴스의 컨테이너입니다. 작업에 포함된 일부 개념은 JobInstance
, JobParameters
및 JobExecution
입니다.
단계는 배치 프로세스를 정의하고 제어하는 데 필요한 모든 정보를 포함하는 배치 작업의 독립적인 도메인 개체입니다. 작업과 마찬가지로 단계에는 작업에서와 같이 JobExecution
과 상관 관계가 있는 StepExecution
이 있습니다.
Spring은 StepScope
와 JobScope
라는 두 가지 범위를 정의합니다.
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
를 통해 stepExecutionContext
및 stepExecutionListener
를 통해 매개변수의 후기 바인딩을 수행하는 동안 단계 간에 정보를 전달할 수 있습니다.
따라서 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의 공식 문서를 참조하십시오.