도메인 주도 개발 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 발생
- VersionConflictException과 OptimisticLockingFailureException 차이점 명확화
- 강제 버전 증가로 트랜잭션 종료 시 버전 강제 증가 처리
4. 오프라인 선점 잠금 구현
LockManager
인터페이스 활용tryLock(type, id)
메서드로 잠금 시도LockId
반환 및 유효 시간 연장 기능 구현- DB 테이블을 통해 락 정보 저장 (예:
Lock
엔티티) - JdbcTemplate을 활용한 락 관리 로직 구현
결론
- 비관적 락은 동시 수정을 강제로 막지만 교착 상태 위험 존재
- 낙관적 락은
@Version
필드로 간단히 구현 가능하며 버전 충돌 예외 처리 필수 - 오프라인 잠금은 사용자 잠금 시간 관리 및 유효 시간 연장 기능 추가 필요
- LockManager 구현 시 DB 동시성 문제를 고려한 락 관리 로직 설계 필수