[Spring] @Transactional 어노테이션 상속
문제 상황
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 가 동작하지 않음.
해결 방안
- 구현 클래스에 직접 어노테이션 적용
CGLib 는 타깃 클래스에 대해 Proxy 를 생성하므로 구현 클래스에 어노테이션 적용 시 transaction 이 적용됨 - Spring Boot 의 AOP Proxy 기본값을 JDK Dynamic Proxy 로 변경
spring.aop.proxy-target-class=false 로 설정
해결 방안 1
public class Sub implements {
@Override
@Transactional(timeout = 3)
public void foo() {
// 구현체에 직접 어노테이션을 적용하였을 경우
// Spring Framework 와 Spring Boot 모두 transaction 이 적용됨
...
}
}
해결 방안 2
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
Author And Source
이 문제에 관하여([Spring] @Transactional 어노테이션 상속), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ette9844/Spring-Transactional-어노테이션-상속저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)