
스프링배치 강의나 다른 자료들을 보다 보면 JobScope와 StepCope라는 애노테이션을 많이 보게 된다.
JopScope와 StepScope 애노테이션은 어떤 역할을 하는걸까?
@JobScope와 @StepScope는 스프링의 기본 Scope인 싱글톤 방식과 대치되는 역할이라고 한다.
Bean의 생성 시점을 스프링 애플리케이션이 실행되는 시점이 아닌 @JobScope, @StepScope가 명시된 메서드가 실행될때 까지 지연시키는것을 말한다. 이러한 행위를 LateBinding이라고 한다.
spring-batch에서는 Late Binding을 통해서 아래와 같은 이점을 얻을 수 있다고 한다.
@JobScope는 Step 선어문에서만 사용이 가능하고,@StepScope는 Step을 구성하는 ItemReader, ItemProcessor, ItemWriter에서 사용 가능하다.
JobParameter는 @Value 애노테이션을 이용해서 사용할 수 있다. JobParameter는 Step이나 Tasklet, Reader등 배치 컴포넌트 Bean의 생성 시점에 호출할 수 있다. (아래의 코드는 Tasklet이다.) 정확하게 Scope Bean을 생성할때만 가능하다.
즉,@StepScope,@JobScopeBean을 생성할때만JobParameter가 생성되기때문에 사용할 수있다.
@Bean
@StepScope
public Tasklet validatedTasklet(@Value("#{jobParameters['fileName']}" String fileName)) {
return new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("Validated Param Tasklet ");
return RepeatStatus.FINISHED;
}
}
}