시스템 설계, 기술 면접 대비

검색어 자동완성 설계 면접 퀴즈

검색 한 번이 요청 스무 번을 만든다

검색어 자동완성을 요구사항부터 끝까지 설계합니다. 검색 하루 1억 건에 한 검색당 20타, 응답 100ms, 검색어 1억 종류, 하루 1회 갱신이라는 제약 아래에서 요청 증폭, 노드마다 상위 다섯 개 저장, 통째 교체, 접두사 범위 분할, 캐시, 조합 중 입력, 급상승 경로, 걸러내기를 다룹니다.

로그인 없이 풀어보기
17개 문제, 무료

이 설계에 주어진 요구사항

문제는 모두 이 하나의 요구사항 안에서 풉니다.

검색어 자동완성 설계

검색어 자동완성

검색창에 글자를 넣는 동안 많이 검색된 검색어를 제안합니다. 한 번의 검색이 여러 번의 요청을 만듭니다.

이번에 만드는 기능

  • 입력한 접두사로 시작하는 검색어를 제안하기
  • 많이 검색된 것부터 보여주기
  • 오늘 갑자기 많이 검색되는 것도 보여주기
  • 보여주면 안 되는 검색어를 빼기

범위 밖

  • 오타를 고쳐서 제안하기
  • 사용자 개인의 검색 기록으로 제안을 다르게 하기
  • 검색 결과 자체를 미리 보여주기
  • 검색어의 뜻이나 설명 붙이기

지켜야 하는 수치

검색
하루 1억 건 (초당 1,157)
한 검색당 입력
평균 20타
제안 개수
상위 5개
응답 시간
상위 1퍼센트가 100ms 이내
검색어 종류
1억, 평균 10글자
갱신
하루 1회 반영이면 된다

전제로 주어진 것

  • 제안은 모든 사용자에게 같아도 된다
  • 응답이 타이핑보다 느리면 그 답은 버려진다
  • 한글은 글자가 완성되기 전에도 입력 상태가 바뀐다
  • 제안에 오른 검색어는 눌려서 다시 검색된다

학습할 핵심 개념

요구사항과 요청 증폭
답을 노드마다 미리 둔다
통째로 다시 만들어 바꾼다
한 대에 안 들어갈 때
캐시가 가장 크게 듣는 자리
입력을 어떻게 받나
급상승은 다른 경로로
보여주지 않을 것과 하지 않을 것

핵심 개념 미리보기

검색어 자동완성 설계 면접에서 꼭 나오는 개념을 미리 확인하세요

요구사항과 요청 증폭

핵심

검색어 자동완성을 설계합니다. 검색창에 글자를 넣는 동안 상위 5개를 보여주는 기능입니다.

항목
대상검색어 자동완성
검색하루 1억 건 (초당 1,157)
한 검색당 입력평균 20타
제안 개수상위 5개
응답 시간상위 1퍼센트가 100ms 이내
검색어 종류1억 종류
갱신하루 1회 반영이면 된다
순서많이 검색된 것부터

검색량이 아니라 입력량이 부하다

한 번의 검색이 입력 글자 수만큼의 자동완성 요청을 만든다 검색 요청 초당 1,157 자동완성 요청 초당 2만. 20배 한 글자마다 한 번씩 물어본다 요청 하나에 계산을 조금이라도 두면 20배로 곱해진다 읽기만 하고 아무것도 계산하지 않는 구조로 만든다 그리고 앞쪽 한두 글자는 제안이 무의미해서 안 물어도 된다

검색은 하루 1억 건 (초당 1,157)입니다. 그 자체로는 부담이 아닙니다. 그런데 자동완성은 글자마다 한 번씩 물어봅니다. 한 검색에 평균 20타를 넣으면 요청이 20배가 됩니다.

초당 1,157 x 20 = 초당 약 2만

이 숫자가 첫 결론을 강제합니다. 요청 하나에 계산을 조금이라도 두면 20배로 곱해집니다. 그래서 자동완성 요청은 읽기만 하고 아무것도 계산하지 않는 것으로 만들어야 합니다.

