Home
Spring
Spring - @Transactional 알아보기
devfoxstar
devfoxstar
August 19, 2024
1 min

Table Of Contents

01
먼저 트랜잭션이란?
02
@Transactional 어노테이션
03
트랜잭션 동작 방식
04
주요 옵션 설정
05
사용 예제 (이것저것)
06
주의사항
07
잠깐 알아보는 Checked Exception
08
참고

먼저 트랜잭션이란?


트랜잭션은 데이터베이스의 상태를 변화시키는 일련의 작업들을 하나의 논리적 작업 단위로 묶은 것입니다.
특성은 ACID로 간단히 정리할 수 있습니다.

  • 원자성 (Atomicity)

    • 트랜잭션은 단일 작업 단위로 처리해야 합니다.
    • 단위 작업은 전부 성공하거나 일부라도 실패하면 전부 롤백 해야 합니다.
  • 일관성 (Consistency)

    • 트랜잭션 전후로 데이터베이스는 일관되게 유효한 상태여야 합니다.
    • 일관성이 지켜지지 않으면 트랜잭션은 롤백됩니다.
  • 격리성 (Isolation)

    • 동시에 여러 트랜잭션을 실행해도 서로의 상태를 볼 수 없어야 합니다.
    • 트랜잭션 간에 격리를 통해 동시성 문제를 방지합니다.
  • 지속성 (Durability)

    • 성공한 트랜잭션 결과는 영구적으로 지속되어야 합니다.
    • 결과 데이터가 다른 시스템에 영향을 받아서 변경되면 안됩니다.

@Transactional 어노테이션


@Transactional은 스프링에서 트랜잭션 전반을 선언적으로 관리하는 역할을 합니다.
주로 서비스 레이어에서 클래스나 메서드에 정의합니다.

트랜잭션 동작 방식


@Transactional이 적용되면 해당 메서드는 스프링의 AOP를 통해 프록시 객체로 감쌉니다.
연결된 프록시 객체가 트랜잭션 전반을 순서대로 제어합니다.

@Transactional → Transaction Proxy → Begin → Commit or Rollback

주요 옵션 설정


전파 (propagation)  
트랜잭션이 실행 중일 때 다음 트랜잭션 처리 방식을 정의합니다.

- REQUIRED (기본값)
    실행 중인 트랜잭션이 있는 경우 참여하고, 없으면 새로운 트랜잭션을 시작합니다.
- REQUIRES_NEW
    항상 새 트랜잭션을 시작하고, 기존 트랜잭션을 일시중지합니다.
- SUPPORTS
    실행 중인 트랜잭션이 있으면 참여하고, 없으면 트랜잭션 없이 실행합니다.
- NOT_SUPPORTED
    실행 중인 트랜잭션이 있으면 일시중지하고, 트랜잭션 없이 실행합니다.
- MANDATORY
    반드시 실행 중인 트랜잭션이 있어야 하며, 없으면 예외를 발생합니다.
- NEVER
    트랜잭션을 지원하지 않고, 실행 중인 트랜잭션이 있으면 예외를 발생합니다.    
- NESTED
    부모 트랜잭션 내에서 자식 트랜잭션을 시작합니다.
격리 수준 (isolation)  
트랜잭션 간에 상호 작용을 정의합니다.

- DEFAULT (기본값)
    기본 데이터베이스 설정을 따릅니다.
- READ UNCOMMITTED
    가장 낮은 격리 수준입니다.
    커밋되지 않은 데이터를 읽을 수 있지만, 데이터 무결성이 깨질 위험이 높습니다.
- READ COMMITED
    다른 트랜잭션이 커밋한 데이터만 읽을 수 있습니다.
    커밋 전후로 데이터가 다른 동시성 문제가 발생할 수 있습니다.
- REPEATABLE READ
    트랜잭션 실행 중에 다른 트랜잭션이 데이터를 변경해도 동일한 데이터 조회를 보장합니다.
- SERIALIZABLE
    가장 높은 격리 수준입니다.
    조회와 쓰기와 완전히 분리되어 동시성 문제 가능성이 낮습니다.
    다른 트랜잭션과 완전히 격리되어 실행되지만, 성능 저하 발생 가능성이 있습니다.
읽기 전용 (readOnly)  
트랜잭션을 읽기 전용으로 동작하며, 쓰기 작업이 발생하지 않도록 합니다.
타임아웃 (timeout)  
트랜잭션이 일정 시간 내에 완료되지 않으면 자동으로 롤백됩니다.  
기본 값은 무제한입니다.
롤백  
롤백 관련 추가 설정 옵션입니다.

- rollbackFor
    롤백을 발생 시켜야 하는 예외 클래스를 지정합니다.
- noRollbackFor
    롤백을 발생 시키지 않아야 하는 예외 클래스를 지정합니다.

사용 예제 (이것저것)


@Service
public class BookService {

    //커밋된 데이터만 조회 가능
    @Transactional(isolation = Isolation.READ_COMMITTED)
    public Book readBook() {}

    //읽기 전용
    @Transasctional(readOnly = true)
    public List<Book> readBooks() {}

    //항상 새 트랜잭션 시작
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateBooks() {}

    //RutimeException 롤백 미적용
    @Transactional(noRollbackFor = {RuntimeException.class})
    public void deleteBook() {}

}

주의사항


  • @Transactional은 AOP를 통해 프록시 객체를 활용하기 때문에 외부에서 접근이 가능해야 합니다.
    따라서 대상 메서드는 public으로 선언해야 합니다.
  • 트랜잭션 처리 우선 순위를 고려해야 합니다.
    클래스의 메소드 > 클래스 > 인터페이스의 메소드 > 인터페이스
  • RuntimeException만 롤백이 기본 적용됩니다.
    따라서 Checked Exception은 별도로 롤백을 설정해야 합니다.

잠깐 알아보는 Checked Exception


RuntimeException을 제외한 모든 Exception을 Checked Exception이라고 합니다.
반드시 예외 처리를 해야하는 Exception입니다.

반대로 Unchecked Exception은 RuntimeException과 그 하위 Exception입니다.
애플리케이션 실행 중에 발생할 수 있는 Exception으로 필수 예외 처리 대상은 아닙니다.

하지만 많은 애플리케이션 장애는 Unchecked Exception에서 발생하기 때문에 주의가 필요합니다.

참고


Spirng - @Transactional


Tags

#Spring#@Transactional#Transaction

Related Posts

SpringBoot 3.0에 Swagger 3.0.0 설정 하기 (Springfox --> Springdoc)
August 12, 2024
1 min
© 2024, All Rights Reserved.

Quick Links

About Me

Media