트랜잭션(Transaction)

urur-27·2025년 3월 17일

잡다한

목록 보기
6/17

트랜잭션의 의미

데이터베이스에서 여러 개의 작업(작은 작업 단위들)이 있을 때, 이 작섭들을 하나의 작업처럼 묶어서 처리하는 개념.

  • 주로 데이터베이스에서 데이터를 추가하거나 변경, 삭제하는 과정에서 사용됨.
  • 모든 작업이 성공하거나, 실패하거나 둘 중 하나만 발생해야 함.

즉, 부분적으로 완료되는 상태를 허용하지 않음.


트랜잭션의 현실 예시

트랜잭션은 은행에서 송금하는 경우와 같다.

계좌 A에서 계좌 B로 10만원 송금을 한다면:
① A에서 10만원 차감
② B에서 10만원 증가

이 두 과정은 반드시 하나로 묶여야 한다.

  • 정상적인 경우:
    A 계좌에서 10만원 빠지고, B 계좌에 10만원이 들어갑니다.

  • 문제가 생긴 경우 (예: 중간에 시스템 오류):
    만약 A 계좌에서만 돈이 빠지고 B에 돈이 안 들어가면

따라서 이 두 가지 작업을 하나의 트랜잭션 으로 관리하여,
문제가 발생했을 때는 모든 작업을 없던 일로 되돌립니다.


트랜잭션의 특성 (ACID)

트랜잭션의 특성을 설명하는 용어로 ACID라는 개념이 있습니다.

  • A(Atomicity 원자성):
    트랜잭션의 작업은 전부 성공하거나 전부 실패.
    예시 - 송금이 되거나, 실패하거나 둘 중 하나
  • C(Consistency 일관성):
    데이터는 언제나 일관성 있는 상태를 유지.
    예시 - 잔액의 합이 일정하게 유지됨
  • I(Isolation 격리성):
    트랜잭션 끼리는 서로 독립적이고 영향을 주지 않음.
    예시 - A의 송금 중 B가 동시에 조회해도 영향을 받지 않음.
  • D(Durability 지속성):
    트랜잭션이 성공하면 영구히 반영됨
    예시 - 시스템이 꺼져도 송금 결과 유지

스프링에서의 트랜잭션 관리

스프링에서는 @Transactional 어노테이션을 통해 쉽게 관리할 수 있음.

@Service
public class OrderService {
    
    @Transactional
    public void orderProduct(Long userId, Long productId, int quantity) {
        // ① 재고를 줄이고
        productRepository.decreaseStock(productId, quantity);

        // ② 주문 내역을 생성한다
        orderRepository.createOrder(userId, productId, quantity);
        
        // 여기서 오류가 발생하면 위 두 작업이 전부 원상복구됩니다.
    }
}
  • 개발자는 트랜잭션 처리 코드를 직접 작성할 필요 없이, 어노테이션 하나로 쉽게 관리할 수 있음
  • 데이터베이스의 상태가 항상 일관적이고 안전하게 유지됨
  • 코드가 매우 깔끔해지고 유지보수가 편리함

주의점

모든 메서드에 무작정 @Transactional을 붙이면 안 됨.
읽기 전용(조회) 메서드에는 명시적으로 readOnly=true 옵션을 줄 수 있음.

@Transactional(readOnly = true)
public User findUser(Long id) {
    return userRepository.findById(id).orElse(null);
}
  • 트랜잭션 범위(scope)가 크면 성능이 떨어질 수 있으므로, 필요한 만큼만 사용해야 함
profile
끄아악

0개의 댓글