100ms 는 사용자 체감이 아니라 설계 제약이다

응답이 100ms를 넘으면 사용자의 다음 타이핑이 먼저 도착합니다. 그러면 이전 답은 화면에 뜨지도 못하고 버려집니다.

응답 시간결과
타이핑보다 빠르다글자마다 제안이 갱신된다
타이핑보다 느리다제안이 뒤늦게 깜빡이며 바뀐다

즉 이 요구사항은 답을 만드는 데 쓸 시간이 거의 없다는 뜻입니다. 접두사 아래의 단어를 모아 정렬하는 것은 이 예산에 들어오지 않습니다.

무엇이 이 설계를 쉽게 만드나

요구사항에 우리를 도와주는 항목이 둘 있습니다.

항목무엇을 허용하나
갱신이 하루 1회면 된다데이터를 통째로 다시 만들어 바꿀 수 있다
제안이 5개면 된다노드마다 다섯 개만 들고 있으면 된다

이 두 줄이 없으면 이 시스템은 훨씬 어려워집니다. 실시간 갱신을 요구하면 통째로 바꾸는 방식을 쓸 수 없고, 제안을 100개 보여 달라고 하면 미리 저장하는 이득이 줄어듭니다.

접두사 검색 자체는 이미 다룬 문제다

문자열을 접두사로 찾는 자료구조는 트라이에서 다뤘습니다. 여기서는 그것을 서비스 규모로 운영하는 문제를 봅니다.

이번에 다루지 않는 것이유
트라이의 구조와 연산자료구조 문서에서 다룬다
검색 결과 자체를 찾는 것자동완성은 검색어를 제안할 뿐이다
개인별 검색 기록 기반 제안답이 사용자마다 달라지면 캐시가 무의미해진다
오타 교정 제안별도 문제다. 먼저 정확한 접두사를 다룬다

세 번째 항목이 중요합니다. 답이 모든 사용자에게 같다는 것이 이 시스템에서 가장 큰 자산입니다. 개인화를 넣는 순간 캐시 적중률이 무너지고 초당 2만이 그대로 우리에게 옵니다.

면접에서 이렇게 나옵니다
  • Q.검색이 하루 1억 건인데 자동완성 요청은 얼마나 됩니까
  • Q.응답 100ms 라는 요구가 무엇을 금지합니까
  • Q.요구사항의 어느 항목이 설계를 쉽게 만듭니까

답을 노드마다 미리 둔다

핵심

앞 절에서 읽을 때 계산할 시간이 없다는 것을 확인했습니다. 그러면 답을 어디에 어떤 형태로 두는지가 다음 문제입니다.

노드마다 답을 들고 있는다

노드 아래를 모아 정렬하는 대신 노드마다 상위 다섯 개를 미리 들고 있는다 읽을 때 모으면 삼 노드 아래 단어 수만 건을 모아 정렬 100ms 를 넘는다 미리 들고 있으면 삼 노드 상위 5개가 이미 여기 있다 읽어서 그대로 보낸다 대가는 저장과 갱신이다. 노드 수만큼 목록이 생긴다 검색어 하나가 늘면 그 경로의 모든 조상 노드를 손봐야 한다 읽기를 공짜로 만드는 값을 쓰기가 낸다

접두사에 해당하는 노드를 찾는 것은 글자 수만큼 내려가면 되므로 값쌉니다. 문제는 그 아래에 있는 단어를 모아 정렬하는 것입니다. 인기 있는 짧은 접두사는 아래에 수만 건이 달려 있습니다.

그래서 노드마다 그 아래의 상위 5개를 미리 저장합니다. 읽기는 노드를 찾아 그 목록을 그대로 보내는 것으로 끝납니다.

방식읽기쓰기
읽을 때 모으기아래 단어 수에 비례값싸다
미리 저장노드 찾기만조상 노드를 다 손봐야 한다

읽기를 공짜로 만드는 값을 쓰기가 냅니다. 검색어 하나의 점수가 바뀌면 그 경로의 모든 조상 노드에서 순위가 바뀔 수 있습니다.

