[공지] SMS114.CO.KR 바로가기
www.sms114.co.kr
👉 텔레그램 상담 바로가기

최대 1 분 소요

트랜잭션 AOP 주의 사항 - 초기화 시점

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 InitTxTestConfig {
		@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(value = ApplicationReadyEvent.class)
		@Transactional
		public void init2() {
			boolean isActive = TransactionSynchronizationManager.isActualTransactionActive();
			log.info("Hello init ApplicationReadyEvent tx active={}", isActive);
		}
	}
}    

위에서 보는 것 처럼, 초기화 코드(예: @PostConstruct )와 @Transactional 을 함께 사용하면 트랜잭션이 적용되지 않는다

@PostConstruct
@Transactional
public void initV1() {
	log.info("Hello init @PostConstruct");
}

초기화 코드가 먼저 호출되고, 그 다음 트랜젝션 AOP가 적용되기 때문이다. 꼭 기억하자.

댓글남기기