콘텐츠로 이동

MSG-185 친구 코드·친구 관계 API (요청/수락/거절/삭제)

티켓: MSG-185 · 작성일: 2026-08-03 · 작성: prd-writer 상태: 검토됨 (2026-08-03 사용자 Q&A로 미해결 질문 전건 확정)

1. 문제 상황

친구 에픽(MSG-172)의 모든 기능(친구 도감 레이어·친구 프로필·친구만 보기 공개범위)은 "친구 관계"가 있어야 시작되는데, 현재 백엔드에는 관계를 만들 방법이 없다 — friendships 테이블은 V1 스키마에 준비돼 있지만 엔티티·API 등 코드 참조가 0건이다. 친구를 추가할 진입 동선도 없었으나, 2026-08-03 고정 친구 코드 방식으로 확정됐다(MSG-172 코멘트): 닉네임은 중복을 허용하므로(MSG-203) 검색으로 상대를 특정할 수 없고, 카카오 친구 연동은 비즈 앱 전환이 선행돼야 해서 배제됐다.

2. 목적 · 목표

  • 목적: 친구 관계의 생성(코드 기반 요청)부터 해소(삭제)까지 전체 수명주기 API를 제공해 친구 에픽 후속 티켓(MSG-186·187·285)의 선행 조건을 해소한다.
  • 목표:
  • 사용자가 내 친구 코드를 확인하고, 상대 코드를 입력해 친구 요청을 보낼 수 있다
  • 받은 요청을 수락/거절할 수 있고, 수락 시 양쪽 모두에게 친구 관계가 성립한다
  • 친구를 삭제하면 관계가 해소된다
  • 비목표(스코프 제외):
  • 그룹(다인) 개념 — MSG-172 결정 2 미확정, MSG-188 잔여 범위
  • 친구 목록·친구 프로필/도감 조회 — MSG-186 (프라이버시 결정 3 대기)
  • 친구 도감 격자 시각화 — MSG-187 (결정 4 대기)
  • QR·공유 링크 생성 — 코드의 FE 표현형, 서버 작업 없음
  • 일회성 초대 링크(만료 토큰) — 고정 코드 채택으로 배제
  • 차단(BLOCKED) — 후속 (2026-08-03 확정). 스키마 상태는 있으나 MVP 미구현, 거절 후 재요청은 허용
  • 친구 코드 재발급(변경) — 후속 (2026-08-03 확정). 유출 피해는 거절로 대응

3. 기능 요구사항

ID 요구사항 우선순위
FR-1 로그인 사용자는 자신의 친구 코드를 조회할 수 있다 Must
FR-2 모든 사용자는 가입 시점부터 고유한 친구 코드를 가진다 (기존 가입자는 마이그레이션으로 일괄 부여) Must
FR-3 사용자는 친구 코드로 상대 닉네임을 미리 확인할 수 있다 — 요청 확정 전 "OOO님에게 요청을 보낼까요?" 확인 화면용 (2026-08-03 확정: 제공) Must
FR-4 사용자는 상대의 친구 코드를 입력해 친구 요청을 보낼 수 있다 (요청 상태 PENDING) Must
FR-5 자신의 코드로 요청하면 실패한다 (자기 자신에게 요청 불가) Must
FR-6 존재하지 않는 코드로 요청하면 실패한다 Must
FR-7 이미 친구(ACCEPTED)이거나 내가 보낸 요청이 대기(PENDING) 중이면 중복 요청은 실패한다 Must
FR-8 상대가 나에게 보낸 요청이 대기 중일 때 내가 상대 코드로 요청하면 자동 수락되어 친구가 된다 — 양쪽 다 추가 의사를 밝힌 것 (2026-08-03 확정) Must
FR-9 사용자는 자신이 받은 친구 요청 목록(보낸 사람 식별 정보 포함)을 조회할 수 있다 Must
FR-10 받은 요청을 수락하면 관계가 ACCEPTED가 되고 양쪽 모두의 친구가 된다 Must
FR-11 받은 요청을 거절할 수 있다. 거절해도 보낸 쪽에 별도 통지는 없고, 상대는 재요청할 수 있다 (차단 미도입 확정에 따름) Must
FR-12 친구(ACCEPTED) 관계는 어느 쪽이든 삭제할 수 있고, 삭제 즉시 양쪽 모두에서 해소된다 Must
FR-13 요청 수락/거절은 그 요청의 수신자만, 삭제는 관계 당사자만 할 수 있다 (타인 관계 조작 불가) Must
FR-14 계정이 삭제되면 그 사용자가 얽힌 친구 관계·대기 요청도 함께 사라진다 (MSG-205 CASCADE 정합) Must

4. 비기능 요구사항

분류 요구사항
보안/인가 전 API 토큰 필수. 친구 코드 무차별 대입으로 계정 존재를 열거하기 어렵도록 코드 탐색 공간을 충분히 크게 잡는다 — 제안: 혼동 문자(I·O·0·1) 제외 대문자+숫자 32종 8자(탐색 공간 ≈1.1조), 최종 형식은 스펙에서 확정
데이터 정합 친구 코드는 전역 유일. 동일 쌍의 관계 행은 방향 무관 최대 1개 (A→B와 B→A 동시 존재 금지)
운영 users 마이그레이션 1건(코드 컬럼 + 기존 가입자 백필 + UNIQUE·NOT NULL) — 가입 경로(LOCAL·KAKAO 양쪽)가 코드 생성을 포함해야 신규 가입자 무결

5. 시퀀스 다이어그램

시퀀스 다이어그램
시퀀스 다이어그램

6. 클래스 다이어그램

클래스 다이어그램
클래스 다이어그램

7. 변경 파일 목록

파일 변경 Owner
src/main/resources/db/migration/V17__users_friend_code.sql 신규 — friend_code 컬럼·기존 유저 백필·UNIQUE/NOT NULL -
src/main/java/com/msg/fillmap/user/entity/User.java 수정 — friendCode 필드·생성 시 부여 B
src/main/java/com/msg/fillmap/friend/ (패키지 신설: entity·repository·service·controller·dto·exception) 신규 — Friendship 엔티티(복합 키)·관계 API 전체 B
src/main/java/com/msg/fillmap/auth/service/OidcLoginService.java · AuthService.java 수정 — 가입 시 친구 코드 생성 경로 (User 팩토리 내부화 여부는 스펙 결정) B
.claude/CLAUDE.md · .claude/docs/status.md 수정 — Owner B에 friend.* 등재·구현 현황 -

8. 미해결 질문

없음 — 2026-08-03 사용자 Q&A로 전건 확정:

  • 역방향 PENDING에서 재요청 → 자동 수락 (FR-8)
  • 차단(BLOCKED) → 미포함, 후속 (비목표)
  • 코드 재발급 → 미포함, 후속 (비목표)
  • 코드 입력 시 상대 닉네임 미리보기 → 제공 (FR-3)
  • 코드 형식 → 혼동 문자 제외 8자 제안 승인, 세부는 스펙에서 (비기능 보안)
  • REJECTED 후 재요청 → 허용 (FR-11)