좌석 예약 시스템 설계 면접 질문: 날짜마다 다른 좌석 상태는 어디에 두나
시스템 디자인 Vol.1 · 01장 「날짜로 검색되는 좌석 예약」에서
이런 화면입니다
콘서트 예매 화면을 떠올려 보세요. 날짜를 고르면 좌석 배치도가 뜨고, 회색으로 막힌 자리 사이에서 비어 있는 한 곳을 눌러 예매합니다. 공연은 6월 1일부터 3일까지 사흘이고, 좌석 배치는 사흘 모두 같습니다.
설계 면접은 이 화면의 뒤를 묻습니다. 빈 좌석과 회색 좌석을 무엇으로 저장하고, 날짜를 바꿀 때마다 어떻게 꺼내 오는지를 봅니다.
면접관이 이렇게 묻습니다
콘서트 좌석 예매를 설계해 보세요. 날짜를 고르면 그 날 예매 가능한 좌석이 나오고, 하나를 골라 예매합니다.
범위부터 좁힙니다
먼저 범위를 한 줄로 좁힙니다. 날짜를 고르면 그 날 빈 좌석이 나오고, 그중 하나를 예매한다. 결제와 회원 관리는 일단 접어 둡니다.
이 한마디로 풀 범위가 손에 들어옵니다. 면접관은 지원자가 문제를 멋대로 부풀리지 않는다는 것을 확인합니다.
좌석은 사흘 내내 그대로인데, 찼는지 비었는지는 날짜마다 다릅니다. 이 차이를 어디에 담을지가 이 문제의 무게입니다.
가장 많이 나오는 답
가장 먼저 나오는 그림은 좌석 테이블에 「예약됨」 칸 하나를 다는 것입니다.
CREATE TABLE seats (
id BIGINT PRIMARY KEY,
seat_no VARCHAR(10), -- A12
is_reserved BOOLEAN -- 예약됨?
);
혼자 눌러 보면 잘 돕니다. A12를 예매하면 true가 되고 배치도에서 회색으로 바뀝니다.
그런데 여기서 깨집니다
6월 1일 공연에서 A12가 팔렸습니다. 이제 6월 2일을 고른 사람에게도 A12는 회색입니다. 칸 하나에 6월 1일의 「찼음」과 6월 2일의 「비었음」을 같이 적을 방법이 없습니다.
좌석 한 줄은 하나인데, 그 좌석이 가져야 할 상태는 공연 날짜 수만큼입니다. 흔한 답은 이 숫자가 맞지 않는 데서 무너집니다.
떨어지는 답은 이런 모양입니다
- 좌석에 상태 칸 하나로 끝내고, 날짜를 어디에 둘지 답하지 못합니다.
- 두 사람이 같은 좌석을 동시에 누르는 경우를
if (!seat.isReserved)한 줄에 맡깁니다.
면접관은 여기서 멈추지 않습니다
두 사람이 같은 좌석을 같은 순간에 누르면요?
확인과 예매 사이의 짧은 틈을 아는지 봅니다. 이 질문은 Vol.1 3부 동시성 문제로 그대로 이어집니다.
5만 석이고 결제까지 3분 걸립니다. 그 3분 동안 좌석은요?
잡아 둔 좌석과 팔린 좌석을 구분하는지, 결제를 포기한 손님의 좌석이 언제 풀리는지를 봅니다.
등급 이름을 R석에서 프리미엄석으로 바꾸면 작년 티켓은요?
지금 값과 그때 값을 같은 칸에 두었을 때 과거가 흔들린다는 것을 아는지 봅니다.
이 다음 판단은 책에서 이어집니다
책은 여기서 「그 날의 좌석」을 무엇으로 기억할지 정하고, 그 판단이 실제 쿼리와 제약과 인덱스로 어떻게 이어지는지 끝까지 풉니다. 장 끝에는 공연, 회차, 배치도, 가격이 붙으며 설계가 자라는 과정이 이어집니다.
01장에서 이어지는 것
- 예매 가능한 좌석을 꺼내는 실제 쿼리
- 두 사람이 같은 좌석을 동시에 잡을 때
- 인덱스를 어디에 걸지
- 같은 요구를 다르게 푸는 설계와 그 차이
- 회차와 배치도와 가격이 붙으며 자라는 설계