설계 면접 문제 05 · 2부 데이터를 어떻게 담나

과거 주문 금액 설계 면접: 상품 가격이 바뀌면 지난 주문 금액은

시스템 디자인 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원으로 바뀌어 보입니다. 과거 주문 금액이 현재에 끌려옵니다.

영수증, 환불 금액, 매출 집계가 모두 이 조인 위에 서 있다면 가격 한 번 고친 일이 지난 장부 전체를 흔듭니다.

떨어지는 답은 이런 모양입니다

  • 늘 조인으로 가져오고, 가격이 바뀌면 과거가 흔들린다는 것을 모릅니다.
  • 영수증과 환불 금액이 어느 시점의 값인지 묻는 질문에 답하지 못합니다.

면접관은 여기서 멈추지 않습니다

  1. 가격에 더해 상품 정보 전체의 과거를 추적하려면요?

    이름, 옵션, 설명까지 그때의 값이 필요해질 때 설계가 어디까지 버티는지 봅니다.

  2. 회원이 탈퇴하면 그 사람의 주문과 댓글은요?

    지워야 할 것과 남겨야 할 것을 구분하는지 봅니다.

  3. 상태 변화 자체를 쌓아 어느 시점이든 복원하려면요?

    마지막 상태만 남기는 설계와 과정을 남기는 설계의 차이를 아는지 봅니다.

VOL.1 · 05장

이 다음 판단은 책에서 이어집니다

책은 주문 내역의 금액이 어느 시점의 값이어야 하는지 정하고, 그 판단이 실제 요청 흐름과 테이블에 어떻게 들어가는지 보여 줍니다. 넣지 말아야 할 데이터도 같이 다룹니다.

05장에서 이어지는 것

  • 그때 값과 지금 값을 가르는 기준
  • 주문이 들어오는 순간의 실제 요청 흐름
  • 넣지 말아야 할 데이터
  • 이 장이 만든 테이블을 행으로 읽어 보기
시스템 디자인 Vol.1 보러 가기 →

매일 쓰는 화면에서 나온 설계 문제 22개 · 263쪽 · 현직 엔지니어와 30분 모의면접

22문제 전체 보기