@Transactional 어노테이션과 @PostContruct 어노테이션을 함께 사용하면 @Transactional 어노테이션이 적용되지 않는다.
초기화가 먼저 일어난 이후 트랜잭션 AOP가 동작하기 때문이다.
@SpringBootTest
public class InitTxTest {
@Test
public void test() throws Exception {
System.out.println("TEST");
}
@TestConfiguration
static class InitTxTestConfig {
@Bean
Hello hello() {
return new Hello();
}
}
static class Hello {
@PostConstruct
@Transactional
public void initV1() {
boolean isActive = TransactionSynchronizationManager.isActualTransactionActive();
System.out.println("@PostConstruct isActive = " + isActive);
}
}
}
위 테스트 코드를 실행하면 결과는 아래와 같다.

초기화 직후 트랜잭션 AOP를 적용하는 방법
@EventListener 어노테이션을 사용해서 초기화 직후 트랜잭션 AOP를 적용할 수 있다.
@EventListener 속성에 ApplicationReadyEvent.class를 넣으면 된다.
스프링의 모든 Bean이 컨테이너에 쌓이고 모든 초기화 과정을 거치면, @EventListener(ApplicationReadyEvent.class)가 실행된다.
@SpringBootTest
public class InitTxTest {
@Test
public void aa() throws Exception {
System.out.println("dd");
}
@TestConfiguration
static class InitTxTestConfig {
@Bean
Hello hello() {
return new Hello();
}
}
static class Hello {
@EventListener(ApplicationReadyEvent.class)
@Transactional
public void initV2() {
boolean isActive = TransactionSynchronizationManager.isActualTransactionActive();
System.out.println("@EventListener isActive = " + isActive);
}
}
}
