작동
- Job 과 Step 의 빈 생성과 실행에 관여하는 스코프
- 프록시 모드를 기본값으로 하는 스코프
- 해당 스코프가 선언되면 빈의 생성이 어플리케이션 구동시점이 아닌 빈의 실행 시점에 이루어진다.
- 프록시 모드로 빈이 선언되기 때문에 어플리케이션 구동시점에는 빈의 프록시 객체가 생성되어 실행 시점에 실제 빈을 호출해준다.
사용 이유
@Value
를 통해 jobParameter, jobExecutionContext, stepExecutionContext 사용 가능
- JobParameter 를 빈의 실행 시점에 값을 참조할 수 있음 (Late Binding)
- Job Parameter 를 StepContext 또는 JobContext 레벨에서 할당시킬 수 있음
- 어플리케이션의 실행 시점이 아니더라도 Controller 나 Service 와 같은 비즈니스 로직 처리 단계에서 Job Parameter 를 할당 가능
- 동일한 컴포넌트를 병렬 혹은 동시에 사용할 때 유용
- 병렬 혹은 동시에 사용되어야 하는 컴포넌트에 멤버 변수와 이 멤버 변수를 변경하는 로직이 있을 경우,
@StepScope
없이 실행시키면 서로 다른 Step에서 하나의 컴포넌트의 상태를 변경하게됨
@StepScope
가 있다면 각각의 Step 에서 별도로 컴포넌트를 생성하고 관리하기 때문에 서로의 상태를 침범할 일 없음
주의
@Bean
@StepScope
Public ItemReader reader() {...}
@Bean
@StepScope
Public JpaPagingItemReader reader() {...}
@StepScope
의 proxyMode = ScopedProxyMode.TARGET_CLASS
이기 때문에 인터페이스 타입으로 빈을 반환할 경우 해당 인터페이스의 프록시 객체를 생성하게 됨
- 인터페이스의 구현체의 메서드를 사용해야되는 것이 있는데 이를 사용할 수 없음
ItemReader
의 인터페이스는 read()
밖에 없어서 ItemStream
의 메서드를 사용할 수 없음
JpaPagingItemReader
에서는 ItemStream
의 메서드를 사용
참고