Spring Transactional 과 메소드 접근제어 수준
Transactional 선언 메소드는 public 으로 지정하자
@Transactional
어노테이션을 이용하여 선언적 트랜잭션 메소드를 작성할 때는 주의해야 할 점이 있다.
메소드의 접근제어 수준을 public
으로 설정해야 Spring
에서 지원하는 트랜잭션을 획득 할 수 있다는 점인데, 이 스펙을 지키지 않으면 원하는 동작을 기대할 수 없을 것이다.
이유를 파헤쳐보자
스프링이 어플리케이션 컨텍스트를 구성하는 과정중에는 @Transactional
어노테이션을 스캔하여 트랜잭션 후보군을 탐색하는 과정이 존재한다.
트랜잭션 후보군을 탐색하는 작업은 AbstractFallbackTransactionAttributeSource
클래스를 상속받은 AnnotationTransactionAttributeSource
클래스가 담당하고 있다.
AbstractFallbackTransactionAttributeSource
에서 트랜잭션 후보군 탐색 로직의 일부분을 확인해보자 이 메소드는 allowPublicMethodsOnly()
값과 타겟 메소드의 public
여부에 따라 null
을 fast - return
하도록 작성되어 있다.
allowPublicMethodsOnly()
메소드를 확인 해보자 기본 전략은 false
를 리턴하게 되어 있지만, 재구현을 가능성을 고려하여 설계된 메소드이다.
기본 구현체인 AnnotationTransactionAttributeSource
클래스를 확인해보자. 설정변경이 가능하긴 하지만, 기본값은 public
메소드만 허용하는 것으로 되어있는 것을 확인할 수 있다.
기본 설정이 이렇기 때문에 public
메소드가 아니라면 @Transactional
어노테이션이 선언되어 있다고 하더라도, 메소드 접근제어 수준이 public
이 아니라면 트랜잭션을 획득하지 못한다.
댓글남기기