19 KiB
크리에이터 채널 공유 구현 계획
| 문서 항목 | 내용 |
|---|---|
| 상태 | 구현 완료, 수동 검증 대기 |
| 작성일 | 2026-09-14 |
| 요구사항 기준 | docs/20260914_크리에이터_채널_공유/prd.md |
| API 기준 | 해당 없음 |
| 현재 Phase | Phase 1: 채널 공유 진입점과 공유 시트 연결 |
| 현재 활성 Goal | P1-GATE 수동 검증 |
목표
내 채널과 다른 사람 채널에서 모두 기존 채널 공유 메시지와 OneLink URL을 iOS 공유 시트로 공유할 수 있게 한다.
현재 상태
| Phase | 상태 | 완료 Task | 활성/다음 Goal | 차단 또는 남은 조건 |
|---|---|---|---|---|
| 1 | 수동 검증 대기 | 4/4 |
P1-GATE |
실제 채널 진입 후 공유 시트 표시 수동 확인 필요 |
- 동시에 하나의 미완료 goal만 운용한다.
- 완료된 Task와 검증 기록은 되돌리거나 삭제하지 않는다.
- 구현은 완료했으며, 사용자 요청에 따라 visual QA 없이 수동 테스트로 최종 확인한다.
범위
포함
- 내 채널 title bar 우측 상단 공유 버튼 추가 계획
- 다른 사람 채널 더보기 overlay 최상단
채널 공유항목 추가 계획 - 기존
UserProfileViewModel.shareChannel과 동일한 OneLink/메시지/ActivityViewController공유 동작 연결 계획 - 공유 실패 popup, 빌드, 수동 검증 기준
제외
- 새 공유 문구 또는 새 딥링크 계약 생성
- 새 API 추가
- 공유 URL 생성 로직의 공용 helper 분리
- 커밋 생성
기술적 제약
- 기술 스택: Swift, SwiftUI, 기존
ActivityViewController, 기존 OneLink URL 생성 함수 - 아키텍처:
CreatorChannelView는 화면 상태와 공유 시트 표시 상태를 소유하고, title bar와 더보기 overlay는 action closure로 공유 동작을 호출한다. - 데이터·보안: 공유 메시지에는 nickname과 OneLink URL만 포함하고 token·개인정보를 포함하지 않는다.
- 의존성: 신규 dependency를 추가하지 않는다.
- 계약:
af_dp=voiceon://,deep_link_value=channel,deep_link_sub5={creatorId}를 기존 공유와 동일하게 사용한다. - 검증: 테스트 타깃이 확인되지 않으므로 focused build와 수동 검증을 완료 증거로 사용한다.
주요 대상 파일
수정
SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swiftSodaLive/Sources/V2/CreatorChannel/CreatorChannelViewModel.swiftSodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelTitleBar.swiftSodaLive/Sources/Report/ProfileReportMenuView.swiftSodaLive/Sources/I18n/I18n.swift
확인
SodaLive/Sources/Explorer/Profile/UserProfileView.swiftSodaLive/Sources/Explorer/Profile/UserProfileViewModel.swiftSodaLive/Sources/Common/ActivityViewController.swiftdocs/agent-guides/build-test-verification.md
Phase 1: 채널 공유 진입점과 공유 시트 연결
Phase 결과: 내 채널 공유 버튼과 다른 사람 채널 더보기 공유 항목에서 동일한 채널 공유 시트를 열 수 있다.
선행조건: docs/20260914_크리에이터_채널_공유/prd.md의 요구사항 확정.
Phase 완료 조건: P1-T1~P1-T4와 P1-GATE 완료, 검증 기록 누적.
구현 항목
Task 1.1 title bar 공유 진입점 정의
Goal 실행 P1-T1: 내 채널 title bar에 직접 공유 버튼을 표시할 수 있도록 CreatorChannelTitleBar contract를 확장한다.
- 시작 조건:
CCSHARE-001확정. - 완료 증거: title bar가 내 채널과 다른 사람 채널 action 구성을 분리하고
ic_audio_content_share버튼을 표시할 수 있음. - 범위 밖: 공유 URL 생성과
ActivityViewController표시.
Files:
- Modify:
SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelTitleBar.swift - Modify:
SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift - Test: 테스트 타깃 없음. 빌드와 수동 검증으로 대체.
TDD 예외 사유: 현재 SodaLive.xcodeproj/project.pbxproj 기준으로 테스트 번들 타깃이 확인되지 않아 UI contract 변경은 focused build와 수동 검증으로 판정한다.
대체 검증 방법: 구현 후 아래 명령과 수동 확인을 수행한다.
rg "ic_audio_content_share|onTapShare|showsCreatorActions|CreatorChannelTitleBar" SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelTitleBar.swift SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift
xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build
Expected:
-
CreatorChannelTitleBar에서 공유 action과ic_audio_content_share사용이 확인된다. -
CreatorChannelView가 내 채널 여부에 따라 공유 버튼 또는 더보기 버튼 구성을 전달한다. -
빌드 exit code가 0이다.
-
title bar contract에 공유 action을 추가한다.
-
내 채널일 때 공유 버튼이 보이는 조건을 연결한다.
-
다른 사람 채널일 때 기존 더보기 버튼이 유지되는지 확인한다.
-
ic_audio_content_shareasset 이름을 그대로 사용한다.
Task 1.2 공유 메시지와 공유 시트 상태 연결
Goal 실행 P1-T2: 기존 UserProfileViewModel.shareChannel과 동일한 공유 메시지·OneLink 생성·ActivityViewController 표시 흐름을 CreatorChannelView에 연결한다.
- 시작 조건:
P1-T1완료,CCSHARE-002,CCSHARE-006,CCSHARE-007확정. - 완료 증거: 공유 action이
creatorId,nickname으로 기존 OneLink 파라미터를 만들고 공유 시트를 표시한다. - 범위 밖: 공유 helper 분리와 새 공유 문구 추가.
Files:
- Modify:
SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift - Modify:
SodaLive/Sources/V2/CreatorChannel/CreatorChannelViewModel.swift - Check:
SodaLive/Sources/Explorer/Profile/UserProfileViewModel.swift - Check:
SodaLive/Sources/Common/ActivityViewController.swift - Test: 테스트 타깃 없음. 빌드와 수동 검증으로 대체.
TDD 예외 사유: 공유 시트는 iOS system UI이고 현재 테스트 타깃이 없어 자동 UI test를 작성하지 않는다.
대체 검증 방법: 구현 후 아래 명령과 수동 확인을 수행한다.
rg "af_dp|deep_link_value|deep_link_sub5|shareChannel|shareMessage|isShowShareView|ActivityViewController" SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift SodaLive/Sources/V2/CreatorChannel/CreatorChannelViewModel.swift SodaLive/Sources/Explorer/Profile/UserProfileViewModel.swift
xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build
Expected:
-
V2 크리에이터 채널 공유 로직이 기존
UserProfileViewModel.shareChannel과 같은 파라미터를 사용한다. -
ActivityViewController가shareMessage를 받아 표시된다. -
OneLink 생성 실패 시
I18n.MemberChannel.shareLinkCreateFailedpopup 흐름이 있다. -
빌드 exit code가 0이다.
-
CreatorChannelViewModel또는CreatorChannelView에 공유 메시지 상태를 추가한다. -
af_dp,deep_link_value,deep_link_sub5값을 기존 채널 공유와 동일하게 구성한다. -
성공 시
I18n.MemberChannel.shareChannelMessage(nickname)과 URL을 줄바꿈으로 합친다. -
실패 시 기존 실패 문구 popup을 표시한다.
-
CreatorChannelView에ActivityViewControllerpresentation을 연결한다.
Task 1.3 더보기 메뉴 최상단 공유 항목 추가
Goal 실행 P1-T3: 다른 사람 채널 더보기 overlay 최상단에 채널 공유 항목을 추가하고, 탭 시 공유 action을 실행한다.
- 시작 조건:
P1-T2완료,CCSHARE-003~CCSHARE-005확정. - 완료 증거: 다른 사람 채널 더보기 메뉴 순서가
채널 공유, 차단/차단 해제, 사용자 신고, 프로필 신고 순서다. - 범위 밖: 기존 차단/신고 API 동작 변경.
Files:
- Modify:
SodaLive/Sources/Report/ProfileReportMenuView.swift - Modify:
SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift - Modify:
SodaLive/Sources/I18n/I18n.swift - Test: 테스트 타깃 없음. 빌드와 수동 검증으로 대체.
TDD 예외 사유: 기존 overlay menu는 SwiftUI view이고 현재 테스트 타깃이 없어 자동 UI test를 작성하지 않는다.
대체 검증 방법: 구현 후 아래 명령과 수동 확인을 수행한다.
rg "channelShare|shareChannel|ProfileReportMenuView|userBlockAction|userReportAction|profileReportAction" SodaLive/Sources/Report/ProfileReportMenuView.swift SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift SodaLive/Sources/I18n/I18n.swift
xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build
Expected:
-
ProfileReportMenuView에 공유 항목과 공유 action이 있고 기존 차단/신고 action이 유지된다. -
채널 공유I18n 문구가 ko/en/ja에 제공된다. -
빌드 exit code가 0이다.
-
ProfileReportMenuView에 공유 action closure를 추가한다. -
공유 row를 기존 차단/신고 row보다 위에 배치한다.
-
공유 row 탭 시 overlay를 닫고 공유 action을 호출한다.
-
기존 차단/차단 해제, 사용자 신고, 프로필 신고 row와 action을 변경하지 않는다.
-
I18n에 공유 메뉴 문구를 추가한다.
Task 1.4 회귀 정리와 문서 기록
Goal 실행 P1-T4: 구현 결과가 PRD 범위를 벗어나지 않는지 확인하고 검증 기록을 누적한다.
- 시작 조건:
P1-T1~P1-T3완료. - 완료 증거: PRD 요구사항 추적표와 실제 코드 변경 범위가 일치하고, 검증 명령 결과가 Progress에 기록됨.
- 범위 밖: 발견된 범위 밖 문제의 임의 수정.
Files:
- Modify:
docs/20260914_크리에이터_채널_공유/plan-task.md - Check:
docs/20260914_크리에이터_채널_공유/prd.md - Test: 문서 대조와 빌드 결과 기록.
대체 검증 방법: 아래 명령과 수동 확인 결과를 Progress에 기록한다.
rg "CCSHARE-001|CCSHARE-002|CCSHARE-003|CCSHARE-004|CCSHARE-005|CCSHARE-006|CCSHARE-007" docs/20260914_크리에이터_채널_공유/prd.md docs/20260914_크리에이터_채널_공유/plan-task.md
xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build
Expected:
-
모든 요구사항 ID가 PRD와 계획에 남아 있다.
-
빌드 exit code가 0이다.
-
수동 검증 항목의 실제 결과가 Progress에 기록되어 있다.
-
PRD 요구사항과 구현 Task 연결을 대조한다.
-
검증 명령의 실제 결과를 Progress에 누적한다.
-
범위 밖 발견 사항이 있으면
발견된 문제표에 기록한다.
완료 조건
P1-T1,P1-T2,P1-T3,P1-T4의 체크박스와 완료 증거가 모두 충족됐다.- 기존 차단/신고 메뉴와 팔로우/알림 title bar 동작이 회귀하지 않았다.
- 문서와 구현의 차이가 없다.
검증 방법
Phase 1 Gate
Goal 실행 P1-GATE: 채널 공유 사용자 흐름과 공통 품질 기준을 최종 판정한다.
- 시작 조건: Phase 1의 모든 활성 Task goal 완료.
- 완료 증거: 아래 자동·수동 검증 통과와 Progress 기록.
- 범위 밖: Gate 통과를 위한 test 삭제·완화와 관련 없는 기능 수정.
rg "ic_audio_content_share|ActivityViewController|deep_link_value|deep_link_sub5|ProfileReportMenuView" SodaLive/Sources/V2/CreatorChannel SodaLive/Sources/Report/ProfileReportMenuView.swift
xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build
Expected: rg 결과에서 공유 버튼, 공유 시트, OneLink 파라미터, 더보기 메뉴 연결이 확인되고 빌드 exit code가 0이다.
수동 검증:
- 내 채널 진입 후 우측 상단 공유 버튼을 탭하면 iOS 공유 시트가 표시된다.
- 다른 사람 채널 진입 후 더보기 메뉴 최상단
채널 공유를 탭하면 iOS 공유 시트가 표시된다. - 공유 메시지는 기존 채널 공유 메시지와 OneLink URL을 포함한다.
- 다른 사람 채널 더보기 메뉴의 기존 차단/신고 항목이 그대로 동작한다.
- OneLink 생성 실패를 유도할 수 있는 debug 조건이 있으면 실패 popup 문구를 확인하고, 없으면 코드 대조로 실패 경로를 확인한다.
실행 순서와 의존성
| 순서 | Goal | 선행조건 | 병행 가능 | 차단 시 다음 행동 |
|---|---|---|---|---|
| 1 | P1-T1 |
PRD 확정 | 아니요 | title bar contract 재검토 |
| 2 | P1-T2 |
P1-T1 |
아니요 | 기존 UserProfileViewModel.shareChannel 대조 |
| 3 | P1-T3 |
P1-T2 |
아니요 | ProfileReportMenuView contract 재검토 |
| 4 | P1-T4 |
P1-T1~P1-T3 |
아니요 | PRD/계획 불일치 보정 |
| 5 | P1-GATE |
Phase 1 Task 전체 | 아니요 | 실패 소유 Task의 회귀 수정 goal 생성 |
P1-T1 → P1-T2 → P1-T3 → P1-T4 → P1-GATE
변경 금지 항목
- 새 API, 새 dependency, 새 딥링크 계약을 추가하지 않는다.
- 공유 문구를 기존 채널 공유와 다르게 새로 만들지 않는다.
- 기존 차단/신고 action을 삭제하거나 의미를 바꾸지 않는다.
Pods/**,generated/**,build/**를 수정하지 않는다.- test를 삭제·skip·완화하거나 타입 오류를 우회해 Gate를 통과시키지 않는다.
의사결정 및 중단 규칙
- PRD와 구현 중 발견한 기존 코드가 충돌하면 PRD Decision Log에 정정 행을 먼저 추가한다.
- 공유 URL 파라미터 변경이 필요하면 구현을 멈추고 사용자 결정을 받는다.
- title bar layout에서 버튼이 겹치면 새 디자인을 추정하지 말고 최소 대안과 영향을 보고한다.
- 범위 밖 회귀를 발견하면 임의 수정하지 않고
발견된 문제에 기록한다.
Progress
기존 기록을 삭제하거나 덮어쓰지 않고 실제 실행 결과를 차수별로 누적한다.
문서 작성 1차 실행 — 2026-09-14
- 상태: 완료
- 무엇을: 신규 PRD와 plan-task 문서를 작성했다.
- 왜: 사용자 요청에 따라 구현 전 요구사항과 실행 계획을 확정하기 위해서다.
- 어떻게:
codegraph_explore—UserProfileViewModel.shareChannel,ActivityViewController,CreatorChannelTitleBar,ProfileReportMenuView,CreatorChannelViewModel현재 구현 확인.read—docs/sample/sample-prd.md,docs/sample/sample-plan-task.md,docs/agent-guides/documentation-policy.md,docs/agent-guides/build-test-verification.md확인.
- 남은 항목: 코드 구현과 구현 검증은 사용자 후속 승인 전까지 진행하지 않는다.
- 다음 행동: 사용자가 구현을 요청하면
P1-T1부터 실행한다.
구현 및 검증 1차 실행 — 2026-09-15
- 상태: 구현 완료, 수동 검증 대기
- 무엇을: 내 채널 title bar 공유 버튼, 다른 사람 채널 더보기 최상단
채널 공유, 기존 OneLink 기반ActivityViewController공유 시트 연결을 구현했다. - 왜:
CCSHARE-001~CCSHARE-007확정 요구사항을 현재 브랜치에서 충족하기 위해서다. - 어떻게:
codegraph_explore—CreatorChannelViewModel.shareChannel,CreatorChannelTitleBar,ProfileReportMenuView,CreatorChannelView, 기존UserProfileViewModel.shareChannel대조.rg "ic_audio_content_share|ActivityViewController|deep_link_value|deep_link_sub5|ProfileReportMenuView|channelShare|shareLinkCreateFailed" "SodaLive/Sources/V2/CreatorChannel" "SodaLive/Sources/Report/ProfileReportMenuView.swift" "SodaLive/Sources/I18n/I18n.swift" "SodaLive/Sources/Explorer/Profile/UserProfileViewModel.swift"— 공유 버튼, 공유 시트, OneLink 파라미터, 실패 popup, I18n 연결 확인.git diff --check— 통과.xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build—BUILD SUCCEEDED.xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug -destination "platform=iOS Simulator,id=E9FC7721-AA96-440F-8349-2DC4B85F40F5" -derivedDataPath "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/sodalive-share-derived" CODE_SIGNING_ALLOWED=NO build— simulator build 성공.xcrun simctl install/xcrun simctl launch—kr.co.vividnext.sodalive.debug2설치 및 실행 성공, launch pid46360.- 리뷰 검증 — reviewer/oracle
VERDICT: APPROVE, blocker 없음.
- 남은 항목:
simctl uitap option과cliclick이 없어 실제 채널 진입 후 공유 시트 표시는 사용자 수동 테스트로 확인한다. - 다음 행동: 내 채널 공유 버튼, 다른 사람 채널 더보기 공유, 기존 차단/신고 항목을 실기기 또는 simulator에서 수동 확인한다.
Decision Log
| 날짜 | ID | 상태 | 결정 | 근거 | 영향 Goal/문서 |
|---|---|---|---|---|---|
| 2026-09-14 | DEC-001 |
확정 | 공유 기능 문서는 신규 docs/20260914_크리에이터_채널_공유/ 아래에 작성한다. |
사용자 선택 B | 전체 |
| 2026-09-14 | DEC-002 |
확정 | 다른 사람 채널 더보기 메뉴의 채널 공유 항목은 최상단에 배치한다. |
사용자 선택 A | P1-T3 |
| 2026-09-14 | DEC-003 |
확정 | 공유 방식은 기존 UserProfileView와 동일한 ActivityViewController와 OneLink 파라미터를 재사용한다. |
사용자 요구사항과 코드 확인 | P1-T2, P1-GATE |
발견된 문제
| ID | 심각도 | 상태 | 발견 내용 | 영향 Goal | 처리 계획 |
|---|---|---|---|---|---|
ISSUE-001 |
Low | 수동 확인 필요 | 현재 환경에서 자동 탭 도구가 없어 실제 공유 시트 표시까지 자동 검증하지 못함 | P1-GATE |
사용자 수동 테스트로 내 채널/다른 사람 채널 공유 시트 표시 확인 |
최종 보고 형식
구현 결과: Phase 1 크리에이터 채널 공유 흐름 완료
- 변경: 내 채널 title bar 공유 버튼, 다른 사람 채널 더보기 메뉴 최상단 공유 항목, 기존 OneLink 기반 공유 시트 연결
- 결정: DEC-001 신규 문서 분리, DEC-002 공유 항목 최상단 배치, DEC-003 기존 공유 방식 재사용
- 검증:
- `rg "ic_audio_content_share|ActivityViewController|deep_link_value|deep_link_sub5|ProfileReportMenuView" SodaLive/Sources/V2/CreatorChannel SodaLive/Sources/Report/ProfileReportMenuView.swift` — 공유 연결 코드 확인 결과
- `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` — 빌드 성공 또는 실패와 핵심 오류
- 수동 검증 — 내 채널 공유 버튼, 다른 사람 채널 더보기 공유, 기존 차단/신고 회귀 여부
- 남은 항목: 구현 시 발견한 외부 의존 또는 후속 범위, 없으면 없음
- 문서: `docs/20260914_크리에이터_채널_공유/prd.md`, `docs/20260914_크리에이터_채널_공유/plan-task.md`