콘텐츠로 이동

MSG-285 영상 공개범위 FRIENDS(친구만 보기) 확장

티켓: MSG-285 · 작성일: 2026-08-03 · 작성: prd-writer 상태: 검토됨 (2026-08-03 사용자 승인 — 미해결 질문 0)

1. 문제 상황

영상 공개범위는 PUBLIC/PRIVATE 2값뿐이다. 업로드 시 지정(MSG-204)과 더보기 변경(MSG-162)은 2값으로 먼저 출시됐고, 3값째(FRIENDS)는 친구 기능이 생기면 이 티켓으로 확장하기로 결정돼 있었다(2026-08-01, Phase 2). 이제 친구 관계 API(MSG-185)가 완료돼 선행 조건이 해소됐다. 현재 사용자는 "아는 사람에게만 보여주고 싶은" 영상을 PRIVATE(아무도 못 봄)나 PUBLIC(전원 공개) 중 하나로만 올릴 수 있다.

2. 목적 · 목표

  • 목적: 전체 공개와 비공개 사이의 중간 단계 — 영상을 친구에게만 공개할 수 있게 한다.
  • 목표:
  • 사용자가 업로드 확정·공개범위 변경에서 FRIENDS를 지정할 수 있다
  • FRIENDS 영상은 소유자 본인과 수락된(ACCEPTED) 친구만 재생할 수 있다
  • 친구가 아닌 사용자에게는 PRIVATE와 동일하게 존재 자체가 숨겨진다
  • 비목표(스코프 제외):
  • FRIENDS 영상의 목록 노출 (격자 상세 영상 목록·격자 대표 영상·탐색 집계 등에 "친구의 FRIENDS 영상"을 포함시키는 조회 경로) — 친구 도감 레이어(MSG-187) 기획과 함께 재설계. 이번 티켓은 값·지정·재생 판정의 계약 선행이다 (미해결 질문 1 참조)
  • 기존 영상 소급 전환 (MSG-204와 동일 원칙)
  • 공개범위 기본값 설정 저장 (MSG-204에서 폐기된 항목)
  • 차단(BLOCKED) 관계의 특수 처리 — 차단 기능 자체가 후속(MSG-185 비목표)

3. 기능 요구사항

ID 요구사항 우선순위
FR-1 사용자는 업로드 확정 시 공개범위로 FRIENDS를 지정할 수 있다 Must
FR-2 사용자는 내 영상의 공개범위를 FRIENDS로, FRIENDS에서 다른 값으로 변경할 수 있다 Must
FR-3 FRIENDS 영상의 소유자 본인은 항상 재생할 수 있다 (status 등 기존 조건은 그대로) Must
FR-4 소유자와 ACCEPTED 친구 관계인 사용자는 FRIENDS 영상을 재생할 수 있다 — 관계 방향(누가 요청했는지) 무관 Must
FR-5 친구가 아닌 사용자가 FRIENDS 영상 재생을 요청하면 PRIVATE 비소유자와 완전 동일하게 처리한다 — 403 "비공개 영상입니다"(기존 에러 재사용, MSG-206 확정 정책 계승). 재생 URL이 발급되어서는 안 된다 (2026-08-03 정정 — 당초 404 은닉 안은 PRIVATE 실제 동작이 403인 사실 확인으로 폐기) Must
FR-6 친구 삭제 즉시 상대의 FRIENDS 영상은 재생할 수 없다 — 관계는 요청 시점에 실시간 판정한다 Must
FR-7 FRIENDS 영상은 전역 노출 경로(격자 대표 영상·전역 목록·탐색 집계 등)에 노출되지 않는다 — 기존 PUBLIC 한정 조회가 유지됨을 검증 Must
FR-8 허용되지 않는 공개범위 값 요청은 기존 INVALID_VISIBILITY 에러로 실패하고, 에러 메시지·API 문서가 3값(PUBLIC/PRIVATE/FRIENDS)을 반영한다 Must
FR-9 공개범위는 노출 정책일 뿐 기록 사실을 바꾸지 않는다 — FRIENDS 영상도 점령·도감·스트릭·핫스코어 판정에 기존(PUBLIC/PRIVATE)과 동일하게 반영된다 Must

4. 비기능 요구사항

분류 요구사항
보안/인가 핵심 회귀 지점: 재생 판정이 현재 "PRIVATE && 비소유자만 차단" 형태라, FRIENDS를 단순 추가하면 비친구에게 재생 URL이 발급된다. 비친구에게 사전서명 URL이 새는 경로가 없어야 하며, 실패 응답은 PRIVATE와 동일한 403이다
성능 재생 판정에 친구 관계 조회가 1회 추가된다 — 복합 PK/유니크 인덱스 수준의 단건 조회여야 하며 재생 API p95에 유의미한 영향이 없어야 한다
데이터 정합 DB CHECK 제약(PUBLIC/PRIVATE)의 3값 확장 마이그레이션 필요. 기존 행 데이터 무변경. 친구 판정은 friendships의 대칭 쌍(방향 무관) 기준
운영 마이그레이션 1건(CHECK 교체). FRIENDS 행이 생긴 뒤 구버전으로 롤백하면 CHECK 위반 — 릴리스 노트에 명시. 인덱스 무변경(목록 노출이 비목표라 PUBLIC partial index 영향 없음)

5. 시퀀스 다이어그램

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

6. 클래스 다이어그램

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

7. 변경 파일 목록

파일 변경 Owner
src/main/java/com/msg/fillmap/video/entity/Visibility.java 수정 — FRIENDS 상수 추가 B
src/main/java/com/msg/fillmap/video/service/VideoServiceImpl.java 수정 — getVideoPlayback 재생 판정 확장(친구 판정 소비) B
src/main/java/com/msg/fillmap/friend/service/FriendService.java(+Impl) 수정 — 친구 여부 read 메서드 추가 (video↔friend 둘 다 Owner B — 계약 인터페이스 불요) B
src/main/java/com/msg/fillmap/video/exception/VideoErrorCode.java 수정 — INVALID_VISIBILITY(3420) 메시지 3값 반영 B
src/main/java/com/msg/fillmap/video/dto/VideoVisibilityRequestDto.java · VideoController.java 수정 — Swagger 문구 3값 반영 B
src/main/resources/db/migration/V20__videos_visibility_friends.sql 신규 — chk_videos_visibility 3값 확장 -
.claude/rules/glossary.md 수정 — "친구 공개(FRIENDS)" 용어 등재 -

8. 미해결 질문

없음 — 유일 쟁점이었던 "친구 대상 목록 노출 포함 여부"는 제외로 확정 (2026-08-03 사용자 결정). 이번 티켓은 값·지정·재생 판정의 계약 선행이며, MVP에서 친구가 FRIENDS 영상에 도달할 UI 경로는 아직 없다(BE 계약 선행 — MSG-204와 동일 패턴). 노출 경로는 MSG-187 친구 레이어와 함께 재설계한다 (§2 비목표 반영).