Foundry
검색어 자동완성 설계
심화
핵심

입력을 어떻게 받나

한글은 글자가 완성되기 전에도 요청이 생긴다

요청 수를 20배로 만드는 것은 타이핑입니다. 그런데 한국어에서는 그 배수가 더 큽니다. 이 절은 입력 쪽에서 할 수 있는 일입니다.

조합 중 상태가 다 요청이 된다

한글은 글자가 완성되기 전 조합 중 상태에서도 요청이 생긴다 삼성 을 입력하는 동안 삼성 중간 상태가 다 요청이 된다 사 는 삼 과 다른 글자라 그 답이 곧 버려진다 한 글자를 넣는 데 요청이 셋 생긴다 두 가지로 다룬다 완성된 글자만 보낸다 버려질 요청을 없앤다 자모로도 찾게 한다 ㅅㅅ 으로 삼성 을 찾는 사람이 있다 둘은 다른 결정이다. 앞은 요청 수 문제이고 뒤는 색인 문제다

한글은 자모를 조합해 글자를 만듭니다. 삼성을 입력하는 동안 화면에는 여러 중간 상태가 지나갑니다. 그 상태마다 요청을 보내면 한 글자에 요청이 두세 번 생깁니다.

그리고 그 중간 상태의 답은 대개 버려집니다. 사 는 삼 과 다른 글자여서 답이 완전히 다르고, 사용자는 그 답을 보려고 입력한 것이 아닙니다.

완성된 글자만 보내면 버려질 요청이 사라집니다. 이것은 서버가 아니라 입력 쪽에서 하는 결정입니다.

요청을 줄이는 것은 클라이언트의 일이다

서버는 들어온 요청을 거절할 수 없습니다. 요청 수를 줄이는 장치는 전부 클라이언트에 있습니다.

장치무엇을 줄이나
잠깐 기다렸다 보내기빠르게 지나가는 중간 입력
완성된 글자만 보내기조합 중 상태
한두 글자는 안 보내기제안이 무의미한 요청
방금 본 답 재사용글자를 지울 때

이 네 가지로 요청이 크게 줄어듭니다. 서버 용량 산정보다 이쪽이 값싼 개선입니다.

주의할 것은 기다리는 시간입니다. 너무 길게 기다리면 타이핑을 멈춘 뒤에도 제안이 늦게 뜨고, 그러면 100ms 목표를 지켜도 사용자에게는 느립니다.

늦게 온 답이 화면을 덮는 문제

요청을 여러 개 보내면 답이 보낸 순서대로 오지 않습니다.

삼 을 물어본 요청이 늦게 도착
삼성 을 물어본 요청이 먼저 도착

이때 늦게 온 삼 의 답이 화면을 덮으면 사용자가 삼성을 입력했는데 삼 의 제안이 보입니다.

그래서 답에 어느 입력에 대한 것인지를 담고, 지금 입력과 다르면 버립니다. 이것은 서버가 해결할 수 없는 문제입니다. 순서 보장을 서버에 요구하면 요청을 하나씩 보내야 하고, 그러면 느려집니다.

자모로 찾는 것은 다른 결정이다

ㅅㅅ 으로 삼성을 찾으려는 사람이 있습니다. 이것을 지원하려면 검색어마다 자모 형태를 함께 색인해야 합니다.

결정성질
완성된 글자만 보내기요청 수를 줄이는 일
자모로도 찾게 하기색인을 늘리는 일

둘은 반대 방향처럼 보이지만 충돌하지 않습니다. 앞은 조합 중 상태를 보내지 않는 것이고, 뒤는 사용자가 의도적으로 자모만 입력한 경우를 다루는 것입니다. 다만 뒤쪽은 저장이 늘어나므로 요구사항에 있는지 확인하고 넣습니다.

면접에서 이렇게 나옵니다

Q.한글 입력에서 요청이 더 많이 생기는 이유가 무엇입니까

자모를 조합하는 중간 상태마다 요청이 생기기 때문입니다.

삼성을 입력하는 동안 화면에는 여러 중간 상태가 지나갑니다. 그 상태마다 보내면 한 글자에 요청이 두세 번 생깁니다.

그리고 그 답은 대개 버려집니다. 사 는 삼 과 다른 글자라 답이 완전히 다르고, 사용자는 그 답을 보려고 입력한 것이 아닙니다.

완성된 글자만 보내면 버려질 요청이 사라집니다.

흔한 실수: 이것을 서버에서 다루려는 것. 서버는 들어온 요청을 거절할 수 없습니다. 요청 수를 줄이는 장치는 전부 클라이언트에 있습니다.

Q.요청 수를 줄이는 장치를 어디에 두시겠습니까

전부 클라이언트입니다.

장치무엇을 줄이나
잠깐 기다렸다 보내기빠르게 지나가는 중간 입력
완성된 글자만 보내기조합 중 상태
한두 글자는 안 보내기제안이 무의미한 요청
방금 본 답 재사용글자를 지울 때

서버 용량을 늘리는 것보다 값싼 개선입니다.

흔한 실수: 기다리는 시간을 길게 잡는 것. 요청은 줄지만 타이핑을 멈춘 뒤에도 제안이 늦게 뜹니다. 100ms 목표를 지켜도 사용자에게는 느립니다. 응답 시간은 서버 시간이 아니라 손이 멈춘 뒤부터의 시간입니다.

Q.요청을 여러 개 보냈는데 답이 순서대로 오지 않으면 어떻게 하시겠습니까

답에 어느 입력에 대한 것인지 담고, 지금 입력과 다르면 버립니다.

삼 을 물어본 요청이 늦게 도착
삼성 을 물어본 요청이 먼저 도착

늦게 온 삼 의 답이 화면을 덮으면 사용자가 삼성을 입력했는데 삼 의 제안이 보입니다.

이것은 서버가 해결할 수 없습니다. 순서 보장을 요구하면 요청을 하나씩 보내야 하고 그러면 느려집니다.

흔한 실수: 이전 요청을 취소해 해결하려는 것. 취소를 보내도 이미 나간 답이 도착할 수 있습니다. 도착한 답을 검사해 버리는 쪽이 확실합니다.

Q.ㅅㅅ 으로 삼성을 찾게 하는 것은 어떤 종류의 결정입니까

색인을 늘리는 결정입니다. 요청 수를 줄이는 것과는 다른 축입니다.

결정성질
완성된 글자만 보내기요청 수를 줄이는 일
자모로도 찾게 하기색인을 늘리는 일

둘은 반대 방향처럼 보이지만 충돌하지 않습니다. 앞은 조합 중 상태를 보내지 않는 것이고, 뒤는 사용자가 의도적으로 자모만 입력한 경우를 다루는 것입니다.

흔한 실수: 요구사항 확인 없이 넣는 것. 검색어마다 자모 형태를 함께 색인하면 저장과 만드는 시간이 늘어납니다. 두 벌이 메모리에 들어가는지를 이미 아슬아슬하게 계산했다면 이 추가가 그 계산을 깨뜨립니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

검색어 자동완성 설계 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.