SPRING_06_ SpringBoot 로그 분석
Test 코드
package hello.springtx.apply;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.event.EventListener;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import javax.annotation.PostConstruct;
@SpringBootTest
public class initTxTest {
@Autowired Hello hello;
@Test
void go(){
//초기화 코드는 스프링이 초기화 시점에 호출.
}
@TestConfiguration
static class InitTxTextConfig{
@Bean
Hello hello(){
return new Hello();
}
}
@Slf4j
static class Hello{
@PostConstruct
@Transactional
public void initV1(){
boolean isActive = TransactionSynchronizationManager.isActualTransactionActive();
log.info("Hello init @PostConstruct tx Active={}",isActive);
}
@EventListener(ApplicationReadyEvent.class) //스프링 컨테이너가 다 뜨면 호출
@Transactional
public void initV2(){
boolean isActive = TransactionSynchronizationManager.isActualTransactionActive();
log.info("Hello init2 @EventListener tx active={}",isActive);
}
}
}
INFO 17916 --- [main] hello.springtx.apply.initTxTest$Hello : Hello init @PostConstructor tx active=false
=>initV1메소드는 @PostConstruct 애노테이션이 있기 때문에 생성자 주입전, 스프링 컨테이너가 뜨기 전에 생성됨. -> 트랜잭션은 스프링 컨테이너가 뜬 후 AOP가 적용되는 시점에 트랜잭션이 적용되기 때문에 트랜잭션 활성화가 되지 않음
INFO 17916 --- [main]hello.springtx.apply.initTxTest : Started initTxTest in 2.392 seconds (JVM running for 3.246)
=> 스프링 컨테이너가 완료가 되어서 뜬 상황 EventListener(ApplicationReadyEvent.class) 호출
TRACE 17916 --- [main] o.s.t.i.TransactionInterceptor : Getting transaction for [hello.springtx.apply.initTxTest$Hello.initV2]
=> initV2 메소드의 트랜잭션 적용 로그
INFO 17916 --- [main] hello.springtx.apply.initTxTest$Hello : Hello init @PostConstructor tx active=true
=> hello.initV2 메소드에는 EventListener(ApplicationReadyEvent.class) 스프링 컨테이너가 뜬 후에 프록시 객체를 생성하여 해당 매소드가 호출되므로 트랜잭션 실행 중인 상태임
TRACE 17916 --- [main] o.s.t.i.TransactionInterceptor : Completing transaction for [hello.springtx.apply.initTxTest$Hello.initV2]
=> 메서드가 끝나면 트랜잭션 실행 종료