피드 친구 검색·팔로우 v1 (2026-08-22)
증상
모바일 피드 탭의 "친구 추가" 시트에서 친구 아이디를 검색해도 아무 결과가 나오지 않았다.
원인
검색이 "안 되는" 게 아니라 애초에 배선이 없었다.
UiFeedScreen의 시트(검색창·팔로우 버튼)는 2026-07-22 계약(docs/contracts/feed-props.md)으로 UI만 랜딩돼 있었고,mobileApp.tsx는following / friendResults / onSearchFriends / onFollow / onUnfollow를 하나도 넘기지 않았다 → 타이핑해도 아무 일도 일어나지 않음.- 서버에도 팔로우 저장소·검색 RPC가 없었다(PRD §5.7 "계약만 존재").
- "아이디"로 쓸 수 있는 식별자는 닉네임(
profiles.display_name)뿐이다. 온보딩 화면이 입력받는 별도@handle은 컨테이너가 어디에도 저장하지 않는다(docs/data/onboarding-data-model.md: v1은 유일 핸들 없음).
변경
| 층 | 내용 |
|---|---|
DB 20260821460000_feed_friend_follow_v1.sql | public.user_follows(follower/followee PK, 자기 자신 금지, profiles cascade, RLS = 본인 follower 행 읽기만, 직접 쓰기 권한 없음) + RPC 4종: search_user_profiles_v1(닉네임 부분일치·대소문자/선두 @ 무시·본인/온보딩 미완료 제외·빈 검색어 0행·≤50) · follow_user_v1(멱등, 자기 자신 22023·없는/미완료 프로필 P0002) · unfollow_user_v1 · list_following_v1. 전부 security definer·auth.uid() 스코프·authenticated만 실행. |
pgTAP feed_friend_follow_v1.test.sql | 22 assert — 검색 의미론, 팔로우/언팔로우 왕복, 거부 3종, RLS 가시성·직접 쓰기 차단, anon 실행 불가, 계정 삭제 cascade. |
| 클라이언트 | services/domains/socialDomain.ts + barbelicRepository 4함수 + barbelicApi 노출 + types/supabase.ts RPC 타입맵. controllers/followingStore.ts(프레임워크 무의존: 목록 로드·250ms 디바운스 검색·늦은 응답 폐기·팔로우/언팔로우 낙관 반영→토스트→재동기화·오너 전환 리셋) + followingController.ts(피드 탭 진입 시 1회 로드) → appController 렌더 컨텍스트 → mobileApp이 UiFeedScreen props에 연결. ui/** 무접촉. |
행동 테스트 tests/react/followingStore.test.mjs | 8건. |
| 문서 | feed-props.md(운영 배선 절), PRD §5.7·격차표, rpc-catalog.md §2. |
결정·한계 (오너 확인 사항)
- 아이디 = 닉네임으로 검색한다. 유일
@handle이 필요하면profiles에 별도 정규화 컬럼 + 온보딩 저장 + 중복 검사 RPC가 따로 필요하다(온보딩 화면의 핸들 입력은 현재 버려진다). - 검색 결과 행의
@handle자리에도 닉네임을 싣는다(UI 무접촉 원칙; 유일 핸들이 생기면 교체). - 친구 사진은 v1 제외(
profile-images버킷이 본인 폴더만 읽힘 → 이니셜 폴백). 친구 프로필 시트·친구 홈 페이지·팔로잉 포스트 피드는 계약만 유지. - 닉네임은 중복이 허용되므로 같은 닉네임이 여러 명이면 결과에 나란히 나온다(정렬: 정확 일치 → 접두 일치 → 이름순).
검증
- 로컬 샌드박스 스택에서
db reset+supabase test db45파일·642 assert PASS(#587의 440000과 함께 적용). npm run check(전체 테스트)·check:unused·buildPASS.- 브라우저 스모크(로컬 스택 + 온보딩 완료 계정 3개, 모바일 뷰포트): 피드 탭 → 친구 추가 → "바벨" 입력 →
바벨 친구 김1행(본인·영문 계정 제외) → 팔로우 → 버튼 "팔로잉"·헤더 "팔로잉 1명" → "FRIEND lee" 대소문자 무시 검색 → 검색어 비우면 팔로잉 목록 → 언팔로우 → "팔로잉 0명". 네트워크list_following_v1 → search_user_profiles_v1(버스트당 1회) → follow_user_v1 → list_following_v1전부 200, 콘솔 오류 0. - 번호: 440000은 #587이 선점해 460000으로 재번호(origin/main 위 재베이스).