트랜잭션 - AOP(초기화 시점)

박찬우·2024년 2월 8일

스프링 DB

목록 보기
41/53

초기화 시점

  • 스프링 초기화 시점에는 트랜잭션 AOP가 적용되지 않을 수 있다.

예)

@SpringBootTest
public class InitTxTest {

    @Autowired
    Hello hello;

    @Test
    void go() {

    }

    @TestConfiguration
    static class InitTxConfig{
        @Bean
        Hello hello() {
            return new Hello();
        }
    }

    @Slf4j
    static class Hello {
        @PostConstruct
        @Transactional
        public void initV1() {
            boolean isActive = TransactionSynchronizationManager.isActualTransactionActive();
            log.info("hello post={}", isActive);
        }

        @EventListener(value = ApplicationReadyEvent.class)
        @Transactional
        public void initV2() {
            boolean isActive = TransactionSynchronizationManager.isActualTransactionActive();
            log.info("hello event={}", isActive);
        }

    }
}
  • initV1() - @PostConstruct
    • 초기화 코드가 먼저 호출되고, 그 다음에 트랜잭션 AOP가 적용되기 때문에 초기화 시점에는 해당 메서드에서 트랜잭션을 획득할 수 없다.
  • init2() - ApplicationReadyEvent
    • 이 이벤트는 트랜잭션 AOP를 포함한 스프링이 컨테이너가 완전히 생성되고 난 다음에 이벤트가 붙은 메서드를 호출해 준다. 따라서 트랜잭션이 적용됨
profile
진짜 개발자가 되어보자

0개의 댓글