작성
·
278
0
트랜잭션 AOP 주의 사항 - 프록시 내부 호출2
강의 질문입니다.
@TestConfiguration
static class InternalCallV1TestConfig {
@Bean
CallService callService() {
return new CallService(new InternalService());
}
/*@Bean
InternalService internalService() {
return new InternalService();
}*/
}
위 코드에서 보시는 것과 같이 InternalService를 직접 빈으로 등록해주지 않고 CallService생성자 안에서 InternalService를 주입시켜주면 트랜잭션이 적용되지 않던데, 꼭 InternalService를 빈으로 직접 등록해줘야 하나요??
답변 1
4
안녕하세요!
먼저 결론부터 말씀드리자면, 빈으로 등록한 InternalService
를 사용해야만 트랜잭션이 적용이 됩니다.
그 이유는 트랜잭션 동작원리을 살펴보면 알 수 있습니다!
스프링 빈 생성
만약 해당 빈이 트랜잭션 적용대상(@Transacational 존재 유무 확인)이면 BeanPostProcessor
에 해당 빈이 전달됩니다.
BeanPostProcessor
에서는 해당 빈을 트랜잭션이 적용된 프록시 빈으로 변환 하여 스프링 컨테이너에 변환한 빈을 저장합니다.
따라서 트랜잭션을 사용하기 위해서는, new
키워드를 통해 직접 생성한 인스턴스가 아닌 스프링 빈으로 등록된 인스턴스를 사용해야 트랜잭션이 적용됩니다.
감사합니다!
감사합니다!