docs(following): 팔로잉 해제 확인 계획을 추가한다
This commit is contained in:
@@ -0,0 +1,164 @@
|
||||
# 팔로잉 해제 확인과 버튼 UI PRD
|
||||
|
||||
## 문서 정보
|
||||
|
||||
| 항목 | 내용 |
|
||||
|---|---|
|
||||
| 문서 상태 | 구현 기준 확정 |
|
||||
| 작성일 | `2026-08-18` |
|
||||
| 최종 수정일 | `2026-08-18` |
|
||||
| 대상 제품 | 팔로잉 리스트, 크리에이터 채널 팔로우/팔로잉 액션 |
|
||||
| 작성자·결정권자 | 사용자 요청 기준 |
|
||||
| 관련 API Contract | 변경 없음 |
|
||||
| 관련 구현 계획 | `docs/20260818_팔로잉_해제_확인과_버튼_UI/plan-task.md` |
|
||||
| 관련 review | 없음 |
|
||||
|
||||
## 1. Overview
|
||||
|
||||
팔로잉 리스트와 크리에이터 채널에서 팔로잉 해제 동작을 더 명확하고 안전하게 만든다. 팔로잉 리스트의 팔로잉 중 버튼은 크리에이터 채널의 팔로잉 중 버튼과 같은 원형 스타일을 사용하고, 팔로잉 해제 요청은 두 화면 모두 `V2ModalDialog` 확인 후에만 진행한다.
|
||||
|
||||
## 2. Problem Statement
|
||||
|
||||
현재 사용자는 다음 문제를 겪는다.
|
||||
|
||||
- 팔로잉 리스트의 팔로잉 중 버튼 UI가 크리에이터 채널의 팔로잉 중 상태와 다르다.
|
||||
- 팔로잉 리스트에서 팔로잉 중 버튼을 누르면 `CreatorFollowNotifyFragment` Bottom Sheet 액션 메뉴가 표시된다.
|
||||
- 크리에이터 채널에서는 팔로잉 중 버튼을 누르면 확인 없이 바로 팔로우 해제가 진행된다.
|
||||
|
||||
문제를 해결했다는 판단은 팔로잉 리스트와 크리에이터 채널 모두에서 팔로잉 해제 전 `V2ModalDialog`가 표시되고, 확인 버튼을 누른 경우에만 기존 팔로우 해제 API 흐름이 실행되는 것으로 한다.
|
||||
|
||||
## 3. Goals
|
||||
|
||||
### 3.1 제품 목표
|
||||
|
||||
- 팔로잉 리스트의 팔로잉 중 버튼을 `ic_new_following_white`, `gray_800`, 크리에이터 채널과 동일한 원형 스타일로 표시한다.
|
||||
- 팔로잉 리스트의 팔로잉 중 버튼 터치 시 Bottom Sheet 액션 메뉴를 사용하지 않는다.
|
||||
- 팔로잉 리스트와 크리에이터 채널 모두 팔로우 해제 전 한 번 더 확인한다.
|
||||
- 취소 시 팔로우 상태와 알림 상태를 변경하지 않는다.
|
||||
- 확인 시 기존 팔로우 해제 프로세스를 한 번만 실행한다.
|
||||
|
||||
### 3.2 UX 목표
|
||||
|
||||
- destructive action인 팔로우 해제의 영향을 Dialog 문구로 명확히 알린다.
|
||||
- 한국어, 일본어, 영어에서 동일한 의미와 `%1$s` 크리에이터 이름 placeholder 계약을 유지한다.
|
||||
- 팔로우 시작, 알림 토글, 기존 성공/실패 Toast 처리는 이번 변경으로 바꾸지 않는다.
|
||||
|
||||
## 4. Non-Goals
|
||||
|
||||
- 코드 구현은 이 문서 작성 작업의 범위가 아니다.
|
||||
- `CreatorFollowNotifyFragment` 자체를 수정하거나 삭제하지 않는다.
|
||||
- 팔로우/언팔로우 API, Repository, ViewModel 계약을 재설계하지 않는다.
|
||||
- 신규 Dialog 컴포넌트, 신규 dependency, 공통 coordinator abstraction을 추가하지 않는다.
|
||||
- 요청 범위 밖의 레거시 리팩터링을 하지 않는다.
|
||||
- 사용자가 명시적으로 요청하지 않았으므로 `app/src/androidTest`, 기기·에뮬레이터 UI 조작, 스크린샷·시각 QA는 범위에서 제외한다.
|
||||
|
||||
## 5. Target Users and Permissions
|
||||
|
||||
| 사용자 | 목표 | 주요 작업 | 사용 환경 |
|
||||
|---|---|---|---|
|
||||
| 로그인 사용자 | 팔로잉 중인 크리에이터를 안전하게 해제 | 팔로잉 리스트 또는 크리에이터 채널에서 팔로우 해제 | Android 앱 |
|
||||
|
||||
권한과 인증 정책은 기존 팔로우/언팔로우 흐름을 그대로 따른다.
|
||||
|
||||
## 6. 핵심 사용자 흐름
|
||||
|
||||
1. 사용자가 팔로잉 리스트에서 팔로잉 중인 크리에이터의 액션 버튼을 누른다.
|
||||
2. 앱은 `CreatorFollowNotifyFragment` Bottom Sheet를 표시하지 않고 `V2ModalDialog`를 표시한다.
|
||||
3. 사용자가 `취소`를 누르면 Dialog만 닫히고 팔로우 해제 요청은 보내지 않는다.
|
||||
4. 사용자가 `해제하기`를 누르면 기존 `viewModel.follow(creatorId, follow = false, notify = false)` 흐름으로 팔로우 해제를 진행한다.
|
||||
5. 사용자가 크리에이터 채널에서 팔로잉 중 원형 캡슐을 누른다.
|
||||
6. 앱은 `V2ModalDialog`를 표시한다.
|
||||
7. 사용자가 확인하면 기존 `homeActionDelegate.follow(follow = false, notify = false)` 흐름으로 팔로우 해제를 진행한다.
|
||||
|
||||
## 7. 기능 요구사항
|
||||
|
||||
| ID | 상태 | 요구사항 | 수용 기준 | 계약/Goal 연결 |
|
||||
|---|---|---|---|---|
|
||||
| `UNFOLLOW-001` | 확정 | 팔로잉 리스트의 팔로잉 중 버튼은 `ic_new_following_white`를 사용한다. | 팔로잉 중 branch가 기존 `btn_following_big`, `btn_following_no_alarm_big` 대신 요청 아이콘을 사용한다. | `P1-T1`, `P3-T1` |
|
||||
| `UNFOLLOW-002` | 확정 | 팔로잉 리스트의 팔로잉 중 버튼은 `gray_800` 배경과 크리에이터 채널의 팔로잉 중과 동일한 원형 스타일을 사용한다. | `gray_800` 기반 원형 배경이 적용되고 unfollowed 상태는 기존 팔로우 버튼 정책을 유지한다. | `P1-T1`, `P3-T1` |
|
||||
| `UNFOLLOW-003` | 확정 | 팔로잉 리스트에서 팔로잉 중 버튼 터치 시 Bottom Sheet 액션 메뉴를 표시하지 않는다. | `CreatorFollowNotifyFragment`를 통한 팔로잉 중 액션 메뉴 route가 제거된다. | `P1-T2`, `P3-T2` |
|
||||
| `UNFOLLOW-004` | 확정 | 팔로잉 리스트에서 팔로우 해제 전 `V2ModalDialog`로 확인한다. | 취소는 side effect가 없고, 확인만 기존 unfollow 호출을 실행한다. | `P1-T2`, `P3-T2` |
|
||||
| `UNFOLLOW-005` | 확정 | 크리에이터 채널에서 팔로우 해제 전 `V2ModalDialog`로 확인한다. | 팔로잉 중 캡슐 터치만 Dialog를 표시하고, 팔로우 시작 branch는 기존대로 즉시 실행한다. | `P1-T3`, `P4-T1` |
|
||||
| `UNFOLLOW-006` | 확정 | Dialog 문구는 한국어, 일본어, 영어 string resource로 제공한다. | 모든 locale에서 title, description, cancel, confirm resource가 있고 description은 `%1$s`로 크리에이터 이름을 받는다. | `P2-T1` |
|
||||
|
||||
## 8. UI/UX Expectations
|
||||
|
||||
### 8.1 팔로잉 리스트 버튼
|
||||
|
||||
- 팔로잉 중: `ic_new_following_white`, `@color/gray_800`, 크리에이터 채널 팔로잉 중과 동일한 원형 스타일.
|
||||
- 팔로우 전: 기존 팔로우 버튼 표시와 팔로우 시작 동작 유지.
|
||||
- 알림 on/off에 따른 팔로잉 중 버튼 이미지 분기는 제거하거나 동일한 팔로잉 중 UI로 통합한다.
|
||||
|
||||
### 8.2 팔로우 해제 확인 Dialog
|
||||
|
||||
`V2ModalDialog`를 사용한다.
|
||||
|
||||
| Locale | Title | Description | Cancel | Confirm |
|
||||
|---|---|---|---|---|
|
||||
| Korean | `팔로우 해제` | `팔로우를 해제할까요?\n%1$s의 소식을 받을 수 없어요.` | `취소` | `해제하기` |
|
||||
| Japanese | `フォロー解除` | `%1$sからの最新情報を受け取れなくなります。\nフォローを解除しますか?` | `キャンセル` | `解除する` |
|
||||
| English | `Unfollow` | `You’ll no longer receive updates from %1$s.\nDo you want to unfollow?` | `Cancel` | `Unfollow` |
|
||||
|
||||
## 9. API 계약
|
||||
|
||||
API 계약 변경은 없다. 기존 팔로우/언팔로우 endpoint와 payload를 그대로 사용한다.
|
||||
|
||||
## 10. 보안과 데이터 취급
|
||||
|
||||
- 인증 토큰, API URL, 내부 오류 정보는 Dialog, Toast, 로그에 노출하지 않는다.
|
||||
- Dialog description에는 화면에 이미 표시되는 크리에이터 이름만 삽입한다.
|
||||
|
||||
## 11. 성능과 품질 요구사항
|
||||
|
||||
- 신규 dependency를 추가하지 않는다.
|
||||
- Dialog 확인 버튼 중복 터치는 기존 `V2ModalDialog`의 중복 클릭 방지 동작을 재사용한다.
|
||||
- 테스트는 `app/src/test`의 local/source test로 제한한다.
|
||||
- UI 변경 자동 테스트는 리소스 선택, route, callback 흐름만 검증하고 layout 크기·constraint·pixel은 직접 검증하지 않는다.
|
||||
|
||||
## 12. 성공 기준
|
||||
|
||||
### 12.1 기능 수용 기준
|
||||
|
||||
- [ ] 팔로잉 리스트 팔로잉 중 버튼이 요청 아이콘, 색상, 원형 스타일을 사용한다. (`UNFOLLOW-001`, `UNFOLLOW-002`)
|
||||
- [ ] 팔로잉 리스트 팔로잉 중 버튼이 `CreatorFollowNotifyFragment`를 표시하지 않는다. (`UNFOLLOW-003`)
|
||||
- [ ] 팔로잉 리스트 팔로우 해제는 `V2ModalDialog` 확인 후에만 실행된다. (`UNFOLLOW-004`)
|
||||
- [ ] 크리에이터 채널 팔로우 해제는 `V2ModalDialog` 확인 후에만 실행된다. (`UNFOLLOW-005`)
|
||||
- [ ] 한국어, 일본어, 영어 문구가 확정 문구와 일치한다. (`UNFOLLOW-006`)
|
||||
|
||||
### 12.2 추적성 완료 기준
|
||||
|
||||
- [ ] 모든 확정 요구사항이 `plan-task.md`의 Task와 연결된다.
|
||||
- [ ] 구현 전 계획 문서가 먼저 준비된다.
|
||||
- [ ] 코드 구현은 별도 사용자 승인 후 `plan-task.md`에 따라 진행한다.
|
||||
|
||||
## 13. Open Questions
|
||||
|
||||
| ID | 상태 | 결정 필요 사항 | 현재 권고 | 결정 주체 | 영향 Goal |
|
||||
|---|---|---|---|---|---|
|
||||
| 없음 | 확정 | 없음 | 없음 | 사용자 | 없음 |
|
||||
|
||||
## 14. 요구사항 추적표
|
||||
|
||||
| 요구사항 범위 | API Contract | 계획 Phase | Goal | 자동 검증 | 수동 검증 |
|
||||
|---|---|---:|---|---|---|
|
||||
| `UNFOLLOW-001~002` | 변경 없음 | 1, 3 | `P1-T1`, `P3-T1` | `FollowingCreatorAdapterSourceTest` 또는 동등 source/local test | 범위 제외 |
|
||||
| `UNFOLLOW-003~004` | 변경 없음 | 1, 3 | `P1-T2`, `P3-T2` | `FollowingCreatorActivitySourceTest` 또는 동등 source/local test | 범위 제외 |
|
||||
| `UNFOLLOW-005` | 변경 없음 | 1, 4 | `P1-T3`, `P4-T1` | `CreatorChannelActivitySourceTest` | 범위 제외 |
|
||||
| `UNFOLLOW-006` | 변경 없음 | 2 | `P2-T1` | string resource source/local test 또는 관련 source test | 범위 제외 |
|
||||
|
||||
## 15. Decision Log
|
||||
|
||||
| 날짜 | ID | 상태 | 결정 | 근거 | 영향 요구사항·계약·Goal |
|
||||
|---|---|---|---|---|---|
|
||||
| `2026-08-18` | `DEC-001` | 확정 | 한국어 Dialog description은 `팔로우를 해제할까요?\n%1$s의 소식을 받을 수 없어요.`로 사용한다. | 사용자 인터뷰에서 A안 확정 | `UNFOLLOW-006`, `P2-T1` |
|
||||
| `2026-08-18` | `DEC-002` | 확정 | 시각 보조 브라우저는 사용하지 않고 텍스트 기반 문서만 작성한다. | 사용자 응답 | 문서 작성 방식 |
|
||||
| `2026-08-18` | `DEC-003` | 확정 | 이번 작업은 PRD와 구현 계획 문서 생성만 수행하고 코드 구현은 하지 않는다. | 사용자 명시 요청 | 전체 범위 |
|
||||
|
||||
## 16. 변경 관리
|
||||
|
||||
요구사항 변경 시 다음을 확인한다.
|
||||
|
||||
- [ ] Decision Log에 변경 이유와 날짜를 기록했다.
|
||||
- [ ] 관련 요구사항 상태·본문·수용 기준을 갱신했다.
|
||||
- [ ] `plan-task.md`의 범위·Files·체크박스·완료 증거를 코드 변경 전에 갱신했다.
|
||||
- [ ] 기존 Progress·검증 기록을 삭제하거나 덮어쓰지 않았다.
|
||||
Reference in New Issue
Block a user