@Transactional이란?

song yuheon·2023년 9월 22일
0

Spring

목록 보기
87/93
post-thumbnail

--

1. @Transactional이란?


Spring에서 제공하는 @Transactional 어노테이션은 해당 메서드 혹은 클래스가 데이터베이스 트랜잭션의 경계를 정의한다는 것을 나타낸다.
이 어노테이션은 메서드 실행 전에 트랜잭션을 시작하고 메서드가 종료될 때 트랜잭션을 커밋(또는 롤백 = TEST)한다.


2. 왜 필요한가?


  • 일관성
    트랜잭션은 여러 데이터베이스 연산을 한 논리적인 단위로 묶어 모든 연산이 성공적으로 완료되거나 (커밋) 아니면 전혀 실행되지 않은 것처럼 (롤백) 처리할 수 있게 한다.
    이를 통해 데이터 일관성을 유지할 수 있다.
  • 영속성 컨텍스트
    @Transactional이 설정된 메서드에서 JPA의 EntityManager (또는 Hibernate의 Session)는 트랜잭션 범위 내에서 동작한다.
    이로 인해 LazyInitializationException 같은 문제가 방지된다.
    왜냐하면 연관된 엔터티들은 여전히 영속성 컨텍스트 내에 있으므로 지연 로딩이 가능하게 되기 때문이다.

3. 어떻게 동작하는가?


Spring의 @Transactional은 AOP를 기반으로 동작한다.
@Transactional이 붙은 메서드가 호출될 때 Spring은 프록시를 사용하여 원래의 메서드 호출을 가로채고 트랜잭션 관련 코드를 주입한다.
이로 인해 트랜잭션 시작, 커밋, 롤백 등의 작업이 메서드의 실행 전/후에 자동으로 수행된다.

--

4. 주의점


  • RuntimeException
    @Transactional은 기본적으로 런타임 예외가 발생할 경우에만 롤백을 수행한다.
    만약 체크된 예외에 대해 롤백을 원한다면 @Transactional(rollbackFor = ExceptionClass.class)와 같은 방식으로 명시해야 한다.

  • 프록시
    @Transactional이 동작하려면 Spring이 프록시를 생성할 수 있어야 한다.
    따라서 final 메서드나 final 클래스에는 @Transactional을 사용할 수 없다.

  • 트랜잭션의 전파
    트랜잭션의 전파 방식은 @Transactional의 속성으로 지정할 수 있다.
    예를 들어 이미 실행 중인 트랜잭션이 있을 때 새로운 트랜잭션을 시작할 것인지 기존 트랜잭션을 사용할 것인지 등을 결정할 수 있다.


profile
backend_Devloper

0개의 댓글