• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

InternalService 빈 등록 질문

23.09.22 19:31 작성 조회수 197

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

답변을 작성해보세요.

3

김효권님의 프로필

김효권

2023.09.22

안녕하세요!

먼저 결론부터 말씀드리자면, 빈으로 등록한 InternalService 를 사용해야만 트랜잭션이 적용이 됩니다.

그 이유는 트랜잭션 동작원리을 살펴보면 알 수 있습니다!

  1. 스프링 빈 생성

  2. 만약 해당 빈이 트랜잭션 적용대상(@Transacational 존재 유무 확인)이면 BeanPostProcessor 에 해당 빈이 전달됩니다.

  3. BeanPostProcessor에서는 해당 빈을 트랜잭션이 적용된 프록시 빈으로 변환 하여 스프링 컨테이너에 변환한 빈을 저장합니다.

     

따라서 트랜잭션을 사용하기 위해서는, new 키워드를 통해 직접 생성한 인스턴스가 아닌 스프링 빈으로 등록된 인스턴스를 사용해야 트랜잭션이 적용됩니다.

감사합니다!

backisback님의 프로필

backisback

질문자

2023.09.23

감사합니다!