과거 주문 금액 설계 면접: 상품 가격이 바뀌면 지난 주문 금액은
시스템 디자인 Vol.1 · 05장 「주문에 남는 그때 그 가격」에서
이런 화면입니다
쇼핑몰 상품 가격은 운영 중에 자주 바뀝니다. 그런데 내 주문 내역을 열면 작년에 산 그 가격이 그대로 찍혀 있어야 합니다. 지금 상품 페이지 가격이 올랐어도 마찬가지입니다.
같은 상품인데 작년 주문은 그때 가격, 상품 페이지는 오른 지금 가격입니다. 두 숫자가 동시에 맞아야 합니다.
면접관이 이렇게 묻습니다
상품 가격은 자주 바뀌는데, 주문 내역에는 주문한 그 순간의 가격이 영원히 남아야 합니다. 나중에 가격이 바뀌어도요. 설계해 보세요.
범위부터 좁힙니다
한 줄로 좁힙니다. 가격은 수시로 바뀌고, 주문에는 주문한 순간의 가격이 영구히 남는다. 결제 수단과 배송은 접어 둡니다.
주문 내역의 금액은 언제의 값이어야 할까요. 지금 값과 그때 값이 갈라지는 순간을 설계가 어떻게 받아 내는지가 핵심 질문입니다.
가장 많이 나오는 답
정규화를 배운 대로 그립니다. 주문은 상품 번호만 들고, 금액은 필요할 때 상품 테이블과 조인해서 가져옵니다.
SELECT o.id, p.name, p.price
FROM orders o
JOIN products p ON p.id = o.product_id
WHERE o.member_id = :me;
중복도 없고 테이블도 깔끔합니다. 가격이 한 번도 안 바뀌는 동안에는 문제가 보이지 않습니다.
그런데 여기서 깨집니다
운영자가 상품 가격을 39,000원에서 45,000원으로 고칩니다. 그 순간 작년에 39,000원에 산 손님의 주문 내역도 45,000원으로 바뀌어 보입니다. 과거 주문 금액이 현재에 끌려옵니다.
영수증, 환불 금액, 매출 집계가 모두 이 조인 위에 서 있다면 가격 한 번 고친 일이 지난 장부 전체를 흔듭니다.
떨어지는 답은 이런 모양입니다
- 늘 조인으로 가져오고, 가격이 바뀌면 과거가 흔들린다는 것을 모릅니다.
- 영수증과 환불 금액이 어느 시점의 값인지 묻는 질문에 답하지 못합니다.
면접관은 여기서 멈추지 않습니다
가격에 더해 상품 정보 전체의 과거를 추적하려면요?
이름, 옵션, 설명까지 그때의 값이 필요해질 때 설계가 어디까지 버티는지 봅니다.
회원이 탈퇴하면 그 사람의 주문과 댓글은요?
지워야 할 것과 남겨야 할 것을 구분하는지 봅니다.
상태 변화 자체를 쌓아 어느 시점이든 복원하려면요?
마지막 상태만 남기는 설계와 과정을 남기는 설계의 차이를 아는지 봅니다.
이 다음 판단은 책에서 이어집니다
책은 주문 내역의 금액이 어느 시점의 값이어야 하는지 정하고, 그 판단이 실제 요청 흐름과 테이블에 어떻게 들어가는지 보여 줍니다. 넣지 말아야 할 데이터도 같이 다룹니다.
05장에서 이어지는 것
- 그때 값과 지금 값을 가르는 기준
- 주문이 들어오는 순간의 실제 요청 흐름
- 넣지 말아야 할 데이터
- 이 장이 만든 테이블을 행으로 읽어 보기