- 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 <noreply@anthropic.com>
#533 — 언급 적은(관련도 낮은) 식당 제외 필터
배경 / 문제
영상에서 잠깐·우연히 언급된(=관련도 낮은) 식당까지 모두 노출되어 신호 대비 잡음이 큼. 사용자가 "언급이 충분한 식당만" 보도록 제외 필터 제공.
신호 정의
"의미있는 언급 수(video_count)" = 해당 식당의 video_restaurants 링크 중
relevance ∈ ('strong','unknown') 개수. (weak/incidental = 곁다리 언급 → 제외)
→ 기존 findVideoLinks 기본 노출 정책(strong/unknown)과 일관.
범위
- 백엔드: 식당 목록 응답에
video_count포함 +min_mentions서버 필터 파라미터. - 프론트:
Restaurant.video_count타입 + 클라이언트 필터 UI(전체/2회+/3회+). - 서버사이드 필터 일원화(현 클라 필터 패턴 통일)는 #535로 분리.
함수/변경 설계
백엔드
domain/Restaurant.java—Integer videoCount필드 추가(전이 enrichment).mapper/RestaurantMapper.xmlrestaurantMapresultMap:<result property="videoCount" column="video_count"/>findAllSELECT에 스칼라 서브쿼리 추가:(SELECT COUNT(*) FROM video_restaurants vrc WHERE vrc.restaurant_id = r.id AND vrc.relevance IN ('strong','unknown')) AS video_countfindAll<where>에 optional 필터:<if test="minMentions != null and minMentions > 0"> AND (위 서브쿼리) >= #{minMentions} </if>
mapper/RestaurantMapper.java—@Param("minMentions") Integer minMentions추가.service/RestaurantService.java—findAll(..., Integer minMentions, boolean includeHidden)로 스레드. 5-arg 오버로드는null, false전달.controller/RestaurantController.java—@RequestParam("min_mentions") Integer minMentions+ 캐시 키에mm=포함.
프론트
lib/api.ts—Restaurant.video_count?: number | null;getRestaurants파라미터min_mentions?(미래/서버필터용).app/page.tsx— 필터 상태minMentions(0/2/3/5) +filteredRestaurants에(r.video_count ?? 0) >= minMentions가드 + UI 컨트롤 + useMemo deps 추가.- 필터 리셋 일관성:
minMentions도 다른 필터(장르/가격/지역/채널)와 동일하게 취급.- 전역 "전체보기" 버튼: 노출 조건에
minMentions > 0포함, 클릭 시setMinMentions(0)로 함께 초기화. - "내위치" 토글 ON: 다른 필터 초기화 목록에
setMinMentions(0)포함(내위치와 상호배타). 데스크톱/모바일 토글 전부(3곳)에 동일 적용 — 반응형 리사이즈 시에도 일관.
- 전역 "전체보기" 버튼: 노출 조건에
- 필터 리셋 일관성:
엣지케이스
video_count미산정(findById 등) → null. 클라 필터는?? 0로 안전.- minMentions=0(기본) → 필터 미적용(기존 동작 유지).
- DISTINCT + 스칼라 서브쿼리: r.id 단위라 결과 불변.
검증
- 백엔드 빌드 성공 → PM2 재시작.
GET /api/restaurants?min_mentions=2가 2회 미만 식당 제외하는지.- 응답에
video_count포함 확인. - 프론트 토글로 목록/지도가 줄어드는지.