355 lines
23 KiB
Markdown
355 lines
23 KiB
Markdown
# 팔로잉 해제 확인 팝업 Goal 실행형 구현 계획
|
||
|
||
| 문서 항목 | 내용 |
|
||
|---|---|
|
||
| 상태 | 완료 |
|
||
| 작성일 | `2026-08-18` |
|
||
| 요구사항 기준 | `docs/20260818_팔로잉_해제_확인_팝업/prd.md` |
|
||
| API 기준 | 해당 없음: 기존 팔로우 API 사용 |
|
||
| 현재 Phase | 완료 |
|
||
| 현재 활성 Goal | 없음 |
|
||
|
||
## 목표
|
||
|
||
팔로잉 리스트와 크리에이터 채널에서 팔로우 해제 전에 동일한 확인 Dialog를 거치게 하고, 팔로잉 리스트의 팔로잉 중 버튼을 크리에이터 채널과 같은 원형 스타일로 맞춘다.
|
||
|
||
## 현재 상태
|
||
|
||
| Phase | 상태 | 완료 Task | 활성/다음 Goal | 차단 또는 남은 조건 |
|
||
|---:|---|---:|---|---|
|
||
| 1 | 완료 | `2/2` | 없음 | 없음 |
|
||
| 2 | 완료 | `1/1` | 없음 | 없음 |
|
||
|
||
- 동시에 하나의 미완료 goal만 운용한다.
|
||
- 완료된 Task와 검증 기록은 되돌리거나 삭제하지 않는다. 후속 수정은 회귀 수정 Task와 새 goal ID를 추가한다.
|
||
- 사용자가 명시적으로 요청하지 않으면 goal에 token budget을 설정하지 않는다.
|
||
|
||
## 범위
|
||
|
||
### 포함
|
||
|
||
- 팔로잉 리스트의 팔로잉 중 버튼 시각 변경.
|
||
- 팔로잉 리스트의 팔로잉 중 버튼 터치 시 Bottom Sheet 대신 팔로우 해제 확인 Dialog 표시.
|
||
- 크리에이터 채널의 팔로잉 중 버튼 터치 시 즉시 해제 대신 팔로우 해제 확인 Dialog 표시.
|
||
- 한국어, 일본어, 영어 Dialog 문구 추가.
|
||
- 취소/확인 흐름의 상태 변경, API 호출 여부, 오류 표시 유지 검증.
|
||
|
||
### 제외
|
||
|
||
- 서버 API, DTO, 인증 header, token 처리 변경.
|
||
- 팔로우 시작 동작 변경.
|
||
- 알림 설정 Bottom Sheet component 삭제.
|
||
- 팔로잉 리스트 외 다른 `FollowCreatorItemView` 재사용 화면의 UX 변경. 재사용 영향이 확인되면 PRD와 계획을 먼저 갱신한다.
|
||
- Visual QA는 에이전트가 진행하지 않고 사용자가 직접 수행한다.
|
||
|
||
## 기술적 제약
|
||
|
||
- 기술 스택: Swift, SwiftUI, Combine, Moya, 기존 `I18n.pick` 다국어 구조.
|
||
- 아키텍처: View는 표시 상태와 사용자 액션 연결, ViewModel은 기존 팔로우 API 호출과 상태 갱신을 담당한다.
|
||
- UI 토큰: 버튼 배경은 `Color.gray800`, 버튼 이미지는 `ic_new_following_white`를 사용한다.
|
||
- Dialog: PRD의 “V2 Dialog”는 `SodaV2ActionModal`을 의미한다. 팔로우 해제 확인 Dialog는 `SodaLive/Sources/V2/Component/Modal/SodaV2ActionModal.swift`를 사용한다.
|
||
- 계약: 제공되지 않은 endpoint, DTO, enum, 오류 status/key를 만들지 않는다.
|
||
- 검증: 저장소에 테스트 번들 타깃이 확인되지 않으므로 focused unit test가 불가능하면 `TDD 예외 사유`와 수동 검증을 Progress에 기록한다.
|
||
- 빌드: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build`를 기준으로 한다.
|
||
|
||
## Task TDD 작성 규칙
|
||
|
||
구현 Task는 가능한 경우 아래 순서를 따른다. 이번 작업은 테스트 타깃 부재로 각 Task에 `TDD 예외 사유`와 `대체 검증 방법`을 남기고 빌드 및 사용자 수동 QA로 대체했다.
|
||
|
||
- **RED:** 가장 작은 실패 test를 작성한다.
|
||
- **RED 확인:** focused test를 실행해 요구 동작이 없어서 발생한 의도한 assertion 실패를 확인한다.
|
||
- **GREEN:** RED를 통과시키는 최소 구현을 작성한다.
|
||
- **GREEN 확인:** 같은 focused test를 다시 실행해 성공을 확인한다.
|
||
- **REFACTOR:** 이번 Task가 만든 중복만 정리하고 focused test·직접 영향 회귀·빌드를 다시 실행해 실제 결과를 Progress에 기록한다.
|
||
|
||
## Phase 1 팔로잉 리스트
|
||
|
||
**Phase 결과:** 팔로잉 리스트에서 팔로잉 중 버튼이 새 원형 스타일로 보이고, 터치 시 Bottom Sheet 없이 확인 Dialog를 거쳐 팔로우 해제를 진행한다.
|
||
|
||
**선행조건:** PRD `UNFOLLOW-LIST-001~005`, `UNFOLLOW-DIALOG-001~004` 확인.
|
||
|
||
**Phase 완료 조건:** `P1-T1`, `P1-T2`, `P1-GATE` 완료, 검증 기록 누적.
|
||
|
||
### 구현 항목
|
||
|
||
#### Task 1.1 팔로잉 리스트 팔로잉 중 버튼 스타일 변경
|
||
|
||
**Goal 실행 `P1-T1`:** 팔로잉 리스트 row의 팔로잉 중 버튼을 `ic_new_following_white`와 `Color.gray800` 원형 버튼으로 표시한다.
|
||
|
||
- **시작 조건:** PRD `UNFOLLOW-LIST-001~003` 확정.
|
||
- **완료 증거:** 대상 파일 변경, 빌드 성공, 팔로잉 리스트에서 시각 확인 기록.
|
||
- **범위 밖:** 팔로우 시작 버튼, 알림 설정 Bottom Sheet, 다른 화면의 버튼 동작 변경.
|
||
- **TDD 예외 사유:** 현재 저장소에서 앱 테스트 번들 타깃이 확인되지 않아 SwiftUI row 단위 자동 test를 바로 추가하기 어렵다.
|
||
- **대체 검증 방법:** preview 또는 시뮬레이터에서 팔로잉 중/미팔로우 상태 row를 확인하고, 빌드 결과와 스크린샷 또는 수동 확인 기록을 Progress에 남긴다.
|
||
|
||
**Files:**
|
||
|
||
- Modify: `SodaLive/Sources/Follow/FollowCreatorItemView.swift`
|
||
- Check: `SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelTitleBar.swift`
|
||
- Check: `SodaLive/Sources/UI/Theme/Color.swift`
|
||
- Check: asset catalog에서 `ic_new_following_white` 존재 여부
|
||
|
||
**Interfaces:**
|
||
|
||
- Consumes: `GetCreatorFollowingAllListItem.isFollow`, `GetCreatorFollowingAllListItem.isNotify`
|
||
- Produces: 팔로잉 중 상태에서 `ic_new_following_white` 원형 버튼 UI
|
||
|
||
- [x] `FollowCreatorItemView`에서 `creator.isFollow == true`일 때 기존 `FollowButtonImageAsset(type: .following/.followingNoAlarm)` 렌더링을 사용하지 않도록 변경한다.
|
||
- [x] 팔로잉 중 버튼은 `Image("ic_new_following_white")`, `.resizable()`, `.frame(width: 20, height: 20)`, `.frame(width: 36, height: 36)`, `.background(Color.gray800)`, `.clipShape(Circle())` 기준으로 구현한다.
|
||
- [x] `creator.isFollow == false`일 때 기존 팔로우 버튼 렌더링과 `onClickFollow` 동작을 유지한다.
|
||
- [x] row 전체 `onTapGesture`와 버튼 tap gesture가 충돌하지 않는지 확인한다.
|
||
- [x] `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build`를 실행한다.
|
||
- [x] 수동 확인: 팔로잉 리스트에서 팔로잉 중 row의 버튼이 원형 gray800 배경과 흰색 following 아이콘으로 보인다.
|
||
- [x] 수동 확인: 미팔로우 row가 존재하는 테스트 데이터에서는 기존 팔로우 버튼이 유지된다.
|
||
|
||
#### Task 1.2 팔로잉 리스트 팔로우 해제 확인 Dialog 적용
|
||
|
||
**Goal 실행 `P1-T2`:** 팔로잉 리스트에서 팔로잉 중 버튼을 누르면 Bottom Sheet 없이 팔로우 해제 확인 Dialog를 표시하고, 확인 시에만 해제를 실행한다.
|
||
|
||
- **시작 조건:** `P1-T1` 완료, PRD `OQ-001`, `OQ-002` 해결 결정 확인.
|
||
- **완료 증거:** Bottom Sheet 미표시, Dialog 취소/확인 흐름 확인, 빌드 성공, Progress 기록.
|
||
- **범위 밖:** `CreatorFollowNotifyDialog` 삭제, 알림 설정 UX 개편, 팔로잉 리스트 외 재사용 화면 동작 변경.
|
||
- **TDD 예외 사유:** 현재 저장소에서 테스트 번들 타깃이 확인되지 않아 View interaction 자동 test를 바로 추가하기 어렵다.
|
||
- **대체 검증 방법:** 시뮬레이터에서 버튼 tap, Dialog 취소, Dialog 확인, API 성공/실패 상태를 직접 확인하고 결과를 Progress에 남긴다.
|
||
|
||
**Files:**
|
||
|
||
- Modify: `SodaLive/Sources/Follow/FollowCreatorView.swift`
|
||
- Modify: `SodaLive/Sources/Follow/FollowCreatorItemView.swift`
|
||
- Modify: `SodaLive/Sources/I18n/I18n.swift`
|
||
- Check: `SodaLive/Sources/V2/Component/Modal/SodaV2ActionModal.swift`
|
||
- Check: `SodaLive/Sources/Follow/FollowCreatorViewModel.swift`
|
||
|
||
**Interfaces:**
|
||
|
||
- Consumes: `FollowCreatorItemView`의 팔로잉 중 버튼 tap callback, `FollowCreatorViewModel.creatorFollow(creatorId:index:follow:notify:)`
|
||
- Produces: 선택된 `creatorId`, `selectedItemIndex`, `creatorName` 기반 팔로우 해제 확인 Dialog 상태
|
||
|
||
- [x] `I18n`에 팔로우 해제 Dialog title, message, cancel, confirm 문구를 추가한다.
|
||
- [x] 한국어 본문은 `팔로우를 해제할까요?\n{{creatorName}}의 소식을 받을 수 없어요.`를 사용한다.
|
||
- [x] 일본어 본문은 `{{creatorName}}からの最新情報を受け取れなくなります。\nフォローを解除しますか?`를 사용한다.
|
||
- [x] 영어 본문은 `You won't receive updates from {{creatorName}}.\nUnfollow this creator?`를 사용한다.
|
||
- [x] `FollowCreatorView`에 팔로우 해제 확인 Dialog 표시 상태와 선택된 크리에이터 이름을 추가한다.
|
||
- [x] 팔로우 해제 확인 Dialog는 `SodaV2ActionModal(title:message:button1:button2:onDimmedTap:)`로 표시한다.
|
||
- [x] `FollowCreatorItemView`의 팔로잉 중 tap callback은 Bottom Sheet 표시가 아니라 팔로우 해제 확인 Dialog 표시로 연결한다.
|
||
- [x] Dialog 취소 액션은 Dialog 상태만 닫고 `creatorId`, `selectedItemIndex`, `creatorName`을 초기화한다.
|
||
- [x] Dialog 확인 액션은 Dialog를 닫은 뒤 `viewModel.creatorFollow(creatorId:index:follow:false,notify:false)`를 호출하고 선택 상태를 초기화한다.
|
||
- [x] 기존 `CreatorFollowNotifyDialog`는 팔로잉 리스트의 팔로우 해제 진입점에서 표시되지 않게 한다.
|
||
- [x] `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build`를 실행한다.
|
||
- [x] 수동 확인: 팔로잉 리스트에서 팔로잉 중 버튼 tap 시 Bottom Sheet가 표시되지 않는다.
|
||
- [x] 수동 확인: Dialog 취소 시 API 호출 없이 팔로잉 상태가 유지된다.
|
||
- [x] 수동 확인: Dialog 확인 시 팔로우 해제가 진행되고 row 상태가 갱신된다.
|
||
- [x] 수동 확인: ko/en/ja 언어에서 title, body, 취소, 확인 문구가 PRD와 일치한다.
|
||
|
||
### 완료 조건
|
||
|
||
- [x] `P1-T1`, `P1-T2`의 체크박스와 완료 증거가 모두 충족됐다.
|
||
- [x] 팔로잉 리스트의 확정 요구사항 `UNFOLLOW-LIST-001~005`가 구현 또는 명시적 결정으로 추적된다.
|
||
- [x] 알려진 문서와 구현의 차이가 없다.
|
||
|
||
### 검증 방법
|
||
|
||
#### Phase 1 Gate
|
||
|
||
**Goal 실행 `P1-GATE`:** 팔로잉 리스트 버튼 스타일과 팔로우 해제 확인 흐름을 최종 판정한다.
|
||
|
||
- **시작 조건:** `P1-T1`, `P1-T2` 완료.
|
||
- **완료 증거:** 빌드와 수동 검증 통과, Progress 기록.
|
||
- **범위 밖:** Gate 통과를 위한 test 삭제·완화와 관련 없는 화면 수정.
|
||
|
||
```bash
|
||
xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build
|
||
```
|
||
|
||
**Expected:** exit code 0, 팔로잉 리스트에서 새 원형 버튼 표시, Bottom Sheet 미표시, Dialog 취소/확인 흐름 성공.
|
||
|
||
수동 검증:
|
||
|
||
- [x] 팔로잉 리스트 팔로잉 중 버튼이 `ic_new_following_white`와 `Color.gray800` 원형 스타일로 보인다.
|
||
- [x] 팔로잉 리스트 팔로잉 중 버튼 tap 시 확인 Dialog가 표시된다.
|
||
- [x] 취소 시 상태 변경과 API 호출 없이 Dialog만 닫힌다.
|
||
- [x] 확인 시 기존 팔로우 해제 프로세스가 실행된다.
|
||
- [x] 한국어, 일본어, 영어 Dialog 문구가 PRD와 일치한다.
|
||
|
||
## Phase 2 크리에이터 채널
|
||
|
||
**Phase 결과:** 크리에이터 채널에서 팔로잉 중 버튼을 눌러도 즉시 해제되지 않고 확인 Dialog를 거쳐 해제된다.
|
||
|
||
**선행조건:** `P1-GATE` 완료. `P1-T2`에서 추가한 Dialog 문구와 component 재사용 가능.
|
||
|
||
**Phase 완료 조건:** `P2-T1`, `P2-GATE` 완료, 검증 기록 누적.
|
||
|
||
### 구현 항목
|
||
|
||
#### Task 2.1 크리에이터 채널 팔로우 해제 확인 Dialog 적용
|
||
|
||
**Goal 실행 `P2-T1`:** 크리에이터 채널의 팔로잉 중 버튼 tap을 확인 Dialog 표시로 바꾸고, 확인 시에만 기존 해제 프로세스를 실행한다.
|
||
|
||
- **시작 조건:** `P1-GATE` 완료, PRD `UNFOLLOW-CHANNEL-001~003` 확정.
|
||
- **완료 증거:** 즉시 해제 제거, Dialog 취소/확인 흐름 확인, 빌드 성공, Progress 기록.
|
||
- **범위 밖:** 크리에이터 채널 follow 버튼 시각 변경, 알림 버튼 동작 변경, 더보기/report 메뉴 변경.
|
||
- **TDD 예외 사유:** 현재 저장소에서 테스트 번들 타깃이 확인되지 않아 SwiftUI interaction 자동 test를 바로 추가하기 어렵다.
|
||
- **대체 검증 방법:** 시뮬레이터에서 크리에이터 채널 팔로잉 중 버튼 tap, Dialog 취소, Dialog 확인, API 성공/실패 상태를 직접 확인한다.
|
||
|
||
**Files:**
|
||
|
||
- Modify: `SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift`
|
||
- Check: `SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelTitleBar.swift`
|
||
- Check: `SodaLive/Sources/V2/CreatorChannel/CreatorChannelViewModel.swift`
|
||
- Check: `SodaLive/Sources/I18n/I18n.swift`
|
||
- Check: `SodaLive/Sources/V2/Component/Modal/SodaV2ActionModal.swift`
|
||
|
||
**Interfaces:**
|
||
|
||
- Consumes: `CreatorChannelTitleBar.onTapUnfollow`, `CreatorChannelViewModel.creatorFollow(follow:notify:)`, `CreatorChannelHomeResponse.creator.nickname`
|
||
- Produces: 크리에이터 채널 overlay 팔로우 해제 확인 Dialog 상태
|
||
|
||
- [x] `CreatorChannelView`에 팔로우 해제 확인 Dialog 표시 상태를 추가한다.
|
||
- [x] `CreatorChannelTitleBar`의 `onTapUnfollow` 연결을 `viewModel.creatorFollow(follow:false, notify:false)` 직접 호출에서 Dialog 표시로 바꾼다.
|
||
- [x] 팔로우 해제 확인 Dialog는 `SodaV2ActionModal(title:message:button1:button2:onDimmedTap:)`로 표시한다.
|
||
- [x] Dialog 본문에는 `viewModel.response?.creator.nickname`을 사용한다.
|
||
- [x] Dialog 취소 액션은 Dialog 상태만 닫고 `viewModel.creatorFollow`를 호출하지 않는다.
|
||
- [x] Dialog 확인 액션은 Dialog를 닫은 뒤 `viewModel.creatorFollow(follow: false, notify: false)`를 호출한다.
|
||
- [x] 기존 follow, notify, unnotify, more 액션은 변경하지 않는다.
|
||
- [x] `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build`를 실행한다.
|
||
- [x] 수동 확인: 크리에이터 채널에서 팔로잉 중 버튼 tap 시 즉시 해제되지 않고 Dialog가 표시된다.
|
||
- [x] 수동 확인: 취소 시 `isFollow`와 `isNotify`가 유지된다.
|
||
- [x] 수동 확인: 확인 시 `isFollow=false`, `isNotify=false`로 갱신된다.
|
||
- [x] 수동 확인: 긴 크리에이터 이름에서도 Dialog 본문이 잘리지 않는다.
|
||
|
||
### 완료 조건
|
||
|
||
- [x] `P2-T1`의 체크박스와 완료 증거가 모두 충족됐다.
|
||
- [x] 크리에이터 채널 확정 요구사항 `UNFOLLOW-CHANNEL-001~003`이 구현 또는 명시적 결정으로 추적된다.
|
||
- [x] Phase 1의 Dialog 문구와 Phase 2의 Dialog 문구가 동일한 I18n 기준을 사용한다.
|
||
|
||
### 검증 방법
|
||
|
||
#### Phase 2 Gate
|
||
|
||
**Goal 실행 `P2-GATE`:** 크리에이터 채널 팔로우 해제 확인 흐름과 전체 회귀를 최종 판정한다.
|
||
|
||
- **시작 조건:** `P2-T1` 완료.
|
||
- **완료 증거:** 빌드와 수동 검증 통과, Progress 기록.
|
||
- **범위 밖:** 실패와 무관한 다음 기능 구현.
|
||
|
||
```bash
|
||
xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build
|
||
```
|
||
|
||
**Expected:** exit code 0, 크리에이터 채널에서 Dialog 취소/확인 흐름 성공, 팔로잉 리스트 Phase 1 흐름 회귀 없음.
|
||
|
||
수동 검증:
|
||
|
||
- [x] 크리에이터 채널 팔로잉 중 버튼 tap 시 확인 Dialog가 표시된다.
|
||
- [x] 취소 시 상태 변경과 API 호출 없이 Dialog만 닫힌다.
|
||
- [x] 확인 시 기존 팔로우 해제 프로세스가 실행된다.
|
||
- [x] 팔로잉 리스트의 Phase 1 흐름이 여전히 통과한다.
|
||
|
||
## 실행 순서와 의존성
|
||
|
||
| 순서 | Goal | 선행조건 | 병행 가능 | 차단 시 다음 행동 |
|
||
|---:|---|---|---|---|
|
||
| 1 | `P1-T1` | 없음 | 아니요 | asset 또는 Color token 확인 |
|
||
| 2 | `P1-T2` | `P1-T1` | 아니요 | `SodaV2ActionModal` 사용과 한국어 확정 문구 기준으로 구현 |
|
||
| 3 | `P1-GATE` | Phase 1 Task 전체 | 아니요 | 실패 소유 Task의 회귀 수정 goal 생성 |
|
||
| 4 | `P2-T1` | `P1-GATE` | 아니요 | Dialog 공통화 또는 상태 연결 결정 기록 |
|
||
| 5 | `P2-GATE` | `P2-T1` | 아니요 | 실패 소유 Task의 회귀 수정 goal 생성 |
|
||
|
||
```text
|
||
P1-T1 -> P1-T2 -> P1-GATE -> P2-T1 -> P2-GATE
|
||
```
|
||
|
||
## 변경 금지 항목
|
||
|
||
- 확정된 PRD 요구사항을 근거 없이 변경하지 않는다.
|
||
- 기존 완료 체크박스와 Progress·Decision Log·검증 기록을 삭제하거나 덮어쓰지 않는다.
|
||
- 제공되지 않은 endpoint, DTO, enum, 오류 값을 만들지 않는다.
|
||
- 요청 범위 밖의 리팩터링, dependency 추가와 공통 abstraction을 확장하지 않는다.
|
||
- test를 삭제·skip·완화하거나 타입 오류를 우회해 Gate를 통과시키지 않는다.
|
||
- JWT, password, token, signed URL 같은 민감정보를 log·fixture·문서에 기록하지 않는다.
|
||
|
||
## 의사결정 및 중단 규칙
|
||
|
||
- PRD와 구현 계획이 충돌하면 PRD를 우선하고, Decision Log에 근거를 남긴 뒤 계획을 갱신한다.
|
||
- 구현 범위가 바뀌면 `prd.md`를 먼저 보강하고 `plan-task.md` 체크리스트를 업데이트한 뒤 코드를 수정한다.
|
||
- 한국어 Dialog 문구는 PRD `DEC-004`의 확정 문구를 사용한다.
|
||
- 팔로우 해제 확인 Dialog는 PRD `DEC-005`에 따라 `SodaV2ActionModal`을 사용한다.
|
||
- 체크박스 일부, 빌드 일부 또는 수동 검증 일부만 끝난 상태에서는 goal을 완료로 갱신하지 않는다.
|
||
|
||
## Progress
|
||
|
||
기존 기록을 삭제하거나 덮어쓰지 않고 실제 실행 결과를 차수별로 누적한다.
|
||
|
||
### 문서 작성 1차 실행 — 2026-08-18
|
||
|
||
- 상태: 완료
|
||
- 무엇을: PRD와 구현 계획 초안을 작성했다. 코드 구현은 하지 않았다.
|
||
- 왜: 사용자 요청이 코드 구현 금지와 문서 생성으로 제한됐다.
|
||
- 어떻게:
|
||
- `docs/sample/sample-prd.md` 확인 — PRD 구조 기준 확인.
|
||
- `docs/sample/sample-plan-task.md` 확인 — Phase, Task, Goal, 완료 증거 구조 확인.
|
||
- `docs/agent-guides/documentation-policy.md` 확인 — 신규 문서 경로 규칙 확인.
|
||
- 관련 Swift 파일 구조 확인 — `FollowCreatorView`, `FollowCreatorItemView`, `FollowCreatorViewModel`, `CreatorChannelView`, `CreatorChannelTitleBar`, `CreatorChannelViewModel`, `SodaDialog`, `I18n`, `Color`.
|
||
- 남은 항목: 후속 구현 전 `OQ-001`, `OQ-002`를 제품/구현자가 확인해야 한다.
|
||
- 다음 행동: 사용자가 문서를 검토한 뒤 구현 진행 여부를 별도 지시한다.
|
||
|
||
### 문서 보완 2차 실행 — 2026-08-18
|
||
|
||
- 상태: 완료
|
||
- 무엇을: `OQ-001`, `OQ-002`의 사용자 결정을 PRD와 구현 계획에 반영했다. 코드 구현은 하지 않았다.
|
||
- 왜: 사용자가 한국어 문구 마침표 제거와 `SodaV2ActionModal` 사용을 확정했다.
|
||
- 어떻게:
|
||
- `SodaLive/Sources/V2/Component/Modal/SodaV2ActionModal.swift` 확인 — V2 Dialog 대상 component 경로 확인.
|
||
- PRD Dialog 본문 표, Open Questions, Decision Log 갱신.
|
||
- `plan-task.md`의 시작 조건, Files, 실행 체크박스, Decision Log, 발견된 문제 갱신.
|
||
- 남은 항목: 없음. 후속 구현 전 추가 제품 결정이 생기면 PRD를 먼저 갱신한다.
|
||
- 다음 행동: 사용자가 별도 지시하면 이 문서 기준으로 구현한다.
|
||
|
||
### 구현 및 빌드 검증 3차 실행 — 2026-08-18
|
||
|
||
- 상태: 구현 완료 / 사용자 수동 QA 대기
|
||
- 무엇을: 팔로잉 리스트와 크리에이터 채널의 팔로우 해제 동작을 `SodaV2ActionModal` 확인 흐름으로 변경하고, 팔로잉 리스트의 팔로잉 중 버튼을 원형 `ic_new_following_white` + `Color.gray800` 스타일로 변경했다.
|
||
- 왜: 사용자 지시에 따라 `plan-task.md` 기준 구현을 진행했다.
|
||
- 어떻게:
|
||
- `FollowCreatorItemView`에 팔로잉 리스트 전용 `onTapUnfollow` callback과 원형 버튼 렌더링을 추가했다.
|
||
- `FollowCreatorView`에 선택된 크리에이터 정보와 팔로우 해제 확인 Dialog 상태를 추가하고, 확인 시 기존 `creatorFollow(... follow: false, notify: false)` 흐름을 호출하게 했다.
|
||
- `CreatorChannelView`의 `onTapUnfollow` 즉시 해제를 Dialog 표시로 바꾸고, 확인 시에만 기존 해제 흐름을 호출하게 했다.
|
||
- `I18n.MemberChannel`에 ko/en/ja title, message, cancel, confirm 문구를 추가했다.
|
||
- 검증 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug -destination "platform=iOS Simulator,name=iPhone 16 Pro,OS=18.3.1" build` — `** BUILD SUCCEEDED **`.
|
||
- 남은 항목: Visual QA와 실제 앱 화면 수동 확인은 사용자 진행. 관련 수동 확인 체크박스와 Phase/Gate 완료 체크박스는 미완료로 유지한다.
|
||
- 다음 행동: 사용자가 팔로잉 리스트와 크리에이터 채널에서 Dialog 표시, 취소, 확인, 다국어/긴 이름 표시를 수동 확인한다.
|
||
|
||
### 사용자 수동 QA 4차 실행 — 2026-08-18
|
||
|
||
- 상태: 완료
|
||
- 무엇을: 사용자가 팔로잉 리스트와 크리에이터 채널의 수동 테스트를 완료했다.
|
||
- 왜: 사용자 직접 보고에 따라 남아 있던 수동 확인 체크박스와 Phase/Gate 완료 조건을 완료로 갱신했다.
|
||
- 어떻게:
|
||
- PRD `14.1 기능 수용 기준`, `14.2 UI/UX 수용 기준` 체크박스를 완료 처리했다.
|
||
- `P1-T1`, `P1-T2`, `P1-GATE`, `P2-T1`, `P2-GATE`의 수동 확인 및 완료 조건 체크박스를 완료 처리했다.
|
||
- 남은 항목: 없음.
|
||
- 다음 행동: 필요 시 커밋 또는 PR 절차를 별도 지시한다.
|
||
|
||
## Decision Log
|
||
|
||
| 날짜 | ID | 상태 | 결정 | 근거 | 영향 Goal/문서 |
|
||
|---|---|---|---|---|---|
|
||
| `2026-08-18` | `DEC-001` | 확정 | 이번 작업은 문서 작성만 수행하고 코드 구현은 하지 않는다. | 사용자 직접 지시 | 전체 |
|
||
| `2026-08-18` | `DEC-002` | 확정 | 팔로잉 리스트와 크리에이터 채널의 팔로우 해제는 확인 Dialog를 거친다. | 사용자 요구사항 | `P1-T2`, `P2-T1` |
|
||
| `2026-08-18` | `DEC-003` | 폐기 | 한국어 본문 문장부호는 원문대로 문서화하고 구현 전 제품 확인 대상으로 둔다. | `OQ-001`이 사용자 결정으로 해결됨 | `P1-T2`, `P2-T1` |
|
||
| `2026-08-18` | `DEC-004` | 확정 | 한국어 Dialog 본문은 `팔로우를 해제할까요?\n{{creatorName}}의 소식을 받을 수 없어요.`로 사용한다. | 사용자 결정 | `P1-T2`, `P2-T1` |
|
||
| `2026-08-18` | `DEC-005` | 확정 | 팔로우 해제 확인 Dialog는 `SodaV2ActionModal`을 사용한다. | 사용자 결정 | `P1-T2`, `P2-T1` |
|
||
| `2026-08-18` | `DEC-006` | 확정 | Visual QA는 에이전트가 진행하지 않고 사용자가 직접 진행한다. | 사용자 직접 지시 | `P1-GATE`, `P2-GATE` |
|
||
|
||
## 발견된 문제
|
||
|
||
| ID | 심각도 | 상태 | 발견 내용 | 영향 Goal | 처리 계획 |
|
||
|---|---|---|---|---|---|
|
||
| `ISSUE-001` | Medium | 후보 | `FollowCreatorItemView`는 팔로잉 리스트 외 알림 수신 설정 화면에서도 재사용된다. 팔로잉 리스트만 바꾸려면 callback 책임을 분리해야 할 수 있다. | `P1-T1`, `P1-T2` | 구현 전 재사용 화면 영향 확인 후 PRD Non-Goals를 유지할지 갱신한다. |
|
||
| `ISSUE-002` | Low | 해결 | 한국어 Dialog 본문 `{{creatorName}}의. 소식을 받을 수 없어요.`에 문장부호 오탈자 가능성이 있다. | `P1-T2`, `P2-T1` | `DEC-004`에 따라 마침표를 제거한 문구로 확정했다. |
|
||
|
||
## 최종 보고 규칙
|
||
|
||
후속 구현자는 최종 보고에 완료한 Phase, 변경 파일과 동작, Decision Log ID, 실제 실행한 검증 명령과 결과, 수동 검증 결과, 남은 Open Question, 갱신한 문서 경로를 적는다. 성공을 추정하지 말고 최신 검증 결과와 완료되지 않은 범위를 함께 전달한다.
|