설계 면접 문제 21 · 8부 원본을 그대로 둘 수 없을 때

주문 번호 설계 면접 질문: 주소창에 행 번호가 보이면 새는 것

시스템 디자인 Vol.1 · 21장 「주소창에 우리 행 번호가 보입니다」에서

이런 화면입니다

주문을 마치면 주소가 /orders/1024로 바뀝니다. 화면은 멀쩡하고 손님은 아무것도 느끼지 못합니다.

그런데 이 주소 하나에 두 가지가 같이 나갑니다. 손님이 볼 주문 하나, 그리고 이 가게가 지금까지 주문을 몇 건 받았는지. 오늘 하나 사고 내일 하나 사서 두 번호를 빼면 하루 주문 건수가 나옵니다.

면접관이 이렇게 묻습니다

면접관

손님에게 보여 줄 주문 번호를 설계해 보세요. 주소창에 쓰고, 문자로 보내고, 고객센터 통화에서 손님이 소리 내어 부릅니다.

범위부터 좁힙니다

이 번호에 요구되는 성질이 다섯입니다. 겹치지 않을 것, 짧을 것, 추측하기 어려울 것, 소리 내어 부를 수 있을 것, 그리고 순서가 보여도 되는지.

다섯은 서로 당깁니다. 짧게 만들면 겹치기 쉽고, 추측을 어렵게 하면 길어지고, 길어지면 전화로 부르기 어렵습니다.

이 문제의 무게

주소창과 문자와 통화로 나가는 이 번호가 무엇을 새게 하는지가 핵심 질문입니다.

가장 많이 나오는 답

데이터베이스가 만든 행 번호를 그대로 주소와 문자와 통화에 씁니다.

https://shop.example.com/orders/1024

짧고, 겹치지 않고, 전화로 부르기도 쉽습니다.

그런데 여기서 깨집니다

주소 하나에 주문 하나와 「지금까지 몇 건 받았나」가 같이 샙니다. 번호 하나를 바꿔 넣어 보는 것만으로 남의 주문 화면을 두드릴 수도 있습니다.

UUID로 바꾸면 이번에는 서른여섯 글자가 됩니다. 고객센터에서 소리 내어 부를 수 없고, 기본 키로 쓰면 인덱스에도 부담이 갑니다.

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

  • UUID로 끝내고, 서른여섯 글자와 기본 키 인덱스 문제를 답하지 못합니다.
  • 「길어서 안전하다」고 답합니다.
  • 충돌 확률이 사실상 0이라고만 말합니다.

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

  1. UUID를 쓰면 끝나지 않나요?

    길이, 기본 키 인덱스, 전화로 부르기를 함께 따지는지 봅니다.

  2. 번호가 길어서 추측이 어려우면 안전한가요?

    안전하다는 말의 근거를 따지는지 봅니다.

  3. 로그인 없이 여는 배송 조회 화면이 생기면요?

    번호만 알면 열리는 화면을 떠올리는지 봅니다.

VOL.1 · 21장

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

책은 다섯 성질 가운데 무엇을 먼저 지킬지 정한 뒤, 그 판단이 놓이는 테이블과 넣지 말아야 할 데이터까지 풉니다.

21장에서 이어지는 것

  • 번호에 요구되는 다섯 성질과 그 우선순위
  • 번호가 새게 하는 것
  • 번호를 알아도 남의 주문을 못 열게 하려면
  • 넣지 말아야 할 데이터
시스템 디자인 Vol.1 보러 가기 →

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

22문제 전체 보기