@Transactional은 주로 데이터베이스 트랜잭션을 관리하기 위해 사용하는 Spring 프레임워크의 어노테이션입니다. 트랜잭션은 "하나의 작업 단위를 성공적으로 완료하거나 실패하면 전부 취소(롤백)하는 것"을 의미합니다. 이를 쉽게 이해할 수 있도록 간단한 예시를 들어 설명해보겠습니다.
A라는 사람이 B라는 사람에게 은행 계좌를 통해 돈을 보낸다고 가정합시다.
public void transferMoney(String fromAccount, String toAccount, int amount) {
accountRepository.withdraw(fromAccount, amount); // A 계좌에서 출금
accountRepository.deposit(toAccount, amount); // B 계좌로 입금
}
만약 출금은 성공했지만 입금에서 예외가 발생하면, 출금 작업은 취소되지 않습니다. 결과적으로 데이터 불일치가 발생합니다.
@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 계좌에서 출금된 금액도 원래대로 복구됩니다.
모든 작업이 성공해야만 트랜잭션이 커밋되어 데이터가 저장됩니다.