강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

이준혁님의 프로필 이미지
이준혁

작성한 질문수

스프링 배치

JobLauncher

job launcher 캐스팅 문제 질문

작성

·

302

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

안녕하세요! simpleJobLauncher 캐스팅 관련해서 궁금한게 있습니다.
SimpleJobLauncher simpleJobLauncher = (SimpleJobLauncher) basicBatchConfigurer.getJobLauncher();

이렇게 캐스팅을 하는 이유는 jobLauncher에서 직접적으로 캐스팅을 할 수 없는 문제가 있어서 한다고 배웠습니다.

확인해보니 JobLauncher는 jdk dynamic proxy로 생성되어져있는데 cglib가 아닌 특별한 이유가 있을까요?

 

 

퀴즈

스프링 배치에서 배치 처리의 가장 높은 수준 개념이자 전체 배치 프로세스의 설계도 역할을 하는 것은 무엇일까요?

Step

JobInstance

Job

JobExecution

답변 1

2

정수원님의 프로필 이미지
정수원
지식공유자

JobLauncher 인터페이스 타입으로 빈을 설정하는 클래스인 SimpleBatchConfiguration 을 보면 다음과 같은 구문이 나옵니다. 

@Override
@Bean
public JobLauncher jobLauncher() throws Exception {
return createLazyProxy(jobLauncher, JobLauncher.class);
}

.....
......


private <T> T createLazyProxy(AtomicReference<T> reference, Class<T> type) {
ProxyFactory factory =
new ProxyFactory();
factory.setTargetSource(new ReferenceTargetSource<>(reference));
factory.addAdvice(new PassthruAdvice());
factory.setInterfaces(new Class<?>[] { type });
@SuppressWarnings("unchecked")
T proxy = (T) factory.getProxy();
return proxy;
}

보시면 JobLauncher 타입의 프록시 객체를 만들고 있는데  ProxyFactory 클래스를 보면 cglib 가 실행되도록 강제하는 proxyTargetClass = true 와 같은 설정을 별도로 하지 않고 있습니다.

즉 인터페이스 타입으로 프록시 객체를 생성하고 있기 때문에 jdk dynamic proxy 가 실행되고 있습니다.

참고로 스프링 부트는 기본적으로 cglib 방식으로 프록시를 생성하고 있지만 위와 같이 별도로 프록시를 생성하는 경우에는 우선적으로 설정을 따르고 있습니다.

이준혁님의 프로필 이미지
이준혁

작성한 질문수

질문하기