[SpringBoot] @Transactional 어노테이션

해니·2023년 12월 7일
0

SpringBoot

목록 보기
4/24
post-thumbnail

트랙잭션 특징

원자성 (Atomicity)

  • 트랜잭션의 작업이 부분적으로 실행되거나 중단되지 않는 것을 보장한다.
  • 트랜잭션이 DB에 모두 반영되거나 혹은 전혀 반영되지 않아야 한다.
    (All or Nothing)

일관성 (Consistency)

  • 트랜잭션의 작업 처리 결과는 항상 일관성이 있어야 한다.
  • 트랜잭션 수행 전, 후에 데이터 모델의 모든 제약 조건(기본키, 외래 키, 도메인, 도메인 제약조건 등)을 만족해야 한다.
    ex) 작성 테이블의 본문 내용의 글자 제한이 255글자이고, 트랜잭션이 일어나면 글자 제한 조건을 만족해야만 트랜잭션이 수행되고 위반한다면 거부해야 한다.

독립성 (Isolation)

  • 트랜잭션 수행 시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장해야 한다.
  • 격리성을 보장하기 위해서는 Lock & Unlock 기법을 사용한다.
    • 데이터를 읽거나 쓰기 작업 중일 때는 해당 영역에 Lock을 걸어서 다른 트랜잭션이 접근하지 못하도록 한다.
    • 먼저 들어온 트랜잭션의 요청이 끝나면 Unlock 하여 다른 트랜잭션이 처리될 수 있도록 허용한다.

지속성 (Durability)

  • 성공적으로 수행된 트랜잭션은 영원히 반영되어야 한다.
  • 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행했다면 해당 데이터는 데이터베이스에 영원히 반영이 되어야 한다.



🗒️ 데이터베이스 트랜잭션이란?

  • 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위
  • 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다.



@Transactional 란?

  • 스프링에서 많이 사용되는 선언적 트랜잭션 방식
  • 클래스 또는 메서드 위에 @Transactional을 붙이면, 트랜잭션 기능이 적용된 프록시 객체가 생성되며, 트랜잭션 성공 여부에 따라 Commit 또는 Rollback 작업이 이루어진다.



@Transactional 사용 방법

  • 레거시 스프링에선 @Transactional 어노테이션을 사용하기 위해선 PlatformTransactionManager 와 어노테이션 활성화 설정이 필요하다.
  • 스프링 부트에선 @EnableTransactionManagement 설정이 되어 있어서 자동으로 사용할 수 있으며 사용을 원하는 클래스 또는 메서드에 @Transactional 어노테이션을 적용하면 된다.
  • 스프링 컨테이너는 @Transactional 어노테이션이 있으면, 해당 타겟 빈을 상속받은 프록시 객체를 생성한다.
    • private 메서드는 상속이 불가하기 때문에 어노테이션을 붙여도 동작하지 않는다.

PlatformTransactionManager

  • 스프링이 제공하는 TransactionManager의 최상위 인터페이스로, 환경에 맞는 클래스를 주입할 수 있도록 구성되어 있다.
  • DataSourceTransactionManger, JpaTransactionManager 등 필요한 정보를 Bean으로 등록하고 DI를 받아 사용한다.



@Transcational 동작 원리

  • @TransactionalSpring AOP를 통해 프록시 객체를 생성하여 사용된다.
    • 스프링에서 Target 객체를 직접 참조하지 않고, 프록시 객체를 사용하는 이유는, Aspect 클래스에서 제공하는 부가 기능을 사용하기 위해서이다. (기존 코드 변경 없이 접근 제어 및 부가 기능을 추가)
    • Target 객체를 직접 참조하는 경우, 원하는 위치에서 직접 Aspect 클래스를 호출해야하기 때문에 유지보수가 어려워진다.
  • 스프링에서 사용하는 프록시 구현체는 JDK Proxy(Dynamic Proxy), CGLib 두 가지가 있다.
    • JDK Dynamic Proxy : Target 클래스가 인터페이스 구현체일 경우 생성되며, 구현 클래스가 아닌 인터페이스를 프록시 객체로 구현해서 코드에 끼워넣는 방식이다.
    • CGLib Proxy : 스프링에서 사용하는 디폴트 프록시 생성방식으로, Target 클래스를 프록시 객체로 생성하여 코드에 끼워넣는 방식이다.





출처
[Spring] 트랜잭션과 @Transactional 총 정리
스프링 트랜잭션 동작 원리 (@Transactional, AOP)
[DB] 트랜잭션(transaction)이란?
[Spring] AOP와 JDK Dynamic Proxy, CGLIB

profile
💻 ⚾️ 🐻

0개의 댓글