[Spring] @Transactional

Neo-Renaissance·2025년 1월 12일

@Transactional은 주로 데이터베이스 트랜잭션을 관리하기 위해 사용하는 Spring 프레임워크의 어노테이션입니다. 트랜잭션은 "하나의 작업 단위를 성공적으로 완료하거나 실패하면 전부 취소(롤백)하는 것"을 의미합니다. 이를 쉽게 이해할 수 있도록 간단한 예시를 들어 설명해보겠습니다.


현실 예시: 은행 송금

상황 설명

A라는 사람이 B라는 사람에게 은행 계좌를 통해 돈을 보낸다고 가정합시다.

  • 이 작업은 두 가지 단계로 이루어집니다
    • A의 계좌에서 돈을 출금한다.
    • B의 계좌로 돈을 입금한다.

⚠️ 문제 발생

if A의 계좌에서 돈이 출금되었지만, 네트워크 오류로 인해 B의 계좌로 돈이 입금되지 않았다면 어떻게 될까요?

-> A는 돈을 잃게 되고, B는 돈을 받지 못하게 됩니다.

해결책

트랜잭션을 사용하여 "A의 계좌에서 출금"과 "B의 계좌로 입금"이 모두 성공하면 작업을 완료하고, 하나라도 실패하면 전체 작업을 취소(롤백) 합니다.

1. 트랜잭션 없이 처리

public void transferMoney(String fromAccount, String toAccount, int amount) {
    accountRepository.withdraw(fromAccount, amount); // A 계좌에서 출금
    accountRepository.deposit(toAccount, amount);    // B 계좌로 입금
}

만약 출금은 성공했지만 입금에서 예외가 발생하면, 출금 작업은 취소되지 않습니다. 결과적으로 데이터 불일치가 발생합니다.

2. @Transactional 사용

@Service
public class BankService {

    @Transactional
    public void transferMoney(String fromAccount, String toAccount, int amount) {
        accountRepository.withdraw(fromAccount, amount); // A 계좌에서 출금
        accountRepository.deposit(toAccount, amount);    // B 계좌로 입금
    }
}

@Transactional을 사용하면, 두 작업이 하나의 트랜잭션 단위로 묶입니다.
withdraw와 deposit 중 하나라도 실패하면, 트랜잭션은 롤백되어 A 계좌에서 출금된 금액도 원래대로 복구됩니다.
모든 작업이 성공해야만 트랜잭션이 커밋되어 데이터가 저장됩니다.

profile
if (실패) { 다시 도전; } else { 성공; }

0개의 댓글