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

회의실 예약 시스템 설계 면접: 시간이 겹치는 예약은 무엇으로 막나

시스템 디자인 Vol.1 · 02장 「시간이 겹치지 않는 회의실 예약」에서

이런 화면입니다

사내 회의실 예약 화면입니다. 3번 회의실에 9시부터 11시까지 회의가 잡혀 있는데, 다른 팀이 10시부터 12시를 누릅니다.

시작 시각도 끝 시각도 서로 다릅니다. 그런데 가운데 한 시간이 겹칩니다.

면접관이 이렇게 묻습니다

면접관

회의실을 시간 단위로 예약하는 기능입니다. 같은 방에 시간이 겹치는 예약이 두 개 들어가면 안 됩니다. 테이블부터 잡아 보세요.

범위부터 좁힙니다

규모부터 묻습니다. 회의실이 열 개 남짓, 직원이 백 명이면 예약은 하루 수십 건입니다. 요청량은 작고, 지켜야 할 것은 정확성입니다.

그다음 한 줄로 좁힙니다. 한 방에 시간이 겹치는 예약을 두 개 만들지 않는다. 수정과 승인 절차는 접고, 예약 시간은 분 단위로 자유롭게 잡는다고 봅니다.

마지막 조건도 소리 내어 확인합니다. 예약 시각을 분 단위로 자유롭게 받는다는 것, 면접관이 꼬리 질문에서 다시 꺼낼 조건입니다.

이 문제의 무게

좌석 예약의 좌석은 한 점이고, 회의실 예약은 구간입니다. 두 구간이 겹치는지를 무엇으로 판정할지가 이 문제의 핵심 질문입니다.

가장 많이 나오는 답

좌석 예약 문제를 막 풀고 온 지원자는 같은 무기를 꺼냅니다. 방 번호와 시작 시각에 유일성 제약을 겁니다.

CREATE TABLE bookings (
  id       BIGINT PRIMARY KEY,
  room_id  BIGINT,
  start_at DATETIME,
  end_at   DATETIME,
  UNIQUE (room_id, start_at)
);

같은 방, 같은 시작 시각으로 두 번 들어오는 요청은 확실히 막힙니다.

그런데 여기서 깨집니다

9시부터 11시와 10시부터 12시는 시작 시각이 다릅니다. 제약은 두 행을 다른 값으로 보고 둘 다 통과시킵니다. 가운데 한 시간이 겹친 채로 두 회의가 같은 방에 들어갑니다.

구간이 겹친다는 사실은 한 칸의 값으로 표현되지 않습니다. 점을 막던 도구로 구간을 막으려 한 데서 답이 깨집니다.

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

  • (방, 시작 시각) 유일성 제약으로 끝냅니다.
  • 겹치는 경우를 여섯 가지 if 문으로 나눠 코드에서 비교합니다.
  • 동시에 들어오는 두 예약을 막으려고 테이블 전체를 잠가 다른 방 예약까지 세웁니다.

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

  1. 예약을 30분 단위로만 받는다면요?

    요구사항 하나가 바뀌면 판정 방법이 통째로 달라진다는 것을 아는지 봅니다.

  2. 회의실 세 개를 한 번에 잡아야 하면요?

    셋 중 하나만 잡히고 나머지가 실패하는 상황을 어떻게 다룰지 봅니다.

  3. 슬롯을 30분에서 1시간으로 바꾸면 이미 잡힌 회의는요?

    규칙이 바뀌는 날 과거 데이터가 어떻게 되는지까지 생각했는지 봅니다.

VOL.1 · 02장

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

책은 겹침을 무엇으로 정의할지 정하고, 자유 시각과 정해진 칸 두 갈래를 같은 무게로 끝까지 풉니다. 실제 요청이 흐르는 순서와 넣지 말아야 할 데이터까지 이어집니다.

02장에서 이어지는 것

  • 두 구간이 겹치는지 판정하는 기준
  • 동시에 들어온 두 예약이 서로를 못 보는 순간
  • 30분 칸으로만 받는다면
  • 실제 요청이 흐르는 순서
시스템 디자인 Vol.1 보러 가기 →

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

22문제 전체 보기