발단은 이랬다. 최근 DDD책으로 유명한 최범균 작가(?)님의 신간 '주니어 백엔드 개발자가 반드시 알아야 할 실무 지식' 책이 2025-04-28 발매되었다.
그 책을 읽다가 다음과 같은 부분이 있었다. 타입이 다른 칼럼 조인 시의 주의점에 대해 적어둔 부분이다.
여기서, utf8mb4와 utf8mb4_unicode_ci 로 굳이 바꾸신 이유가 궁금해져서 찾다보니, 다음과 같은 사항을 알 수 있었다.
"MySQL 8.0.1 이후 default 콜레이션이 'utf8mb4_0900_ai_ci' 로 변경되었는데, 이게 한글 등의 특정 문자열 검색 처리에 문제가 있다"는 얘기였다.
우선 사실 확인을 위해 MySQL 8.0.41을 로컬에 설치해봤고, default가 utf8mb4_0900_ai_ci 가 맞음을 확인했다.
다음으로 한글 검색 시 문제점에 대해서도 실험해봤다. 대충 아래처럼 데이터를 넣어주고..
검색을 해보니 확실히 문제가 있음을 확인했다.
참고로 alter table nahwasa modify name varchar(200) collate utf8mb4_unicode_ci not null; 처럼 작성해서 utf8mb4_unicode_ci로 변경해보면 아래처럼 정상적으로 검색된다.
여기까지 보고 든 생각은, "어? 이럼 like 검색에 고객이 입력한 문자열 사이사이 %를 넣어버리면 저 콜레이션 문제점을 활용해 한글 초성검색 날로먹을 수 있는거 아닌가?" 였다. 참고로 당연히 이 생각이 들었기 때문에 MySQL 설치해서 직접 실험해본거긴 하다 ㅋㅋ
초성검색은 아래와같은 기능이다. (op.gg 챔피언 초성 검색 예시)
실제로 구현하려면 다른 서비스를 추가로 사용하거나, 유니코드 코드값 가지고 미리 자음부분 잘라서 저장해두는 과정이 필요해서 귀찮다. 근데 utf8mb4_0900_ai_ci 에 한글 검색 시 문제점이 있으니깐, 실제 데이터가 '다리우스' 더라도 'ㄷㅏㄹㅣㅇㅜㅅㅡ' 로 검색해도 나오니까! like로 '%ㄷ%ㄹ%ㅇ%' 이런식으로 걸면 'ㄷㅏㄹㅣㅇㅜㅅㅡ' 이렇게 걸리니 날로먹을 수 있지 않을까 싶었다.
이게 가능하다면, 어차피 칼럼별로 콜레이션 지정이 가능하니 초성검색 사용할 칼럼에 utf8mb4_0900_ai_ci를 적용해서 쓰면 될꺼라 생각했다. 롤 캐릭터 처럼 그리 많지 않은 데이터에 대해선 이런 부분에서 성능도 전혀 문제가 없을테니 좋을 것 같았다.
짧은 생각이었다. 결론은 안된다 ㅜ
'%' 넣기 전에도 안된다. like 일 시엔 문자열 비교 알고리즘이 사용되니 그렇다.
MySQL을 확인해보니 LIKE 검색 시에는 Turbo Boyer-Moore 알고리즘이라는게 쓰인다고 한다.
대충 찾아보니 KMP 알고리즘과 비슷한 것 같다. 현재 백준 다이아5 티어지만, 사실 KMP는 직관적으로 이해가 안되서 넘겼었다. 조만간 알고리즘도 다시 시작하면 KMP도 확인해보고, Turbo Boyer-Moore 알고리즘도 확인해봐야겠다.
결론적으론 like 검색 시엔 문자열을 비교하는 알고리즘이 쓰이므로, 초성을 가지고 완성형 검색을 날로먹을 순 없었다. 실패했지만, 해당 책 내용에 대해 여러모로 이해할 수 있던 기회라 재밌었다.
references
- 주니어 백엔드 개발자가 반드시 알아야 할 실무 지식 (최범균 저)
- [MySQL] Character Set, Collation 확인(utf8mb4_general_ci로 바꿔라💥)
- MySQL 8.0.1 utf8mb4_0900_ai_ci의 한글 사용에 대한 문제점
- MySQL -10.3.9 Comparison of B-Tree and Hash Indexes
'Development > 기타 개발관련' 카테고리의 다른 글
개발자가 질문하는 방법 (회사, 상사, 커뮤니티, 개발관련 질문 등) (25) | 2024.02.25 |
---|---|
귀찮지만 확실한 랜섬웨어 예방 (윈도우 디펜더만 사용) (0) | 2023.03.20 |
개발자 윈도우 세팅 (WSL 서브 리눅스, IntelliJ, vscode, git 등) (2) | 2022.07.24 |
rsync를 사용해서 Synology NAS로 데이터 자동 백업하기 (리눅스용) (0) | 2022.02.08 |
우분투 20.04(WSL) 마리아 DB 서버 설치 방법 (wsl ubuntu mariadb server) (0) | 2022.01.06 |
댓글