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

대댓글 DB 설계 면접 질문: 답글의 답글은 어디에 담나

시스템 디자인 Vol.1 · 03장 「답글이 달리는 댓글」에서

이런 화면입니다

유튜브 영상 밑이나 커뮤니티 글에 댓글을 달면, 그 댓글에 답글이 달리고, 답글에 또 답글이 달립니다. 화면은 들여쓰기로 끝없이 이어집니다.

보는 사람에게는 자연스러운 화면인데, 저장하는 쪽에서는 깊이가 정해지지 않은 나무를 다뤄야 합니다.

면접관이 이렇게 묻습니다

면접관

댓글에 답글을 달 수 있는 게시판인데, 답글에도 답글이 달립니다. 깊이 제한은 없습니다. 댓글을 어떻게 저장하고, 한 글의 댓글 전체를 어떻게 불러올지 설계해 보세요.

범위부터 좁힙니다

한 줄로 좁힙니다. 댓글에 답글, 답글에 또 답글, 깊이는 무제한. 그리고 한 게시글의 댓글 전체를 한 번에 보여 준다. 좋아요와 정렬은 일단 접어 둡니다.

이 문제의 무게

답글에 답글이 끝없이 달릴 수 있습니다. 깊이를 미리 알 수 없는 데이터를 어떤 모양으로 담을지가 핵심 질문입니다.

가장 많이 나오는 답

화면에 보이는 대로 테이블을 나눕니다. 댓글 테이블 하나, 답글 테이블 하나.

CREATE TABLE comments (id BIGINT PRIMARY KEY, post_id BIGINT, body TEXT);
CREATE TABLE replies  (id BIGINT PRIMARY KEY, comment_id BIGINT, body TEXT);

댓글과 그 아래 답글 한 층까지는 깔끔하게 담깁니다.

그런데 여기서 깨집니다

답글에 답글이 달리는 순간 담을 곳이 없습니다. replies_of_replies 테이블을 하나 더 만들면 그다음 층에서 또 막힙니다. 깊이 제한이 없다는 조건 앞에서 테이블 수가 끝없이 늘어납니다.

불러올 때도 문제가 생깁니다. 댓글마다 답글을 다시 조회하면 쿼리가 댓글 수만큼 나갑니다.

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

  • 댓글과 답글을 테이블 두 개로 나누고 셋째 층을 답하지 못합니다.
  • 부모 댓글마다 자식을 다시 조회해 쿼리를 댓글 수만큼 쏘면서, 그것이 N+1 문제라는 것을 모릅니다.

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

  1. 댓글이 수만 개인데 시간순으로 끊어 페이지로 보여 주려면요?

    나무 모양 데이터를 평평한 페이지로 자르는 방법을 생각해 봤는지 봅니다.

  2. 댓글 수십만 개를 인기순으로 정렬해야 하면요?

    정렬 기준이 저장된 값인지, 매번 세어야 나오는 값인지 구분하는지 봅니다.

VOL.1 · 03장

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

책은 깊이를 모르는 답글을 어떤 모양으로 담을지 정하고, 한 글의 댓글 전체를 몇 번의 쿼리로 불러올지까지 실제 요청 흐름으로 보여 줍니다.

03장에서 이어지는 것

  • 깊이 제한 없는 답글을 담는 테이블 모양
  • 한 글의 댓글 전체를 불러오는 방법
  • 실제 요청이 흐르는 순서
  • 넣지 말아야 할 데이터
시스템 디자인 Vol.1 보러 가기 →

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

22문제 전체 보기