스프링에서는 트랜잭션 처리를 위하여 선언적 트랜잭션을 사용한다고 한다.
선언적 트랜잭션은 1) 설정 파일 2) 어노테이션 이 2가지 방식으로 트랜잭션에 관하여 정의할 수 있다.
선언적 트랜잭션의 1) 사용방법 및 2) 동작원리와 3) 주의할 점에 대하여 살펴보면 다음과 같다.
@Transactional을 클래스 단위 또는 메서드 단위에 선언한다. 클래스 단우에 선언하게 되면, 해당 클래스에 속한 메서드에 공통적으로 적용하게 된다. 메서드에 적용한다면, 해당 메서드에만 적용하게 된다.
어노테이션 기준으로 작성해보면, 트랜잭션은 Spring AOP를 통해 구현되어 있다.
import org.springframework.transaction.annotation.Transactional;
또한 다음의 특징을 가진다.
클래스 메서드 - 클래스 - 인터페이스 메소드 - 인터페이스의 순으로 우선순위가 낮아진다. 즉, 클래스 메서드에 선언된 트랜잭션의 우선순위가 가장 높고 인터페이스에 선언된 트랜잭션의 우선순위가 가장 낮음을 알 수 있다.
특히, 인터페이스보다 클래스에 @Transactional을 적용하는 것을 권고한다.
@Transactional에는 Proxy Mode, AspectJ Mode 두 가지가 존재한다. 그 중에서도 Proxy Mode가 Default로 설정 되어 있다.
대부분의 경우 Proxy Mode를 사용할텐데, 주의해야하는 점을 작성해보면