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

황지호님의 프로필 이미지
황지호

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

트랜잭션 적용 확인

DB2 - 9.스프링 트랜잭션 이해 - 트랜잭션 적용 확인 강의 관련 질문

작성

·

447

0


=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
트랜잭션이 실제 적용되고 있는지 확인하는 방법에서 TxApplyBasicTest 코드 짤때요 BasicService 프록시 객체가 스프링빈으로 자동등록되는데 왜 굳이 @TestConfiguration 에서 BasicService를 수동으로 빈 등록을 하는건가요?? 안해도 되는거 아닌가요?

어차피 프록시 객체가 등록되어있어서 @Autowired로 의존관계 주입받을 수 있지 않나요??

답변 2

1

질문 있습니다.

강의 자료를 보면 "@Transactional 애노테이션이 특정 클래스나 메서드에 하나라도 있으면 트랜잭션 AOP는 프록시를 만들어서 스프링 컨테이너에 등록한다" 라고 되어 있습니다. (11페이지 마지막줄)

저는 @Transactiona이 있으면 생성과 스프링 빈 등록까지 해주는 것으로 이해했는데, 그게 아니라 프록시 객체 생성까지만 하고, 스프링 빈 등록은 따로 해줘야 하는 건가요??

꼼꼼하게 질문해주셔서 감사합니다! 해당 질문(클릭) 에 같은 내용을 질문해주셔서 거기에 답변을 남겼습니다!

0

안녕하세요. 황지호님, 공식 서포터즈 y2gcoder입니다.

BasicService는 @TestConfiguration이 붙은 TxApplyBasicConfig 내의 @Bean이 붙은
BasicService basicService()
메서드를 통해 테스트 시 빈으로 등록되는 게 맞습니다.

@TestConfiguration
static class TxApplyBasicConfig {
        @Bean
        BasicService basicService() {
            return new BasicService();
        }
}

 

@Autowired
BasicService basicService; 

위의 @Autowired 는 아시다시피 등록된 빈을 해당 주입받아 사용하기 위한 애노테이션입니다.

@Slf4j
static class BasicService {
        @Transactional
        public void tx() {
            log.info("call tx");
            boolean txActive = TransactionSynchronizationManager.isActualTransactionActive();
            log.info("tx active={}", txActive);
        }

        public void nonTx() {
            log.info("call nonTx");
            boolean txActive = TransactionSynchronizationManager.isActualTransactionActive();
            log.info("tx active={}", txActive);
        } 
}

여기도 빈 등록을 위한 어떠한 애노테이션도 붙어있지 않은 모습을 볼 수 있습니다(@Component, @Service, @Controller 등)

해당 부분에 대해 헷갈리신다면 스프링 핵심 원리 기본편을 반복해서 수강하시는 것을 추천합니다 :)

 

감사합니다.

황지호님의 프로필 이미지
황지호
질문자

근데 저 @Transactional 붙이면 프록시 객체가 스프링 빈으로 등록되는거 아닌가요??

@Transactional 을 붙이면 프록시 객체가 생성되고 @Bean 으로 스프링 빈으로 등록해야 프록시 객체가 스프링 빈으로 등록되는건가요???

@Transactional은 해당 빈을 등록하기 전에 트랜잭션 기능을 추가한 프록시 객체로 만들어주기는 하나 해당 애노테이션에 대상을 스프링 빈으로 등록해주는 기능은 없습니다.
말씀하신 것이 맞습니다 ㅎㅎ

황지호님의 프로필 이미지
황지호

작성한 질문수

질문하기