주문 번호 설계 면접 질문: 주소창에 행 번호가 보이면 새는 것
시스템 디자인 Vol.1 · 21장 「주소창에 우리 행 번호가 보입니다」에서
이런 화면입니다
주문을 마치면 주소가 /orders/1024로 바뀝니다. 화면은 멀쩡하고 손님은 아무것도 느끼지 못합니다.
그런데 이 주소 하나에 두 가지가 같이 나갑니다. 손님이 볼 주문 하나, 그리고 이 가게가 지금까지 주문을 몇 건 받았는지. 오늘 하나 사고 내일 하나 사서 두 번호를 빼면 하루 주문 건수가 나옵니다.
면접관이 이렇게 묻습니다
손님에게 보여 줄 주문 번호를 설계해 보세요. 주소창에 쓰고, 문자로 보내고, 고객센터 통화에서 손님이 소리 내어 부릅니다.
범위부터 좁힙니다
이 번호에 요구되는 성질이 다섯입니다. 겹치지 않을 것, 짧을 것, 추측하기 어려울 것, 소리 내어 부를 수 있을 것, 그리고 순서가 보여도 되는지.
다섯은 서로 당깁니다. 짧게 만들면 겹치기 쉽고, 추측을 어렵게 하면 길어지고, 길어지면 전화로 부르기 어렵습니다.
주소창과 문자와 통화로 나가는 이 번호가 무엇을 새게 하는지가 핵심 질문입니다.
가장 많이 나오는 답
데이터베이스가 만든 행 번호를 그대로 주소와 문자와 통화에 씁니다.
https://shop.example.com/orders/1024
짧고, 겹치지 않고, 전화로 부르기도 쉽습니다.
그런데 여기서 깨집니다
주소 하나에 주문 하나와 「지금까지 몇 건 받았나」가 같이 샙니다. 번호 하나를 바꿔 넣어 보는 것만으로 남의 주문 화면을 두드릴 수도 있습니다.
UUID로 바꾸면 이번에는 서른여섯 글자가 됩니다. 고객센터에서 소리 내어 부를 수 없고, 기본 키로 쓰면 인덱스에도 부담이 갑니다.
떨어지는 답은 이런 모양입니다
- UUID로 끝내고, 서른여섯 글자와 기본 키 인덱스 문제를 답하지 못합니다.
- 「길어서 안전하다」고 답합니다.
- 충돌 확률이 사실상 0이라고만 말합니다.
면접관은 여기서 멈추지 않습니다
UUID를 쓰면 끝나지 않나요?
길이, 기본 키 인덱스, 전화로 부르기를 함께 따지는지 봅니다.
번호가 길어서 추측이 어려우면 안전한가요?
안전하다는 말의 근거를 따지는지 봅니다.
로그인 없이 여는 배송 조회 화면이 생기면요?
번호만 알면 열리는 화면을 떠올리는지 봅니다.
이 다음 판단은 책에서 이어집니다
책은 다섯 성질 가운데 무엇을 먼저 지킬지 정한 뒤, 그 판단이 놓이는 테이블과 넣지 말아야 할 데이터까지 풉니다.
21장에서 이어지는 것
- 번호에 요구되는 다섯 성질과 그 우선순위
- 번호가 새게 하는 것
- 번호를 알아도 남의 주문을 못 열게 하려면
- 넣지 말아야 할 데이터