Transactional/트랜잭셔날

Kingyj·2025년 3월 11일
post-thumbnail

🐤 WHAT IS TRANSACTIONAL?

@Transactional은 Spring Framework에서 제공하는 어노테이션으로, 트랜잭션 처리를 선언적으로 관리할 수 있게 해준다.
트랜잭션은 데이터베이스에서 일어나는 일련의 작업들이 모두 성공적으로 완료되거나, 그렇지 않으면 모두 롤백되어야 하는 원자성을 보장하는 메커니즘이다.
이를 통해 데이터의 일관성, 신뢰성을 유지할 수 있다.


🐤 주요 개념

원자성 (Atomicity): 트랜잭션에 포함된 모든 작업이 성공적으로 완료되거나, 하나라도 실패하면 전체 작업이 취소되고 롤백된다.

일관성 (Consistency): 트랜잭션 실행 전후로 데이터베이스가 일관된 상태를 유지한다. 예를 들어, 데이터가 잘못된 상태로 저장되지 않도록 보장한다.

격리성 (Isolation): 트랜잭션이 실행 중에 다른 트랜잭션과 상호작용하지 않도록 하여 데이터가 안전하게 처리되도록 한다.

지속성 (Durability): 트랜잭션이 완료된 후에는 그 결과가 영구적으로 저장되어야 한다.

🐤 @Transactional 사용법

@Transactional을 클래스나 메서드에 선언함으로써, 해당 메서드나 클래스에서 실행되는 모든 DB 작업들이 트랜잭션 안에서 처리되게 된다.

1. 메서드 수준에서 사용

@Transactional
fun saveData() {
    // DB 작업들
    repository.save(entity)
    repository.update(entity)
}
  • saveData() 메서드 내에서 발생하는 모든 DB 작업이 하나의 트랜잭션으로 묶여 처리된다. 만약 하나의 작업이라도 예외가 발생하면, 전체 트랜잭션은 롤백된다.

2. 클래스 수준에서 사용

@Transactional
class MyService {
    fun saveData() {
        // DB 작업들
        repository.save(entity)
    }

    fun updateData() {
        // DB 작업들
        repository.update(entity)
    }
}
  • 클래스 내 모든 메서드에 트랜잭션이 적용된다. 단, 클래스 수준에서 트랜잭션을 사용하면 메서드 단위로 세밀한 트랜잭션 제어가 어려울 수 있다.

🐤 @Transactional 속성

@Transactional은 여러 속성을 제공하여 트랜잭션의 동작 방식을 세밀하게 제어할 수 있다.

  • propagation: 트랜잭션 전파 방식을 설정한다. 예를 들어, 트랜잭션이 이미 시작되었으면 그 트랜잭션을 따를지, 새로 시작할지 등을 설정할 수 있다.

  • isolation: 트랜잭션 격리 수준을 설정한다. 예를 들어, 여러 트랜잭션이 동시에 처리될 때 각 트랜잭션 간의 영향을 최소화한다.

  • rollbackFor: 지정된 예외가 발생했을 때 롤백할 예외를 설정한다. 기본적으로는 RuntimeException과 Error가 발생하면 롤백하지만, 다른 예외를 롤백 대상으로 지정할 수 있다.

  • readOnly: 데이터베이스 작업이 읽기 전용인지 여부를 지정한다. 읽기 전용 트랜잭션은 성능 최적화에 도움을 줄 수 있다.

  • timeout: 트랜잭션이 완료될 때까지 기다리는 시간을 설정한다. 지정된 시간 내에 트랜잭션이 완료되지 않으면 예외가 발생하고 롤백된다.


🐤 @Transactional 동작 원리

  1. 트랜잭션 시작: @Transactional이 붙은 메서드가 실행되면 Spring은 트랜잭션 매니저를 통해 트랜잭션을 시작한다.

  2. DB 작업 수행: 메서드 내에서 DB 작업이 진행된다.

  3. 트랜잭션 완료: 메서드가 정상적으로 완료되면 트랜잭션이 커밋된다.

4.예외 발생 시 롤백: 예외가 발생하면 트랜잭션은 롤백되고, DB 작업은 되돌려진다.

@Transactional
fun transferMoney(fromAccount: Account, toAccount: Account, amount: BigDecimal) {
    fromAccount.debit(amount)
    toAccount.credit(amount)
    // 중간에 예외가 발생하면 롤백되고, 모든 변경 사항이 취소됨
}

transferMoney 메서드가 실행될 때 두 계좌에서 각각 금액을 차감하고 입금하는 작업을 수행합니다. 만약 중간에 예외가 발생하면, 두 계좌의 변경 사항은 모두 롤백된다.


🐤 요약

@Transactional은 메서드나 클래스에 선언하여 트랜잭션을 선언적으로 처리할 수 있게 해주는 어노테이션이다.
트랜잭션의 주요 개념인 원자성, 일관성, 격리성, 지속성을 보장한다.
다양한 속성(propagation, isolation, timeout, rollbackFor, readOnly)을 통해 트랜잭션을 세밀하게 제어할 수 있다.


🐤 @Transactional / @Transaction 다르다!

  • @Transactional 은 Spring Framework에서 제공하는 어노테이션으로, 트랜잭션 관리를 선언적으로 처리하는 데 사용된다.
    Spring의 트랜잭션 관리 시스템은 @Transactional을 사용하여 메서드나 클래스 수준에서 트랜잭션을 관리하고, 트랜잭션의 시작, 커밋, 롤백 등을 자동으로 처리한다.

  • @Transaction은 Spring과는 관계없는 다른 라이브러리나 프레임워크에서 사용될 수 있다.
    예를 들어, JTA (Java Transaction API)를 사용할 때나 특정 프레임워크에서 트랜잭션을 관리할 때 @Transaction을 사용할 수 있다.
    이 어노테이션은 JTA 트랜잭션 또는 특정 라이브러리에서 제공하는 트랜잭션 관리 기능을 나타낼 수 있다.

Transactional Spring의 트랜잭션 관리에만 국한되지만, Transaction 특정 트랜잭션 관리 시스템이나 프레임워크에 의존적일 수 있다.

주요 차이점

용도와 사용 범위:

@Transactional: Spring 프레임워크에서 트랜잭션을 관리할 때 사용된다. Spring의 트랜잭션 관리 시스템과 연동된다.
@Transaction: 특정 프레임워크나 라이브러리에서 사용될 수 있으며, Spring과는 관계없는 경우가 많다.

트랜잭션 관리 시스템:

@Transactional: Spring의 트랜잭션 매니저가 트랜잭션을 처리한다.
@Transaction: JTA, EJB, 또는 다른 트랜잭션 관리 시스템에서 사용될 수 있다.

세부 설정 가능 여부:

@Transactional: 트랜잭션 전파 방식, 격리 수준, 롤백 조건 등을 세밀하게 설정할 수 있다.
@Transaction: 보통 더 간단한 트랜잭션 처리가 되며, 세부 설정을 제공하지 않는 경우가 많다.


0개의 댓글