저장 크기를 계산한다

노드마다 목록을 두면 저장이 얼마나 되는지 봐야 합니다.

검색어 1억 종류, 평균 길이 10글자
공통 접두사를 공유하므로 노드 수는 검색어 수보다 적다
노드마다 5개 x (문자열 참조 + 점수)

여기서 중요한 판단이 하나 있습니다. 목록에 문자열을 그대로 담지 않습니다. 같은 단어가 조상 노드마다 반복되기 때문입니다. 열 글자 단어는 조상이 열 개라 열 번 저장됩니다.

식별자만 담고 문자열은 따로 두면 이 중복이 사라집니다. 대신 읽을 때 식별자를 문자열로 바꾸는 일이 생기는데, 그것은 다섯 개뿐이라 값쌉니다.

어느 노드까지 목록을 두나

모든 노드에 둘 필요는 없습니다.

노드목록을 두나
1에서 6글자 접두사둔다. 요청의 대부분이 여기다
아주 긴 접두사두지 않는다. 그 아래에 단어가 몇 개뿐이다

긴 접두사는 아래에 달린 단어가 적어서 읽을 때 모아도 100ms 안에 끝납니다. 목록을 둘 이유가 없습니다.

이 판단이 저장을 크게 줄입니다. 노드 수는 접두사가 길어질수록 급격히 늘어나므로, 긴 쪽을 빼면 대부분이 빠집니다.

점수는 무엇으로 하나

목록의 순서를 정하는 값은 검색된 횟수입니다. 그런데 언제부터의 횟수인지를 정해야 합니다.

전체 기간의 횟수를 쓰면 오래전 유행이 계속 남는다
최근 기간만 쓰면 꾸준한 검색어가 밀린다

두 값을 섞습니다. 최근 며칠에 무게를 더 주고 그보다 오래된 것에는 적게 줍니다. 하루 1회 갱신이므로 이 계산을 그때 한 번만 하면 됩니다.

면접에서 이렇게 나옵니다
  • Q.왜 노드마다 상위 다섯 개를 미리 저장합니까
  • Q.노드 목록에 검색어 문자열을 그대로 담으면 무엇이 문제입니까
  • Q.모든 노드에 목록을 두시겠습니까

통째로 다시 만들어 바꾼다

핵심

앞 절에서 노드마다 목록을 두기로 했습니다. 그러면 검색어의 인기가 바뀔 때 그 목록을 어떻게 고치는지가 문제입니다.

한 노드씩 고치면 답이 뒤섞인다

새 트라이를 따로 만들어 완성된 뒤에 통째로 바꾼다 읽는 쪽은 계속 지금 것을 읽는다 쓰이는 트라이 새로 만드는 중 완성되면 통째로 바꾼다 한 노드씩 고치면 고치는 도중의 답이 뒤섞인다 바뀌지 않는 것으로 만들면 잠금이 필요하지 않다 가능한 이유 하루 1회 반영이면 된다는 조건이 이 방식을 허용한다

검색어 하나의 점수가 바뀌면 그 경로의 조상 노드에서 순위가 바뀔 수 있습니다. 조상이 열 개면 열 곳을 고쳐야 합니다.

고치는 도중에 읽으면 어떤 노드는 새 순위이고 어떤 노드는 옛 순위입니다. 그러면 글자를 하나 더 넣었을 때 제안이 이상하게 바뀝니다. 짧은 접두사에서는 있던 단어가 긴 접두사에서는 없는 식입니다.

그래서 고치지 않고 새로 만들어 통째로 바꿉니다.

새 트라이를 옆에서 만든다
완성되면 가리키는 곳을 바꾼다
읽는 쪽은 그 순간까지 옛 것을 온전하게 읽는다

바뀌지 않는 것으로 만들면 잠금이 필요 없다

한 번 만든 트라이를 고치지 않기로 하면, 읽는 쪽과 쓰는 쪽이 같은 것을 만지지 않습니다. 잠금도 조율도 필요하지 않습니다.

