[Spring 잘 사용하기] @Transactional에 대하여

sonnng·2023년 10월 24일
0

Spring

목록 보기
21/41

스프링에서는 트랜잭션 처리를 위하여 선언적 트랜잭션을 사용한다고 한다.
선언적 트랜잭션은 1) 설정 파일 2) 어노테이션 이 2가지 방식으로 트랜잭션에 관하여 정의할 수 있다.

선언적 트랜잭션의 1) 사용방법 및 2) 동작원리와 3) 주의할 점에 대하여 살펴보면 다음과 같다.

1. 사용방법 - 어노테이션 방식

@Transactional을 클래스 단위 또는 메서드 단위에 선언한다. 클래스 단우에 선언하게 되면, 해당 클래스에 속한 메서드에 공통적으로 적용하게 된다. 메서드에 적용한다면, 해당 메서드에만 적용하게 된다.

2. 동작원리

어노테이션 기준으로 작성해보면, 트랜잭션은 Spring AOP를 통해 구현되어 있다.
import org.springframework.transaction.annotation.Transactional;

또한 다음의 특징을 가진다.

  • 클래스 또는 메서드에 @Transactional이 선언된다면 해당 클래스에 트랜잭션이 적용된 프록시 객체가 생성
  • 프록시 객체는 @Transactional이 포함된 메서드 호출시, 트랜잭션을 시작하며 Commit 또는 Rollback을 수행
  • CheckedException 또는 예외가 없을 경우 : Commit
  • UncheckedException 발생하는 경우 : Rollback

3. 주의할 점

(1) @Transactional에는 우선순위가 있다.

클래스 메서드 - 클래스 - 인터페이스 메소드 - 인터페이스의 순으로 우선순위가 낮아진다. 즉, 클래스 메서드에 선언된 트랜잭션의 우선순위가 가장 높고 인터페이스에 선언된 트랜잭션의 우선순위가 가장 낮음을 알 수 있다.

특히, 인터페이스보다 클래스에 @Transactional을 적용하는 것을 권고한다.

  • 인터페이스나 인터페이스 메서드에 적용이 가능하지만, 인터페이스 기반 프록시에서만 유효한 트랜잭션 설정이 된다.
  • 따라서 자바 어노테이션은 인터페이스로부터 상속이 되지 않는다는 특징으로 인해 클래스 기반 프록시 혹은 AspectJ 기반에서는 트랜잭션 설정을 인식할 수 없다.

(2) 트랜잭션의 모드 2가지(Proxy Mode, AspectJ Mode)

@Transactional에는 Proxy Mode, AspectJ Mode 두 가지가 존재한다. 그 중에서도 Proxy Mode가 Default로 설정 되어 있다.
대부분의 경우 Proxy Mode를 사용할텐데, 주의해야하는 점을 작성해보면

  • 반드시 public 메서드에 @Transactional을 적용하도록 한다.
    protected, private 메서드에 선언되어도 에러는 발생하지 않지만, 동작하지도 않는 특징이 있다. non-public 메서드에 적용하고자 하는 경우 AspectJ Mode를 고려할 필요가 있다고 한다.
  • @Transactional이 적용되지 않은 Public 메서드에서 @Transactional이 적용된 public 메서드를 호출할 경우 트랜잭션이 동작하지 않는다.

0개의 댓글