4.Spring/4.1 이론정리

SPRING_06_ SpringBoot 로그 분석

마느링 2022. 9. 20. 11:17

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]

=> 메서드가 끝나면 트랜잭션 실행 종료