[Fix] : 검색 자동완성 별칭 치환·초성 매칭 오작동 수정 (#320) - #323
Open
GulSam00 wants to merge 10 commits into
Open
Conversation
getChoseong은 공백을 그대로 남긴다 — getChoseong('요네즈 켄시')는 'ㅇㄴㅈ ㅋㅅ'다.
사람은 초성을 붙여서 치므로("ㅇㄴㅈㅋㅅ") startsWith 비교가 공백에서 실패했다.
전사된 일본 아티스트명은 대부분 "성 이름" 꼴이라 초성 검색이 사실상 첫 단어까지만
동작했다. 양쪽에서 공백을 지우고 비교한다.
라벨의 소문자형과 초성형은 후보를 만들 때 미리 계산해둔다. 입력할 때마다 162개
라벨에 getChoseong을 다시 돌릴 이유가 없다.
함께, 공백만 입력했을 때 무관한 후보 10개가 뜨던 것을 막는다. 빈 문자열은 모든
후보의 접두사라 필터를 그대로 통과했다.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V3Qg1DFPBGjtDjhBN5CuAn
치환 조건이 "후보가 하나일 때"라, 같은 아티스트의 별칭끼리 접두가 겹치면 치환이 통째로 건너뛰어졌다. "원오크"는 "원오크락"과 함께 걸려 후보가 2개가 되는데, ONE OK ROCK은 라틴 표기라 artist_ko가 비어 있어 치환 없이는 검색 결과가 0건이었다. "라르크"(→"라르크 앙 시엘")도 같다. 개수를 세지 말고 입력과 정확히 일치하는 라벨을 찾는다. 대소문자도 무시해 "eve"가 공식 명칭 "Eve"로 치환된다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V3Qg1DFPBGjtDjhBN5CuAn
useDeferredValue를 걷어낸다. 원래 용도는 "입력은 즉시 반응해야 하는데 그 값으로 그리는 목록이 무거울 때"인데, 여기서는 두 전제가 다 어긋난다. 사전 규모가 수백 개 문자열 비교라 미룰 만큼 무겁지 않고, 무엇보다 handleSearch가 이 목록을 읽어 별칭 치환을 판정한다. 목록이 한 박자 늦으면 "검색할 문자열"과 "그 문자열의 후보"가 어긋나, 붙여넣기 직후 엔터나 IME 확정 직후 엔터처럼 지연이 큰 순간에 치환이 조용히 빠진다. 평소에는 늦은 값의 후보가 상위집합이라 우연히 맞아, 재현이 어려운 형태로만 드러난다. 드롭다운이 입력보다 한 렌더 늦게 갱신되던 것도 함께 사라진다. handleSearch의 termOverride·typeOverride는 부르는 곳이 없다(엔터 키와 검색 버튼 두 곳뿐이고 둘 다 인자가 없다). 시그니처만 보면 외부에서 검색어를 주입할 수 있는 것처럼 읽히지만, 실제로 그렇게 부르면 후보 목록은 여전히 입력창의 search 기준이라 치환이 엉뚱하게 동작한다. 필요해지면 후보 계산까지 함께 설계하는 게 맞다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V3Qg1DFPBGjtDjhBN5CuAn
곡 제목이 별칭으로 등록돼 있으면 자동완성이 곡 검색을 아티스트 전곡 검색으로 바꿔버린다. 우세와·신시대(Ado), 나이트댄서(imase), 만찬가(tuki.), 프리텐더(Official髭男dism)를 제거했다. 배치 영향 없음 — translationJpn·backfillArtists는 aliases[0]만 대표 한국어 표기로 읽는데 제거 대상은 전부 인덱스 1 이후다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U4AQGWz3KGURiz6RZ5knEE
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U4AQGWz3KGURiz6RZ5knEE
|
ⓘ Qodo reviews are paused because the subscription is no longer active. Ask your workspace admin to reactivate the subscription to resume reviews. Manage billing |
Owner
Author
|
/describe |
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Owner
Author
|
/review |
Owner
Author
|
/improve |
결과 0건인 오타·존재하지 않는 곡까지 집계되어 인기 검색어가 오염되던 것을 막는다. 검색 실행 시점에는 후보만 잡아두고, 결과가 도착한 뒤 1건 이상일 때만 로그를 남긴다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013T8GYG7XyLmTs1SFKMwsaA
제목 탭에서도 아티스트 후보가 떠서, "원오크"를 고르면 ONE OK ROCK으로 치환된 채 제목 검색이 나가 결과가 0건이었다. 드롭다운만 숨기면 절반만 막힌다. 치환은 handleSearch가 후보 목록을 직접 보고 하므로, 후보를 직접 타이핑해 엔터를 누르는 경로가 그대로 남는다. 후보 목록 자체를 비워 두 경로를 한 곳에서 함께 막는다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013T8GYG7XyLmTs1SFKMwsaA
↑/↓로 후보를 이동하고 엔터로 고를 수 있게 한다. 입력창에 combobox ARIA를, 목록에 listbox/option을 붙여 스크린리더가 활성 후보를 읽을 수 있게 했다. - 내비게이션 로직은 useAutocompleteNavigation 훅으로 분리했다. SearchAutocomplete을 이달의 아티스트 투표 화면도 쓰고 있어, 한쪽만 고치면 거기는 여전히 마우스로만 아티스트를 담을 수 있다. - ↑/↓는 keydown, 엔터는 기존대로 keyup에서 처리한다. 엔터를 keydown으로 옮기면 한글 조합 확정 엔터의 동작이 브라우저마다 달라진다. 방향키에는 isComposing 가드를 뒀다. - listbox 안의 button을 li[role=option]으로 바꿨다. 포커스가 입력창을 떠나면 aria-activedescendant 방식이 깨진다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013T8GYG7XyLmTs1SFKMwsaA
빌드 산출물. lastmod 타임스탬프만 갱신됐다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013T8GYG7XyLmTs1SFKMwsaA
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
📌 PR 제목
[Fix] : 검색 자동완성 별칭 치환·초성 매칭 오작동 수정
📌 변경 사항
자동완성 별칭 치환 (
hooks/useSearchSong.ts)autoCompleteList.length === 1)에서 정확 일치 탐색으로 변경"원오크"→"원오크락"·"원오크"둘 다 걸림 → 치환 없음 → ONE OK ROCK은artist_ko가비어 있어 검색 결과 0건.
"라르크"도 동일.useDeferredValue제거 — 목록이 한 박자 늦어 "검색할 문자열"과 "그 문자열의 후보"가어긋나면 치환이 조용히 빠진다. 사전 규모가 수백 개라 미룰 만큼 무겁지 않다.
handleSearch의 미사용 파라미터(termOverride,typeOverride) 제거초성 검색 (
utils/getArtistAlias.ts)getChoseong('요네즈 켄시') === 'ㅇㄴㅈ ㅋㅅ'인데 사람은초성을 붙여 친다(
'ㅇㄴㅈㅋㅅ'). 전사된 일본 아티스트명은 대부분 "성 이름" 꼴이라거의 전부 첫 단어에서 끊기고 있었다.
별칭 사전 (
packages/constants/src/artistAlias.ts)우세와·신시대(Ado),나이트댄서(imase),만찬가(tuki.),프리텐더(Official髭男dism)translationJpn·backfillArtists는aliases[0]만 대표 한국어표기로 읽는데 제거 대상은 전부 인덱스 1 이후다.
backfillArtistImages는 별칭 전체를매칭 이름으로 쓰므로 곡 제목이 빠진 쪽이 오매칭이 준다.
💬 추가 참고 사항
pnpm build/pnpm lint/pnpm format통과 (테스트 스위트 미구성)artistAlias71명 →/api/artists/search13,869명)은 검색 자동완성 별칭 치환·초성 매칭 오작동 수정 #320 본문에 기재