스프링에서는 트랜잭션을 어떻게 처리하는가? (5)

정원식·2023년 12월 16일
0

스프링 트랜잭션

목록 보기
5/5

22년 12월 작성한 글입니다.

개요

  • 우리는 보통 @Transactional 어노테이션을 통해 트랜잭션을 처리합니다.
  • 해당 어노테이션은 어떻게 적용이 되는지
  • 그리고 스프링에서는 트랜잭션을 어떻게 처리하는지 알아봅니다. (5.3.18 기준)
  • 이번 챕터에서는 Spring 에서 제공하는 Transaction 에 관한 레퍼런스 문서 를 일부 요약합니다.
    • ch1. Transaction Management

스프링의 트랜잭션 지원 모델을 사용할때의 장점

  • 스프링은 글로벌, 로컬 트랜잭션에 관계없이 일관된 프로그래밍 모델을 제공
  • 스프링은 트랜잭션을 다루는 선언적, 프로그래밍적 모델을 모두 제공

스프링 프레임워크의 트랜잭션 모델

  • TransactionManager 를 통해 트랜잭션 전략을 제공
    • PlatformTransactionManager: 명령형 트랜잭션
    • ReactiveTransactionManager: 리액티브 트랜잭션
  • PlatformTransactionManager 가 던지는 TransactionException 는 unchecked 예외
  • PlatformTransactionManager#getTransaction(TransactionDefinition)TransactionDefinition 에 따른 TransactionStatus 를 반환한다.
    • 파라미터로 전달되는 TransactionDefinitionPropagation, Isolation, Timeout, Read-Only 를 정의
      • Propagation: 트랜잭션이 이미 존재할때, 어떻게 행동할지 정의
      • Isolation: 트랜잭션 격리 레벨
      • Timeout: 타임아웃
      • Read-Only: 트랜잭션 내에서 읽기만 수행할때 사용
    • 반환되는 TransactionStatus 는 새로운 트랜잭션 혹은 기존에 존재하는 트랜잭션임. 그리고 현재 실행중인 스레드와 연관이 있음

리소스를 트랜잭션과 동기화

  • 기본적으로 템플릿으로 제공되는 고수준의 API 는 리소스(예시: Connection) 의 생성과 재사용, 정리를 알아서 관리해줌
  • 보다 저수준 레벨이 필요한 경우, 아래와 같은 클래스 사용하여 리소스의 생성과 재사용, 정리를 위임
    • DataSourceUtils (JDBC)
    • EntityManagerFactoryUtils (JPA)
    • SessionFactoryUtils (Hibernate)
  • 혹은 TransactionAwareDataSourceProxy 를 사용하여 리소스의 생성과 재사용, 정리를 프록시

선언적 트랜잭션 관리

  • 선언적 트랜잭션 관리는 AOP 를 통해 제공됨
    • 내부적으로 TransactionInterceptorTransactionManager 사용
  • 기본적으로는 unchecked 예외(RuntimeException 의 자식) 와 Error 발생시 롤백
  • 다른 어드바이스 적용시, Ordered 를 구현하여 적용 순서를 조정할수 있음

@Transactional

  • @Configuration + @EnableTransactionManagement 를 적용하여 사용 가능
    • Spring Boot 의 경우 org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration 에서 해당 어노테이션 적용
    • AdviceMode 와 프록시 방법을 정의할수 있음 (기본은 PROXY, JDK DynamicProxy)
  • 기본적으로 public 메서드에만 적용됨
    • TransactionAttributeSource 를 통해 protected, package-visible 메서드에도 적용 가능
  • 인터페이스 정의, 메서드, 클래스 정의(권장), 메서드(권장)에 적용 가능
    • 인터페이스에 적용하는 경우, JDK Dynamic Proxy 에서만 동작
  • 프록시 모드에서 자체 호출의 경우 적용되지 않음

Transaction Propagation

  • PROPAGATION_REQUIRED
    • 외부 트랜잭션이 존재하지 않으면 새로 생성
      • 존재하면 외부 트랜잭션에 참여 (기본적으로 외부 트랜잭션 설정을 따름)
  • PROPAGATION_REQUIRES_NEW
    • 항상 독립적으로 실제 트랜잭션을 가짐
  • PROPAGATION_NESTED
    • 롤백할 수 있는 여러 저장점이 있는 단일 물리적 트랜잭션을 사용

프로그래밍적 트랜잭션 관리

명령형 트랜잭션

  • TransactionTemplate 사용
  • PlatformTransactionManager 사용

리액티브 트랜잭션

  • TransactionalOperator 사용
  • ReactiveTransactionManager 사용

트랜잭션 범위 이벤트

  • @TransactionalEventListener 사용
  • 기본적으로 이벤트가 발생했을때, 트랜잭션이 존재해야만 동작

Reference

profile
매일매일 성장하고 싶은 백엔드 개발자입니다.

0개의 댓글

관련 채용 정보