정의
JPA에서 Transaction을 지원하는 어노테이션
목적 및 특징
목적
비즈니스 로직에 Transaction관련 로직이 들어가면 가독성 감소, 변화에 유연한 대처 어려움이 발생
따라서 선언적 Transaction인 @Transactional
을 사용하면
- 소스코드에 직접 트랜잭션 관련 로직을 넣어두지 않고 비지니스 로직에서 완전히 분리하는 방식이다.
이로써 개발자는 비즈니스 로직에 집중할 수 있다.
- 이 방식을 사용하면 프로그래밍에 의한 Transaction에서 발생하는 단점인 Transaction 코드 중복 문제, 소스코드 유지보수의 문제를 모두 해결할 수 있다.
- Transaction이라는 횡단 관심사를 비지니스 로직에서 완전히 분리하기 때문에 SRP를 따르고 많은 양의 Transaction을 적용하기에도 용이하다.
특징
예시
사용 방법
- JPA를 사용한다면 단일 작업에 대해서는
@Transactional
을 직접 선언할 필요가 없다.
- JPA의 구현체를 살펴보면 모든 메서드에 이미
@Transactional
이 선언되어 있기 때문에 문제가 발생하면 Rollback 처리해주기 때문이다.
따라서
- 여러 작업을 하나의 작업 단위로 묶어 Commit or Rollback 처리가 필요할 때만 직접 선언해주면 된다.
동작 원리
PROXY 패턴을 사용하는 Spring AOP
를 활용하여 선언적 트랜잭션을 구현한다.
- 사용자가
@Transactional
이 붙은 메서드를 호출되면 AOP가 적용된 CGLIB proxy를 호출
- 트랜잭션이 시작되고 SpringBoot가 등록한 PlatformTransactionManager를 DI 받음
- 개발자가 작성한 코드 실행
- 메소드가 종료되면 결과에 따라
commit()
or rollback()
을 호출
동작 순서
우선 순위
클래스 메소드 > 클래스 > 인터페이스 메소드 > 인터페이스
모드
Proxy Mode와 AspectJ Mode가 있는데 Proxy Mode가 Default
설정