From aba6fac2ae57720703a113e87f1a9b8317d27b60 Mon Sep 17 00:00:00 2001 From: joungmin Date: Mon, 27 Jul 2026 14:18:38 +0900 Subject: [PATCH] =?UTF-8?q?[Reviewer]=20#533=20=EC=96=B8=EA=B8=89=EC=88=98?= =?UTF-8?q?=20=ED=95=84=ED=84=B0=20=EC=B4=88=EA=B8=B0=ED=99=94=20=E2=80=94?= =?UTF-8?q?=20=EB=AA=A8=EB=B0=94=EC=9D=BC=20=EB=82=B4=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=ED=86=A0=EA=B8=80=202=EA=B3=B3=20=EC=84=A4=EA=B3=84=20=C2=A77?= =?UTF-8?q?=20=EC=9D=BC=EA=B4=80=EC=84=B1=20=EB=B3=B4=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - page.tsx: 모바일 "내위치" 토글 2곳 onClick 초기화 목록에 setMinMentions(0) 추가 (데스크톱 토글만 반영돼 있던 설계 §7 상호배타/리셋 일관성 누락 보강) - 설계서 §7: 데스크톱/모바일 토글 전부(3곳) 동일 적용 명시 - tsc/jest(6 suites, 32 tests) 통과. 통상 모바일 흐름에선 no-op(minMentions는 데스크톱 전용 select) Refs #533 Co-Authored-By: Claude Sonnet 5 --- CHANGELOG.md | 7 +++++++ docs/design/533-min-mentions-filter/README.md | 1 + frontend/src/app/page.tsx | 2 ++ 3 files changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea57ede..28d7517 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ ## 2026-07-27 +### ✅ [Reviewer] #533 언급 적은 식당 제외 필터 — 승인 (게이트 통과) +- 검토 대상: backend(`Restaurant.videoCount`, `RestaurantMapper` xml/iface, `RestaurantService`, `RestaurantController`), frontend(`lib/api.ts`, `lib/filters.ts`, `app/page.tsx`), `__tests__/filters.test.ts` +- 정확성: video_count 스칼라 서브쿼리(strong/unknown)와 min_mentions 서버필터 로직 일치. DISTINCT+스칼라 서브쿼리는 r.id 단위라 결과 불변. 캐시 키에 `mm=` 포함(필터별 분리). `minMentions > 0` 가드로 음수/null 안전. `includeHidden` 오버로드 리팩터링에 유실된 호출부 없음(true 사용처 부재 확인) +- 설계 일치: `docs/design/533-min-mentions-filter/README.md`와 구현 일치. 순수 함수 `passesMinMentions()` 분리로 경계값/null 테스트 6케이스 커버 +- 직접 수정(Reviewer): 설계 §7 "내위치 토글 ON → setMinMentions(0)" 요구 대비 데스크톱 토글만 반영되고 모바일 토글 2곳 누락 → 두 모바일 토글에 `setMinMentions(0)` 추가(반응형 리사이즈 시 일관성 확보, 통상 모바일 흐름에선 no-op). tsc/jest(6 suites, 32 tests) 통과 +- 06-Reviewer 승인 → 07-Release 대기 (배포는 Release 단계에서 수행) + ### ✅ [Reviewer] #532 지역 표시 계층화 — 승인 (게이트 통과) - 검토 대상: `frontend/src/lib/region.ts`(`formatRegion`), `RestaurantDetail.tsx`/`RestaurantList.tsx`(적용·렌더 가드), `__tests__/region.test.ts` - 정확성: `formatRegion`은 순수 함수(I/O 없음, 단일 책임). falsy/`null` 토큰(대소문자 무시)/빈 토큰/더미 `나라`/trim/전량 더미(`""`) 모두 정상 처리 — 재실행한 단위 테스트 8/8 통과 diff --git a/docs/design/533-min-mentions-filter/README.md b/docs/design/533-min-mentions-filter/README.md index d77a9ad..8d59df7 100644 --- a/docs/design/533-min-mentions-filter/README.md +++ b/docs/design/533-min-mentions-filter/README.md @@ -34,6 +34,7 @@ - **필터 리셋 일관성**: `minMentions`도 다른 필터(장르/가격/지역/채널)와 동일하게 취급. - 전역 "전체보기" 버튼: 노출 조건에 `minMentions > 0` 포함, 클릭 시 `setMinMentions(0)`로 함께 초기화. - "내위치" 토글 ON: 다른 필터 초기화 목록에 `setMinMentions(0)` 포함(내위치와 상호배타). + 데스크톱/모바일 토글 **전부**(3곳)에 동일 적용 — 반응형 리사이즈 시에도 일관. ## 엣지케이스 - `video_count` 미산정(findById 등) → null. 클라 필터는 `?? 0`로 안전. diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx index b50a078..125bc13 100644 --- a/frontend/src/app/page.tsx +++ b/frontend/src/app/page.tsx @@ -1162,6 +1162,7 @@ export default function Home() { setCountryFilter(""); setCityFilter(""); setDistrictFilter(""); + setMinMentions(0); if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( (pos) => { setUserLoc({ lat: pos.coords.latitude, lng: pos.coords.longitude }); setRegionFlyTo({ lat: pos.coords.latitude, lng: pos.coords.longitude, zoom: 15 }); }, @@ -1274,6 +1275,7 @@ export default function Home() { setCountryFilter(""); setCityFilter(""); setDistrictFilter(""); + setMinMentions(0); if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( (pos) => { setUserLoc({ lat: pos.coords.latitude, lng: pos.coords.longitude }); setRegionFlyTo({ lat: pos.coords.latitude, lng: pos.coords.longitude, zoom: 15 }); },