[Spring] @Transactional

Jisu_M·2024년 11월 21일

@Transactional이란?

Spring에서 제공하는 어노테이션으로, 트랜잭션 시작과 종료를 자동으로 관리한다.

비즈니스 로직 실행 중 문제가 발생하면 데이터를 롤백(Rollback)하고, 정상적으로 실행되면 커밋(Commit)합니다.

그렇다면, @Transactional을 사용하면 어떻게 자동으로 관리 되는 걸까?

Transaction은 데이터베이스를 작업하는 하나의 단위로 알고 있었다. 다만, 어노테이션을 사용하면 해당 메소드가 어떻게 트랜잭션으로 관리되는지 고민해보지 않았다.

❗️그렇다면 과연 동작 원리가 어떻게 되는가?

다음과 같이 @Transactional은 AOP와 프록시 객체를 통해 작동한다.

  1. 프록시 객체 생성:
    • Spring은 @Transactional이 선언된 메서드를 호출할 때 프록시 객체를 생성한다.
  2. 트랜잭션 시작:
    • 프록시 객체가 메서드 호출을 가로채고, 트랜잭션을 시작한다.
  3. 비즈니스 로직 실행:
    • 프록시가 원래 객체의 메서드를 실행한다.
  4. 트랜잭션 종료:
    • 비즈니스 로직이 정상적으로 종료되면 트랜잭션을 커밋, 예외 발생 시 롤백한다.

AOP와 프록시 객체는 무엇일까?

  • AOP : 관점 지향 프로그래밍으로, 애플리케이션의 핵심 비즈니스 로직과 이를 지원하는 공통 관심사를 분리하는 프로그래밍 패턴

  • 프록시 객체 : 프록시는 대리 객체로, 원래 객체 대신 동작하며 추가적인 기능을 제공한다. Spring에서 AOP를 구현할 때, 프록시 객체를 사용하여 실제 비즈니스 로직 앞뒤로 공통 로직(Aspect)을 삽입한다.

  • 프록시 동작 방식:

  1. Spring이 @Transactional과 같은 AOP를 감지.
  2. 실제 클래스 대신 프록시 객체를 생성.
  3. 프록시 객체가 호출을 가로채고, 트랜잭션을 시작하거나 종료하는 등의 부가 작업을 처리.
  4. 프록시 객체는 원래 객체의 메서드를 호출.

이렇게 @Transactional을 통해 트랜잭션으로 관리하며 JPA의 영속성 컨텍스트를 사용할 수 있게 된다.

profile
개발 여정을 기록하며 성장하는 매일

0개의 댓글