kongkong.note

[도메인 주도 개발 시작하기] 8. 애그리거트 트랜잭션 관리 본문

DDD

[도메인 주도 개발 시작하기] 8. 애그리거트 트랜잭션 관리

hyokong 2026. 1. 5. 23:51

8.2 선점 잠금(Pessimistic Lock)

먼저 애그리거트를 구한 스레드가 애그리거트 사용이 끝날 때까지 다른 스레드가 해당 애그리거트를 수정하지 못하게 막는 방식

보통 DBMS의 행단위 잠금을 활용 - 특정 레코드에 한 커넥션만 접근할 수 있도록

스프링 데이터 JPA : @Lock(), @QueryHint() 활용

 

8.3 비선점 잠금(Optimistic Lock)

변경한 데이터를 실제 DBMS에 반영하는 시점에 변경 가능 여부를 확인하는 방식

스프링 데이터 JPA : @Version() 활용

 

8.4 오프라인 선점 잠금

여러 트랜잭션에 걸쳐 동시 변경을 방지하는 방식(누군가 수정 중일 때 다른 사람은 수정을 못하게 막는 것)


선점 vs 비선점 : 기본은 비선점 잠금

  • 비선점 잠금 : DB Lock 안잡음, ex) 조회수, 좋아요 ..
  • 선점 잠금 : DB Lock 잡음, ex) 쿠폰 실시간 - 정합성 절대적 필요할 때

 

실무에서는 DB Lock 피하는 구조를 선호

  • unique 제약
  • Redis
  • 메세지 큐(Kafka..)

 

배송 상태로의 변경 트랜잭션이 끝나기 전, 사용자가 배송지 변경하는 예시 기반 실무 로직

  1. 상태 제한 (배송지 변경 가능한 상태 구간을 제한한다.)
  2. 상태 변경 API는 원자성으로 update (상태, 주소 등 한번에 update)
  3. 변경 이력 저장 (분쟁 증거 목적)