Spring

[Spring Batch] @JobScope,@StepScope

꾸준함. 2023. 7. 19. 00:36

@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 바인딩 처리하는 코드입니다.

 

Runtime 시점에 실제 Bean을 참조하는 코드

 

@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