왓풀(whatpull)
[클립북] 검색 자동완성 개발 및 최적화 본문
검색 자동완성 최적화
목표 :
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서버가 있으면 좋습니다.(외부 시스템 사용과 분리)
'웹개발 > [서비스] 노하우' 카테고리의 다른 글
[클립북] 에디터 개발 (0) | 2021.03.24 |
---|---|
[클립북] 이벤트 캡쳐, 버블링 최적화 (0) | 2021.03.24 |
[클립북] "리뷰 좋아요" 버튼 개발 (0) | 2021.03.24 |
[클립북] CSS 애니메이션 최적화 (0) | 2021.03.24 |