<aside> 💡
요약
배치 프로젝트 스프링 프레임워크-Quartz 를 기반으로 Quartz Job 생성 시 Spring DI(@Autowired)를 활용하지 못하고 ApplicationContext 직접 접근 방식으로 구현 이를 개선하여 Spring DI 를 100% 활용할 수 있도록 개선
</aside>
ApplicationContext
를 통해 직접 조회하는 방식으로 구현배치 프로젝트는 Spring Framework + Quartz 기반으로 작성되어 있다.
context-scheduler.xml
배치 Job / Trigger 를 정의하고 배치 서버 마다 Trigger 리스트 할당
schedulerFactory
- SchedulerFactoryBean
은 Quartz의 핵심 구성 요소인 Scheduler 객체를 생성하고 관리하는 역할을 합니다.
이 팩토리 빈을 통해 Quartz 스케줄러 초기화되며, 설정된 Job, Trigger, JobFactory 등을 Quartz 스케줄러에 등록합니다.
XML 설정에서 JobDetailFactoryBean
을 사용해 Quartz Job( PriviaCouponScheduler
)을 정의할 경우, Quartz 스케줄러가 해당 Job의 인스턴스를 직접 생성합니다.
JobDetailFactoryBean
은 XML 설정으로 등록된 Job의 클래스 이름( jobClass )을 기반으로 JobDetail을 생성합니다. 이 과정에서 Job의 실제 구현체를 초기화하지만, Spring 에서 관리되지 않습니다.
새로 구현할 스케줄러를 QuartzJobBean
을 상속받아 구현
PriviaCouponScheduler
BeanUtils.getBean("priviaCouponServiceImpl")
을 통해서 실제 Bean 으로 등록한 Service 를 가져온다.
getBean 을 이용해서 직접 접근할까?
PriviaCouponServiceImpl
을 주입하지 못하게 됩니다.이유는 Quartz와 Spring의 인스턴스 생성 방식 차이
일반적인 JobFactory
의 구성을 보면 createJobInstance
을 통해서 생성자를 리플렉션 기반으로 생성할 뿐 Spring Context 와 관련된 여부는 보이지 않는다.
즉, @Autowired 를 통하지 않고, Bean Context 에 접근해서 가져오는 이유는 Job Detail ( PriviaCouponScheduler
) 를 생성하는 건 Quartz 인스턴스 생성 방식으로 처리가 되고 이때, Spring 에 관리되는 범위가 아니기에 사용할 수 없는 것이다.