Spring Framework 프로젝트에서 적용되던 @Transactional 어노테이션이 Spring Boot 프로젝트에서 적용되지 않는 문제 발견
public interface Super {
@Transactional(timeout = 3)
public void foo();
}
public class Sub implements {
@Override
public void foo() {
// Spring Framework 의 경우 transaction 이 적용됨
// Spring Boot 의 경우 transaction 이 적용되지 않음
...
}
}
Spring Framework 의 경우 JDK Dynamic Proxy(인터페이스 기반) 로 Proxy 를 생성하고
Spring Boot 의 경우 CGLib(클래스 기반) 로 Proxy 를 생성한다.
CGLib 으로 처리 시, 인터페이스에 선언된 어노테이션이 구현 클래스로 상속되지 않아 TransactionInterceptor 가 동작하지 않음.
public class Sub implements {
@Override
@Transactional(timeout = 3)
public void foo() {
// 구현체에 직접 어노테이션을 적용하였을 경우
// Spring Framework 와 Spring Boot 모두 transaction 이 적용됨
...
}
}
Spring Boot 의 pplication.properties 에 해당 설정 추가
spring.aop.proxy-target-class=false
각 AOP Proxy 에 대한 상세 정보는 아래 링크 참고
https://gmoon92.github.io/spring/aop/2019/04/20/jdk-dynamic-proxy-and-cglib.html