--
@Transactional
이란?Spring에서 제공하는 @Transactional
어노테이션은 해당 메서드 혹은 클래스가 데이터베이스 트랜잭션의 경계를 정의한다는 것을 나타낸다.
이 어노테이션은 메서드 실행 전에 트랜잭션을 시작하고 메서드가 종료될 때 트랜잭션을 커밋(또는 롤백 = TEST)한다.
@Transactional
이 설정된 메서드에서 JPA의 EntityManager
(또는 Hibernate의 Session
)는 트랜잭션 범위 내에서 동작한다.Spring의 @Transactional
은 AOP를 기반으로 동작한다.
@Transactional
이 붙은 메서드가 호출될 때 Spring은 프록시를 사용하여 원래의 메서드 호출을 가로채고 트랜잭션 관련 코드를 주입한다.
이로 인해 트랜잭션 시작, 커밋, 롤백 등의 작업이 메서드의 실행 전/후에 자동으로 수행된다.
--
RuntimeException
@Transactional
은 기본적으로 런타임 예외가 발생할 경우에만 롤백을 수행한다.
만약 체크된 예외에 대해 롤백을 원한다면 @Transactional(rollbackFor = ExceptionClass.class)
와 같은 방식으로 명시해야 한다.
프록시
@Transactional
이 동작하려면 Spring이 프록시를 생성할 수 있어야 한다.
따라서 final 메서드나 final 클래스에는 @Transactional
을 사용할 수 없다.
트랜잭션의 전파
트랜잭션의 전파 방식은 @Transactional
의 속성으로 지정할 수 있다.
예를 들어 이미 실행 중인 트랜잭션이 있을 때 새로운 트랜잭션을 시작할 것인지 기존 트랜잭션을 사용할 것인지 등을 결정할 수 있다.