on
[클립북] 검색 자동완성 개발 및 최적화
[클립북] 검색 자동완성 개발 및 최적화
검색 자동완성 최적화
목표 :
1. 자음 검색
2. 속도
1. 자음 검색
검색에서 한글 자음('ㄱ', 'ㄴ', 'ㄷ', ...)을 입력하였을 때 자음이 포함된 문자를 찾아주는 검색을 의미합니다.
자음 검색을 알기 위해 필요한 사전 지식은 한글의 구조(초성, 중성, 종성), 한글의 유니코드 구조입니다.
1-1). 사전지식 - 한글의 구조
한글은 낱소리 문자에 속하며, 낱자 하나는 낱소리 하나를 나타낸다. 낱소리는 닿소리(자음)와 홀소리(모음)로 이루어진다.
한 소리마디는 첫소리(초성), 가운뎃소리(중성), 끝소리(종성) 의 낱소리 세 벌로 이루어지는데, 첫소리와 끝소리에는 닿소리를 쓰고 가운뎃소리에는 홀소리를 쓴다. 한글은 낱자를 하나씩 풀어쓰지 않고 하나의 글자 마디로 모아 쓰는 특징을 가지고 있다.
- 위키백과 -
초성 : 19글자 - ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ
중성 : 21글자 - ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ
종성 : 27글자(빈값 포함 시 : 28글자) - ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ
1-2). 사전지식 - 한글의 유니코드
유니코드 (Unicode)는 전 세계의 모든 문자를 컴퓨터 에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준 이며, 유니코드 협회(Unicode Consortium)가 제정한다. 이 표준에는 ISO 10646 문자 집합 , 문자 인코딩 , 문자 정보 데이터베이스, 문자들을 다루기 위한 알고리즘 등을 포함하고 있다.
- 위키백과 -
한글의 유니코드 범위 : U+AC00 – U+D7AF
계산 공식
0. 기본 : U+AC00(유니코드 시작 값) + ((초성 값 x 21) + 중성 값) x 28 + 종성 값
1. 초성: 배열[0~18] => 값을 (21 x 28)로 나눈 몫은 초성
공식 : (획득 코드(charCodeAt) - 0xAC00) / (21 x 28)
2.중성: 배열[0~20] => 값을 (21 x 28)로 나눈 나머지를, 28로 나눈 몫은 중성
공식 : ((획득 코드(charCodeAt) - 0xAC00) % (21 x 28)) / 28
3.종성: 배열[0~27(빈값 포함)] => 값을 28로 나눈 나머지는 종성
공식 : (획득 코드(charCodeAt) - 0xAC00) % 28
2. 속도
2-1). 검색 내용의 분리
문장(나는 개발자입니다.) -> 단어(나는, 개발자, 입니다) -> 문자( 'ㄴㅏㄴㅡㄴ', 'ㄱㅐㅂㅏㄹㅈㅏ', 'ㅇㅣㅂㄴㅣㄷㅏ')
인덱싱(관계형 - n : 1)
2-2). Worker(Thread)
DB 조회 비동기 멀티 쓰레드를 설정하여 충분한 워커 수 확보(접속 POOL 확보 - Back-End)
중복 실행시 마지막 워커 검색만 실행(진행 중인 워커 취소)
2-3). UI
타이핑 후 변경된 항목의 리스트 UI 항목만 수정(React, Vue, Angular - 프레임워크 사용 권장)
이벤트 적용 유의사항 : KeyUp, KeyDown 2가지 이벤트 작동 특징을 파악(이후 후처리 작업 진행)
3. 결과물
클립북 방문하여 검색 확인하기
클립북 도서 제목 검색
4. 기타
자음 검색 적용, 속도 최적화 - 데이터 증가에 따른 확장성 대응 필요.(DB 분산, NoSQL 변경 등)
별도의 검색 전용 API서버가 있으면 좋습니다.(외부 시스템 사용과 분리)
from http://whatpull-dev.tistory.com/3 by ccl(A) rewrite - 2021-03-24 10:00:55