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

좌석 예약 시스템 설계 면접 질문: 날짜마다 다른 좌석 상태는 어디에 두나

시스템 디자인 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) 한 줄에 맡깁니다.

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

  1. 두 사람이 같은 좌석을 같은 순간에 누르면요?

    확인과 예매 사이의 짧은 틈을 아는지 봅니다. 이 질문은 Vol.1 3부 동시성 문제로 그대로 이어집니다.

  2. 5만 석이고 결제까지 3분 걸립니다. 그 3분 동안 좌석은요?

    잡아 둔 좌석과 팔린 좌석을 구분하는지, 결제를 포기한 손님의 좌석이 언제 풀리는지를 봅니다.

  3. 등급 이름을 R석에서 프리미엄석으로 바꾸면 작년 티켓은요?

    지금 값과 그때 값을 같은 칸에 두었을 때 과거가 흔들린다는 것을 아는지 봅니다.

VOL.1 · 01장

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

책은 여기서 「그 날의 좌석」을 무엇으로 기억할지 정하고, 그 판단이 실제 쿼리와 제약과 인덱스로 어떻게 이어지는지 끝까지 풉니다. 장 끝에는 공연, 회차, 배치도, 가격이 붙으며 설계가 자라는 과정이 이어집니다.

01장에서 이어지는 것

  • 예매 가능한 좌석을 꺼내는 실제 쿼리
  • 두 사람이 같은 좌석을 동시에 잡을 때
  • 인덱스를 어디에 걸지
  • 같은 요구를 다르게 푸는 설계와 그 차이
  • 회차와 배치도와 가격이 붙으며 자라는 설계
시스템 디자인 Vol.1 보러 가기 →

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

22문제 전체 보기