방식읽기와 쓰기의 관계
제자리에서 고치기서로를 기다려야 한다
새로 만들어 교체서로를 모른다

초당 2만 요청이 들어오는 경로에서 잠금을 없애는 것은 큰 이득입니다. 그리고 교체가 실패하면 옛 것이 그대로 쓰이므로, 실패가 곧 안전한 상태입니다.

되돌리기도 값쌉니다. 새 것이 이상하면 가리키는 곳을 옛 것으로 돌리면 됩니다. 데이터를 되돌리는 것이 아니라 가리키는 곳만 바꿉니다.

무엇으로 만드나

트라이를 만드는 재료는 검색 기록을 모은 집계입니다.

단계하는 일
수집검색 요청을 기록으로 남긴다
집계검색어별 횟수를 센다
걸러내기보여주지 않을 것을 뺀다
만들기노드마다 상위 다섯 개를 채운다

이 과정은 자동완성 요청 경로와 완전히 분리돼 있습니다. 하루 한 번 돌고, 느려도 사용자에게 영향이 없습니다. 읽기 경로와 만드는 경로를 나누는 것이 이 아키타입의 골격입니다.

집계 대상은 자동완성 요청이 아니라 실제로 검색된 것입니다. 자동완성 요청을 세면 타이핑 중간 상태가 다 섞여서, 아무도 검색하지 않은 조각이 인기 검색어가 됩니다.

통째로 바꾸는 것의 대가

세 가지를 감수합니다.

대가내용
반영이 늦다만드는 주기만큼 늦는다
메모리가 두 배 필요하다만드는 동안 두 벌이 있다
만드는 시간이 길다검색어 1억 종류를 다 훑는다

두 번째가 실제로 걸리는 지점입니다. 교체하는 순간에는 옛 트라이와 새 트라이가 동시에 존재합니다. 한 대에 두 벌이 들어가지 않으면 만드는 곳과 쓰는 곳을 나눠야 합니다.

면접에서 이렇게 나옵니다
  • Q.검색어 순위가 바뀔 때 노드 목록을 제자리에서 고치면 무엇이 문제입니까
  • Q.통째로 교체하는 방식의 이점을 무엇으로 보십니까
  • Q.트라이를 만들 재료로 무엇을 집계하시겠습니까

더 많은 개념과 문제는 가입 후 이용할 수 있어요

먼저 5문제 맛보기

검색어 자동완성 설계 면접 빈출 질문

실제 면접에서 자주 나오는 질문들입니다

Q.

검색이 하루 1억 건인데 자동완성 요청은 얼마나 됩니까

요구사항과 요청 증폭 개념 정리 보기
Q.

응답 100ms 라는 요구가 무엇을 금지합니까

요구사항과 요청 증폭 개념 정리 보기
Q.

요구사항의 어느 항목이 설계를 쉽게 만듭니까

요구사항과 요청 증폭 개념 정리 보기
Q.

개인별 검색 기록으로 제안을 다르게 하면 어떤 문제가 생기나요

요구사항과 요청 증폭 개념 정리 보기
Q.

왜 노드마다 상위 다섯 개를 미리 저장합니까

답을 노드마다 미리 둔다 개념 정리 보기
Q.

노드 목록에 검색어 문자열을 그대로 담으면 무엇이 문제입니까

답을 노드마다 미리 둔다 개념 정리 보기
Q.

모든 노드에 목록을 두시겠습니까

답을 노드마다 미리 둔다 개념 정리 보기
Q.

목록의 순서를 정하는 점수를 어떻게 만드시겠습니까

답을 노드마다 미리 둔다 개념 정리 보기

이런 점이 좋아요

부하를 만드는 것이 무엇인지 다시 세는 습관

고치지 않고 새로 만들어 바꾸는 설계의 이득을 보는 눈

갱신 주기가 다른 것을 같은 자리에 두지 않는 판단

지금 바로 시작하세요

무료로 검색어 자동완성 설계 퀴즈를 풀고, AI 오답 분석으로 실력을 키우세요.