본문 바로가기
Programming Language/Spring

[Spring] 스프링 트랜잭션

by happy coding! 2022. 9. 30.
반응형

트랜잭션이란

트랜잭션은 완전히 성공 하거나 완전히 실패하는 일련의 논리적 작업 단위 입니다.

@Transactional 애노테이션

스프링 트랜잭션은 프로그래밍 방식과 선언적 방식의 두가지 방식으로 구분할 수 있습니다.

프로그래밍 방식

  1. TransactionTemplate
  2. 직접 PlatformTransactionManager 구현하기
  • 트랜잭션 관리가 비즈니스 로직과 함께 사용되기 때문에 프로그래밍 방식으로는 널리 사용되지 않음
  • 하지만 기능이 몇가지 밖에 없는 애플리케이션에서는 트랜잭션 프록시를 통한 부하가 중한 작업으로 느껴질 수 있어서 프로그래밍 방식이 사용될 수 있음

선언적 방식 (@Transactional)

메서드 혹은 구현체 클래스 상단에 @Transactional 애노테이션을 사용합니다. 클래스 수준에서 사용되는 경우 메서드 전체에 전역으로 적용됩니다.

public class OrderService {
    @Transactional
    public ovid orderMethod() {
    }
}

OrderService가 다른 클래스에 주입되면 Spring은 냉부적으로 아래와 같은 클래스를 생성하여 대신 주입합니다.

class ProxyOrderService extends OrderService {
  private OrderService orderService;

  public ProxyOrderService(OrderService s){
    this.orderService = s;
  }

  @Override
  public void orderMethod(){
    try{
      // 트랜잭션 시작
      orderService.orderMethod();
      // 트랜잭션 커밋
    } catch(Exception e){
      // 트랜잭션 롤백
    }
  }
}

이를 프록시(Proxy) 패턴이라고 합니다. 실제 호출되는 메서드는 프록시이며 내부적으로 target(본쳬)를 호출합니다.

  • 트랜잭션 관리가 비즈니스 로직과 별도로 분리되어 있기 때문에 널리 사용됨
  • Spring AOP 프록시를 활용하여 적절한 TransactionManager로 메서드 호출 주변의 트랜잭션을 구동함
  • XML과 애노테이션을 활용하여 수행할 수 있으며 요즘에는 대부분 애노테이션 기반으로 사용함

propagation

트랜잭션 전파를 위한 설정입니다. 이것은 트랜잭션 동작을 설정하는데 매우 중요한 속성입니다.

  • REQUIRED (default) — 현재 트랜잭션 지원, 존재하지 않는 경우 새 트랜잭션 생성
  • REQUIRES_NEW — 새로운 트랜잭션을 생성하고 존재하지 않는 경우 현재 트랜잭션을 일시 중단합니다.
  • MANDATORY — 현재 트랜잭션을 지원하고 존재하지 않는 경우 예외를 던집니다.
  • NESTED — 현재 트랜잭션이 있는 경우 중첩된 트랜잭션 내에서 실행
  • SUPPORTS — 현재 트랜잭션을 지원하지만 존재하지 않는 경우 비트랜잭션으로 실행

isolation

트랜잭션의 격리 수준입니다. 트랜잭션이 다른 트랜잭션과 격리되어야 하는 수준을 설정합니다.

  • DEFAULT — 데이터 소스의 기본 격리 수준
  • READ_UNCOMMITTED — Dirty Read, Non-Repeatable Read 및 Phantom Read가 발생할 수 있음을 나타냅니다. 다른 트랜잭션의 커밋되지 않은 데이터도 읽을 수 있음.
  • READ_COMMITTED — Dirty Read를 방지하고 반복할 수 없으며 Phantom Read가 발생할 수 있음을 나타냅니다. 커밋된 데이터만 읽음. 반복조회시 커밋 시점에 따라 데이터 상이.
  • REPEATABLE_READ — Dirty Read와 Non-Repeatable Read가 방지되지만 Phantom Read가 발생할 수 있음을 나타냅니다. 반복적으로 조회하여도 동일한 데이터를 보장
  • SERIALIZABLE — Dirty Read와 Non-Repeatable Read, Phantom Read가 방지될 수 있음을 나타냅니다. 데이터 처리의 직렬화를 보장.

readOnly : 트랜잭션이 읽기 전용인지 또는 읽기/쓰기인지 여부
timeout : 트랜잭션 타임아웃(처리 시간초과)
rollbackFor : 트랜잭션의 롤백을 발생시켜야 하는 예외(Exception) 클래스의 배열
rollbackForClassName : 트랜잭션의 롤백을 발생시켜야 하는 예외 클래스 이름의 배열
noRollbackFor : 트랜잭션 롤백을 유발하지 않아야 하는 예외 클래스 개체의 배열
noRollbackForClassName : 트랜잭션 롤백을 유발하지 않아야 하는 예외 클래스 이름의 배열

반응형

댓글