@JobScope, @StepScope
- @JobScope과 @StepScope 어노테이션이 붙은 Bean 선언 시 내부적으로 Bean의 Proxy 객체가 생성
- 두 어노테이션 모두 Bean의 Class Type 프록시 생성
- @Scope(value= "job", proxyMode = ScopedProxyMode.TARGET_CLASS)
- @Scope(value = "step", proxyMode = ScopedProxyMode.TARGET_CLASS)
- Spring Framework의 핵심인 AOP를 활용해 Job 실행 시 Proxy 객체가 실제 Bean을 호출해서 해당 메서드를 실행시키는 구조
- JdkDynamicAopProxy
- 즉, JobScope와 StepScope는 실제 대상이 되는 Bean을 동록 및 해제하는 역할
- 실제 Bean을 저장하고 있는 JobContext, StepContext를 가지고 있으며 이는 Spring Framework의 ApplicationContext와 유사한 역할
JobContext, StepContext
- 스프링 컨테이너에서 생성된 Bean을 저장하는 컨테이너 역할
- 실제 대상이 되는 Bean을 저장하고 있어 StepContext에서 Tasklet 및 ItemReader, ItemProcessor, ItemWriter 접근 가능
- Job의 실행 시점에서 Proxy 객체가 실제 Bean을 참조할 때 사용됨
- Runtime 시점인 것이 핵심
아래는 실제 JobScope.java 클래스 내 실제 빈을 생성하는 시점에 빈 생성 및 @Value 바인딩 처리하는 코드입니다.
@JobScope, @StepScope 아키텍처
전체적인 플로우는 아래와 같습니다.
- Spring 애플리케이션 구동
- @JobScope이 적용된 Bean이 있는지 유무를 확인
- 없을 경우 기본 Singleton Bean 생성
- 이때 파라미터로 @Value 적용 시 오류가 발생
- @JobScope이 적용된 Bean이 있을 경우 JdkDynamicAopProxy 생성
- 이로써 Spring Container 초기화 완료 및 Job이 JobLauncher에 의해 실행
- Job은 현재 Step의 Proxy 객체를 저장하고 있으며 Proxy 객체는 Step 메서드 호출 시 실제 Bean 객체를 참조하는데 이 시점에 Step Bean이 생성
- 위에 첨부한 코드 사진과 동일한 Flow를 진행
- Proxy의 실제 Bean 등록 및 관리를 하는 JobScope 내 JobContext에 Bean이 존재하는지 확인
- 존재할 경우 JobContext에서 Step Bean을 꺼내서 Tasklet 실행
- 존재하지 않을 경우 BeanFactory에 의해 Runtime 시점에 Step Bean 생성 및 @Value Binding 처리를 한 뒤 JobContext에 Step Bean을 저장하고 Tasklet을 실행
위 내용을 정리한 그림
출처
스프링 배치 - Spring Boot 기반으로 개발하는 Spring Batch (정수원 강사님)
반응형
'Spring' 카테고리의 다른 글
[Spring Batch] Skip, Retry 정책 (0) | 2023.09.14 |
---|---|
[Spring Batch] SimpleFlow 아키텍처 (0) | 2023.07.17 |
[Spring Batch] FlowJob 아키텍처 (0) | 2023.07.11 |
[Spring Batch] TaskletStep 아키텍처 (0) | 2023.07.11 |
[Spring Batch] SimpleJob 아키텍처 (0) | 2023.07.10 |