728x90

지난번 SpringFramework의 특징을 알아보았다. 그 중 트랜잭션 관리에 대한 내용이 있었고, 이번에 트랜잭션에 대해서 추가로 알아보는 시간을 가져보려고 한다. 트랜잭션이 무엇이고 선언적 트랜잭션의 사용과 격리수준에 대해서 알아보겠다.


데이터베이스 트랜잭션(Database Transaction)은 데이터의 일관성을 유지하고 신뢰성을 확보하는 데 중요한 개념이다. 트랜잭션을 통해 데이터베이스 조작이 안전하게 수행되며, 만약 오류가 발생하면 변경 사항을 롤백하여 원래 상태로 되돌릴 수 있다. 이번 글에서는 트랜잭션의 개념과 ACID 속성, 그리고 Java Spring에서 트랜잭션을 어떻게 활용하는지 살펴보겠다.

트랜잭션(Transaction)은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다.

1. 트랜잭션의 4가지 핵심 속성 (ACID)

  1. 원자성(Atomicity)
  • 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않음을 보장한다.
  • 예: 자금 이체 시 보내는 계좌에서 돈이 빠졌지만 받는 계좌에는 입금되지 않는 경우를 방지.
  1. 일관성(Consistency)
  • 트랜잭션 처리 전과 후에 데이터 무결성이 유지되어야 한다.
  • 예: 은행 계좌의 잔고가 음수가 되지 않도록 트랜잭션을 중단시킴.
  1. 독립성(Isolation)
  • 하나의 트랜잭션이 다른 트랜잭션에 영향을 받지 않도록 보호한다.
  • 예: 송금 작업 도중 다른 사용자가 중간 상태의 데이터를 볼 수 없어야 한다.
  1. 지속성(Durability)
  • 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 반영된다.
  • 예: 시스템 장애 후에도 커밋된 데이터는 유지됨.

2. 트랜잭션의 동작 원리

트랜잭션의 상태

  • Active: 트랜잭션이 실행 중인 상태
  • Partially Committed: 일부 작업이 완료되었지만 최종 커밋되지 않은 상태
  • Failed: 오류 발생으로 인해 트랜잭션이 실패한 상태
  • Aborted: 트랜잭션이 취소되고 롤백된 상태
  • Committed: 트랜잭션이 성공적으로 완료된 상태

3. Java와 Spring에서의 트랜잭션 관리

Spring의 선언적 트랜잭션 (@Transactional)

Spring에서는 @Transactional을 사용하여 선언적으로 트랜잭션을 관리할 수 있다.

@Service
public class AccountService {
    @Autowired
    private AccountRepository accountRepository;

    @Transactional
    public void transferMoney(Long senderId, Long receiverId, Double amount) {
        Account sender = accountRepository.findById(senderId).orElseThrow();
        Account receiver = accountRepository.findById(receiverId).orElseThrow();
        sender.withdraw(amount);
        receiver.deposit(amount);
        accountRepository.save(sender);
        accountRepository.save(receiver);
    }
}

4. 트랜잭션 격리 수준 (Transaction Isolation Level)

격리 수준 설명
Read Uncommitted 다른 트랜잭션이 커밋하지 않은 데이터를 읽을 수 있음
Read Committed 다른 트랜잭션이 커밋한 데이터만 읽을 수 있음
Repeatable Read 동일 트랜잭션에서 같은 데이터를 여러 번 읽어도 동일함
Serializable 가장 엄격한 수준으로 트랜잭션을 직렬화하여 처리

Spring에서 격리 수준을 설정하는 방법:

@Transactional(isolation = Isolation.SERIALIZABLE)

5. 결론

데이터베이스 트랜잭션은 데이터 무결성과 신뢰성을 보장하는 핵심 개념이다. Java Spring에서는 @Transactional을 활용하여 선언적 트랜잭션을 쉽게 적용할 수 있으며, 트랜잭션 격리 수준을 적절히 조절하여 성능과 안전성을 조율할 수 있다. 안정적인 시스템을 구축하려면 트랜잭션 관리 전략을 적절히 활용하는 것이 중요하다.

728x90

+ Recent posts