Spring Transactional 과 메소드 접근제어 수준

Transactional 선언 메소드는 public 으로 지정하자

@Transactional 어노테이션을 이용하여 선언적 트랜잭션 메소드를 작성할 때는 주의해야 할 점이 있다.
메소드의 접근제어 수준을 public 으로 설정해야 Spring 에서 지원하는 트랜잭션을 획득 할 수 있다는 점인데, 이 스펙을 지키지 않으면 원하는 동작을 기대할 수 없을 것이다.

이유를 파헤쳐보자

스프링이 어플리케이션 컨텍스트를 구성하는 과정중에는 @Transactional 어노테이션을 스캔하여 트랜잭션 후보군을 탐색하는 과정이 존재한다.

트랜잭션 후보군을 탐색하는 작업은 AbstractFallbackTransactionAttributeSource 클래스를 상속받은 AnnotationTransactionAttributeSource 클래스가 담당하고 있다.

AbstractFallbackTransactionAttributeSource 에서 트랜잭션 후보군 탐색 로직의 일부분을 확인해보자 image 이 메소드는 allowPublicMethodsOnly() 값과 타겟 메소드의 public 여부에 따라 nullfast - return 하도록 작성되어 있다.

allowPublicMethodsOnly() 메소드를 확인 해보자 image 기본 전략은 false 를 리턴하게 되어 있지만, 재구현을 가능성을 고려하여 설계된 메소드이다.

기본 구현체인 AnnotationTransactionAttributeSource 클래스를 확인해보자. image 설정변경이 가능하긴 하지만, 기본값은 public 메소드만 허용하는 것으로 되어있는 것을 확인할 수 있다.

기본 설정이 이렇기 때문에 public 메소드가 아니라면 @Transactional 어노테이션이 선언되어 있다고 하더라도, 메소드 접근제어 수준이 public 이 아니라면 트랜잭션을 획득하지 못한다.

관련링크

Back to Top ↑

댓글남기기