한글단어 자동완성 삽질(용두사미 주의)
업무로 검색시 정해진 특정 단어들에 한해 자동완성을 구현해야 했다.
길고 긴 삽질 끝에 결국은 라이브러리를 이용했지만.. 기록삼아 삽질 내역을 남겨 본다.
우선 "조말론" 이라는 단어를 자동완성시키고 싶다고 했을 때,
"조말론"은 물론이고 조ㅁ, 좀, 조마, 조말ㄹ,.. 등
해당 단어가 완성되기 위한 모든 중간 과정 단어들을 타이핑했을 때도 "조말론"을 자동으로 완성하고 싶었다.
1. 입력된 키값을 개별로 저장하여 join으로 합쳐 비교하기
단순하게 키값이 입력될 때마다 ㅈ,ㅗ,ㅁ,ㅏ,ㄹ,.. 등의 배열을 만들고 합쳐서 정규식으로 비교하려고 했다.
결론만 말하면, join("")은 사용할 수 없다... 당연하지... 왜 이게 될거라고 생각했을까...^^
join으로 ㅈㅗㅁㅏㄹㄹㅗㄴ으로 조말론을 만들어도 브라우저(크롬)에서는 분리된 채로 나왔다...
이후 시도를 종합해보면 당연히 그럴 수밖에 없을 것 같지만.. 이때까진 몰랐다.
2. 자동완성 대상인 단어의 자음과 모음을 분리하여 순서 비교하기
정해진 단어들의 자음과 모음을 모두 분리하여 따로 저장하고 이걸 토대로 비교하려고 한다.
즉, 단어를 분해해서 자음과 모음의 배열로 만들고
미리 준비해 둔 자음과 모음의 배열과 비교해서 순서와 요소가 일치하면 맞는식으로!
{
"key" : "조말론",
"subKey" : ["ㅈ","ㅗ","ㅁ","ㅏ","ㄹ","ㄹ","ㅗ","ㄴ"]
}
이런식으로 온전한 검색어가 될 key와 그 단어를 이루는 모든 자음과 모음의 배열 subKey를 저장했다.
* 단어의 자음을 분리하는 작업은 파이썬의 jamo 라이브러리를 사용했다.
그리고 키보드에 이벤트를 걸고, 입력된 키를 인식하여
데이터에 저장된 바와 같은 순서로 같은 자음/모음이 입력됐을 때 해당하는 단어들을 버블로 보여주려 했다.
근데 생각대로 작동하지 않아 입력된 키와 해당 키의 코드를 찍어보니...
VM3500:2 ᄌ 4364
VM3500:2 ᅩ 4457
VM3500:2 ᄆ 4358
VM3500:2 ᆯ 4527
VM3500:2 ᄅ 4357
VM3500:2 ᅩ 4457
VM3500:2 ᆫ 4523
같은 ㄹ인데 코드값은 다르게 나오는 걸 확인했다. 엥?
근데 유니코드로 비교하니 초성, 종성, 단순자음의 모든 유니코드가 달랐다.
종성 ㄹ은 4527, 초성 ㄹ은 4357, 자음 자체의 ㄹ은 12601...
이제 보니 한글의 경우 종성, 초성, 단독 자음의 유니코드가 다 다르고,
이를 통일시키기 위해선 normalize를 사용하면 된다고 한다.
그래서 아래처럼 테스트를 해 봤는데...
그래도 초성과 종성이 구분되지 않았다. 초성과 단순 자음은 구분이 되는데..
그리고 이렇게 하니깐 이중받침을 할 수가 없다..
조말론같이 하나의 받침인 단어는 문제가 없지만,
"원치않다"와 같은 단어의 경우 원치안<에서 자동완성돼야하는데 이런 경우를 해결할 수 없다.
미리 이중받침의 자음까지 다 분해해서 준비해 둔다고 해도...
그럼 입력할 때마다 해당 키보드로 입력소스를 하나하나 넣어줘야하는데
그러면 keyup이벤트를 백스페이스, 화살표, 스페이스바 등등 모조리 오버라이딩해야했다.. 변수도 너무 많고!!
3. 외부 라이브러리 사용하기
그래서 결국.. 정규식을 활용한 라이브러리를 사용해서 해결했다.. 싱거운 해결.. :(
참고 블로그
https://bluewings.github.io/unobstructed-hangul-regular-expression/
성태님 블로그 - 같은 모양, 다른 값의 한글 자음을 비교하는 호환 분해
'웹 > ETC' 카테고리의 다른 글
알림서비스를 위해 웹소켓 통신을 rabbitMQ로 대체하기 (0) | 2024.04.22 |
---|---|
커스텀 프로토콜로 일렉트론 클라이언트 실행시키기 (0) | 2024.04.09 |
일렉트론 로그 확인하기 (0) | 2024.04.09 |