배치를 사용하다 보면 다양한 스코프를 사용하게 됩니다.
예를 들어, 아래와 같이 step에 @JobScope를 붙일 수 있습니다.
@Bean(name = "syncKwJob")
public Job syncJob(Step syncStep) {
return jobBuilderFactory.get("syncKwJob")
.start(syncStep)
.build();
}
@JobScope
@Bean("syncStep")
public Step syncStep(ItemReader<ReplaceKw> trReplaceKwReader, ItemProcessor<ReplaceKw, ReplaceKw> trReplaceKwProcessor, ItemWriter<ReplaceKw> trReplaceKwWriter) {
log.info(">>syncStep");
return stepBuilderFactory.get("syncStep")
.<ReplaceKw, ReplaceKw>chunk(5) // 제네릭 타입을 명확하게 명시
.reader(trReplaceKwReader)
.processor(trReplaceKwProcessor)
.writer(trReplaceKwWriter)
.build();
}
Spring Batch의 스코프를 알기 전, 간단히 Spring 스코프에 대해 언급하겠습니다.
Spring Scope 스코프란 빈이 존재할 수 있는 범위를 의미합니다.
Spring에서 관리하는 객체인 Bean들은 용도에 따라 존재하고 사라지는 시점이 다릅니다.
1.싱글톤 스코프: 일반적인 Bean의 경우 싱글톤 스코프를 가집니다.
Spring 컨테이너가 시작되고 종료될 때까지 유지되며, 오직 하나만 생성되어 관리됩니다.
프로토타입 스코프: Bean의 생성과 의존관계 주입까지만 관여하고, 이후에는 관리하지 않습니다.
웹 관련 스코프:
JobScope, StepScope 위에서 본 스코프 예제를 통해 확인해 보았을 때,
따라서, Step 메소드에서 @JobScope를 붙이는 이유는 해당 스코프 안에서만 생성 및 종료되기 때문입니다.
왜 Job, Step이 실행되는 범위를 지정해야 하는지?
두 가지 장점이 있습니다.
1.JobParameter를 실행 시점까지 지연시켜 바인딩할 수 있습니다.
2. 병렬 처리가 가능하여 다른 작업의 개입 없이 진행할 수 있습니다.
Job이나 Step을 실행할 때마다 각각 다른 객체가 생성되므로,
병렬 처리는 이해할 수 있습니다.
그런데 JobParameter를 지연 바인딩한다는 것은 어떤 의미일까요?
JobParameter 지연 바인딩 JobParameter는 Job이 수행될 때 받는 파라미터입니다.
Spring Batch는 이 JobParameter가 다르면 다른 Job으로 인식하여 Job을 수행하고,
같은 경우에는 수행하지 않습니다.
따라서, Spring Batch에서는 JobParameter가 중요합니다.
(JobParameter를 Job 수행 시점의 날짜라고 가정하면 이해하기 쉽습니다.)
이렇게 중요한 JobParameter는 애플리케이션 구동 시점이 아닌, 해당 로직이 실행되는 시점에 할당되어야 합니다.
이를 지연 바인딩이라고 하며, 이러한 이점 덕분에 애플리케이션의 로직 수행에 관계없이 유연한 설계가 가능합니다.
[참고출처]