[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 가 동작하지 않음.

해결 방안

  1. 구현 클래스에 직접 어노테이션 적용
    CGLib 는 타깃 클래스에 대해 Proxy 를 생성하므로 구현 클래스에 어노테이션 적용 시 transaction 이 적용됨
  2. 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

좋은 웹페이지 즐겨찾기