1. 비즈니스의 흐름 부터 생각
주문 프로세스를 설계할 때 고민했던 것은 순서와 원자성.
- 설계된 흐름
- 재고 확인 및 차감: 재고가 없으면 주문 로직을 시작조차 하지 않음.
- 주문 생성: 재고 확보가 성공했을 때만
Pending 상태의 주문 생성.
- 이 두 과정은 하나의 트랜잭션으로 묶여야 함.
- Why
- 순서 : 재고가 없는데 주문 객체를 만드는 것은 리소스 낭비라고 판단.
- 원자성 : 재고 차감됐는데 주문 안들어가는 경우 or 주문은 들어갔는데 재고는 그대로인 경우 방지
- Question : 원자성을 보장 → 순서는 상관 없는거 아닌가?
- 상관 있음. 어차피 실패할 경우 = 재고가 0인 경우.
- 주문을 만들었는데 → 재고를 보니깐 0이야 → 롤백 + 실패 알림
- 재고 차감 단계에서 Fail Fast 해주는 것이 좋다고 생각
2. 상품과 재고의 분리
초기에는 Product 테이블 안에 quantity 컬럼을 두는 것을 고려했으나,
최종적으로 상품 정보와 재고 정보를 물리적/논리적으로 분리
- 근거
- 라이프사이클 및 변경의 주체
- Product (상품): 관리자에 의해 가끔 변경됨 (이름, 설명, 가격 등).
- Stock (재고): 사용자의 주문에 의해 빈번하게, 실시간으로 변경됨.
3. Order와 OrderProduct의 관계