Skip to content

피드 친구 검색·팔로우 v1 (2026-08-22)

증상

모바일 피드 탭의 "친구 추가" 시트에서 친구 아이디를 검색해도 아무 결과가 나오지 않았다.

원인

검색이 "안 되는" 게 아니라 애초에 배선이 없었다.

  • UiFeedScreen의 시트(검색창·팔로우 버튼)는 2026-07-22 계약(docs/contracts/feed-props.md)으로 UI만 랜딩돼 있었고, mobileApp.tsxfollowing / 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.sqlpublic.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.sql22 assert — 검색 의미론, 팔로우/언팔로우 왕복, 거부 3종, RLS 가시성·직접 쓰기 차단, anon 실행 불가, 계정 삭제 cascade.
클라이언트services/domains/socialDomain.ts + barbelicRepository 4함수 + barbelicApi 노출 + types/supabase.ts RPC 타입맵. controllers/followingStore.ts(프레임워크 무의존: 목록 로드·250ms 디바운스 검색·늦은 응답 폐기·팔로우/언팔로우 낙관 반영→토스트→재동기화·오너 전환 리셋) + followingController.ts(피드 탭 진입 시 1회 로드) → appController 렌더 컨텍스트 → mobileAppUiFeedScreen props에 연결. ui/** 무접촉.
행동 테스트 tests/react/followingStore.test.mjs8건.
문서feed-props.md(운영 배선 절), PRD §5.7·격차표, rpc-catalog.md §2.

결정·한계 (오너 확인 사항)

  • 아이디 = 닉네임으로 검색한다. 유일 @handle이 필요하면 profiles에 별도 정규화 컬럼 + 온보딩 저장 + 중복 검사 RPC가 따로 필요하다(온보딩 화면의 핸들 입력은 현재 버려진다).
  • 검색 결과 행의 @handle 자리에도 닉네임을 싣는다(UI 무접촉 원칙; 유일 핸들이 생기면 교체).
  • 친구 사진은 v1 제외(profile-images 버킷이 본인 폴더만 읽힘 → 이니셜 폴백). 친구 프로필 시트·친구 홈 페이지·팔로잉 포스트 피드는 계약만 유지.
  • 닉네임은 중복이 허용되므로 같은 닉네임이 여러 명이면 결과에 나란히 나온다(정렬: 정확 일치 → 접두 일치 → 이름순).

검증

  • 로컬 샌드박스 스택에서 db reset + supabase test db 45파일·642 assert PASS(#587의 440000과 함께 적용).
  • npm run check(전체 테스트)·check:unused·build PASS.
  • 브라우저 스모크(로컬 스택 + 온보딩 완료 계정 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 위 재베이스).