Batch의 Scope는 @StepScope
, @JobScope
가 있고 요청에 대한 파라미터를 받을 수 있는 Job Parameter
에 대해 공부해보자.
Batch는 외부 혹은 내부에서 파라미터를 받아 여러 Batch 컴포넌트에서 사용할 수 있게 지원하고 있다. 하지만 JobParameter
를 사용하기 위해서는 Batch 전용 Scope를 선언해야 하는데. 크게 @StepScope
, @JobScope
2개가 있다.
@Bean
@JobScope
public Step simpleStep1(@Value("#{jobParameters[requestDate]}") String requestDate) {
return stepBuilderFactory.get("simpleStep1") //simpleStep1 batch step을 생성
.tasklet((contribution, chunkContext) -> { //step 안에서 수행될 기능들을 명시, tasklet은 step 안에서 단일로 수행될 커스텀한 기능을 선언할 때 사용
log.info(">>>>> This is Step1");
log.info(">>>>> requestDate = {}",requestDate);
return RepeatStatus.FINISHED; //batch가 성공적으로 수행되고 종료됨을 반환
})
.build();
}
사용밥법은 다음과 같이 Scope를 선언해주고 @Value()
안에 SpEL로 작성해주면 된다.
SpEL
Spring 표현언어로 Spring 내에서 사용하는 문법이다.
Batch는 @StepScope
와 @JobScope
라는 Bean Scope를 지원한다. 이 Bean Scope를 보기 전 Spring의 기본 Scope는 singleton인데 위 두 Scope를 사용하게되면 Batch가 Spring 컨테이너를 통해 지정된 Step의 실행시점에 해당 컴포넌트를 Spring Bean으로 생성해준다.
@StepScope와 @JobScope는 Job이 실행되고 종료될 때 생성/삭제가 이루어진다.
이렇게 Bean의 생성 시점을 Step 혹은 Job의 실행시점으로 지연시키면서 얻는 장점은 2가지가 있다.
JobParamter의 Late Binding
JobParameter가 StepContext 또는 JobExcutionContext 레벨에서 할당 시킬 수 있다. 무조건 어플리케이션이 실행되는 시점이 아닌 비지니스 로직 처리 단계에서 Job Parameter를 할당시킬 수 있다.
동일한 콤포넌트를 병렬 혹은 동시에 사용해야할 경우
Step 안에 Tasklet이 있고, 이 Tasklet은 멤버 변수와 이 멤버 변수를 변경하는 로직이 있을 때 StepScope
가 있다면 각 Step에 별도의 Tasklet을 생성하고 관리하기 때문에 각자의 상태를 침범하지 않는다.