도메인 주도 개발 8장: 동시 수정 방지와 락 관리 전략
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

도메인 주도 개발 8장

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

개발 툴

대상자

DDD(도메인 주도 개발)를 적용하는 소프트웨어 개발자, 트랜잭션 관리 및 동시성 문제 해결을 다루는 개발자

핵심 요약

  • @Lock 애너테이션을 통해 비관적 락을 구현하여 동시 수정을 방지
  • @Version 필드로 낙관적 락을 적용해 버전 충돌 감지 및 처리
  • LockManager 인터페이스를 활용한 오프라인 선점 잠금 구현으로 잠금 유효 시간 관리

섹션별 세부 요약

1. 애그리거트 트랜잭션 관리 문제

  • 운영자와 사용자가 동시에 애그리거트를 수정할 경우 데이터 불일치 발생
  • 트랜잭션을 통해 수정 작업의 원자성일관성 유지 필요
  • 비관적 락낙관적 락 두 가지 접근 방식 존재

2. 비관적 락 구현

  • DBMS의 행 단위 락 활용
  • Spring Data JPA에서 @Lock(LockModeType.PESSIMISTIC_WRITE) 적용
  • QueryHints로 최대 대기 시간 설정 (예: @QueryHints(value = { @QueryHint(name = "javax.persistence.lock.timeout", value = "3000") }))
  • 교착 상태 발생 시 최대 대기 시간 설정으로 예방

3. 낙관적 락 구현

  • @Version 필드를 통해 버전 관리
  • JPA가 자동으로 버전 비교OptimisticLockingFailureException 발생
  • VersionConflictExceptionOptimisticLockingFailureException 차이점 명확화
  • 강제 버전 증가로 트랜잭션 종료 시 버전 강제 증가 처리

4. 오프라인 선점 잠금 구현

  • LockManager 인터페이스 활용
  • tryLock(type, id) 메서드로 잠금 시도
  • LockId 반환 및 유효 시간 연장 기능 구현
  • DB 테이블을 통해 락 정보 저장 (예: Lock 엔티티)
  • JdbcTemplate을 활용한 락 관리 로직 구현

결론

  • 비관적 락은 동시 수정을 강제로 막지만 교착 상태 위험 존재
  • 낙관적 락@Version 필드로 간단히 구현 가능하며 버전 충돌 예외 처리 필수
  • 오프라인 잠금은 사용자 잠금 시간 관리 및 유효 시간 연장 기능 추가 필요
  • LockManager 구현 시 DB 동시성 문제를 고려한 락 관리 로직 설계 필수