
우당탕탕 주문서 개발기
두줄요약
주문서 다중 수정에서 변경 덮어쓰기를 막기 위해 revision 검증과 비관적 잠금을 함께 적용했습니다. 품목 스냅숏과 JSONB 이력으로 과거 주문 내용과 변경 기록을 보존했습니다.
문제 상황
- 매장·거래처·관리자가 동일 주문서를 수정하는 다중 사용자 환경
- 거래처 품목 변경에도 과거 주문 이력을 보존해야 하는 요구
- 주문서 변경 전체의 추적과 상태별 이력 관리 필요
해결 방법
- 조회 시점의 revision을 수정 요청에 포함하고 서버 현재 값과 비교하는 애플리케이션 수준 낙관적 잠금
- 동시 수정 요청의 revision 비교 경쟁 방지를 위한 조회 단계 비관적 잠금 병행
- 주문 시점 품목 정보를 주문서에 복사하고 거래처 품목은 추가·삭제만 허용
선택 이유
- 단순 DB 비관적·낙관적 잠금만으로는 사용자가 인지하지 못한 변경 덮어쓰기 방지 한계
- 품목 수정 기능 제거로 주문 이력 해석의 모호성과 도메인 복잡도 축소
- 주문서 상태 변경마다 JSONB 스냅숏과 작업 주체·액션을 이력 엔터티로 저장
트레이드오프
- 최신 데이터와 화면 데이터가 다르면 수정 실패 후 재조회 필요
- JSONB의 쓰기 부하를 감수하고 조회 성능·인덱싱·JSON 연산 활용
