docs(gift): 선물 표시 요구사항을 갱신한다

This commit is contained in:
Yu Sung
2026-10-08 14:13:55 +09:00
parent 24d2508700
commit 051ce614b4
+24 -4
View File
@@ -85,7 +85,7 @@
```text ```text
크리에이터 상세 크리에이터 상세
선물 보내기 버튼 선물 보내기 버튼
-> GiftSendView(recipientMemberId, recipientCreatorNickname) -> GiftSendView(recipientMemberId, recipientCreatorNickname, recipientCreatorProfileImageUrl)
-> success replace GiftDetailView(applicationNo) -> success replace GiftDetailView(applicationNo)
마이 탭 마이 탭
@@ -102,6 +102,7 @@ GiftDetailView(applicationNo)
-> inline recipient address form when recipientAddressRequired=true -> inline recipient address form when recipientAddressRequired=true
DeepLink GIFT_DETAIL(applicationNo) DeepLink GIFT_DETAIL(applicationNo)
DeepLink gift-detail/applicationNo
-> GiftDetailView(applicationNo) -> GiftDetailView(applicationNo)
``` ```
@@ -116,6 +117,7 @@ DeepLink GIFT_DETAIL(applicationNo)
| `GIFT-001` | 확정 | 크리에이터 상세에 `선물 보내기` 버튼을 표시한다. | 내 채널이 아니고 `creator.isDmAvailable == true`, 한국 접속, `LanguageHeaderProvider.current == "ko"`일 때만 표시된다. | `P1-T3` | | `GIFT-001` | 확정 | 크리에이터 상세에 `선물 보내기` 버튼을 표시한다. | 내 채널이 아니고 `creator.isDmAvailable == true`, 한국 접속, `LanguageHeaderProvider.current == "ko"`일 때만 표시된다. | `P1-T3` |
| `GIFT-002` | 확정 | 마이 탭 카테고리 그리드 첫 항목에 `선물함`을 표시한다. | `ic_my_present` 아이콘과 `선물함` 텍스트가 보관함 앞에 표시된다. | `P1-T4` | | `GIFT-002` | 확정 | 마이 탭 카테고리 그리드 첫 항목에 `선물함`을 표시한다. | `ic_my_present` 아이콘과 `선물함` 텍스트가 보관함 앞에 표시된다. | `P1-T4` |
| `GIFT-003` | 확정 | 기존 inert action을 실제 선물 화면 이동으로 교체한다. | `선물 보내기`는 신청 화면, `선물함`은 리스트 화면으로 이동한다. | `P2-T3` | | `GIFT-003` | 확정 | 기존 inert action을 실제 선물 화면 이동으로 교체한다. | `선물 보내기`는 신청 화면, `선물함`은 리스트 화면으로 이동한다. | `P2-T3` |
| `GIFT-004` | 확정 | 크리에이터 채널의 `선물 보내기` 버튼을 흰색 capsule로 표시한다. | `ic_send_gift`가 문구 왼쪽에 표시되고 배경은 흰색, 문구는 검은색이며 기존 노출 조건과 이동 동작은 유지된다. | `P11-T3` |
### 8.2 선물 보내기 신청 ### 8.2 선물 보내기 신청
@@ -128,6 +130,7 @@ DeepLink GIFT_DETAIL(applicationNo)
| `SEND-005` | 확정 | 필수 입력/동의가 충족될 때만 CTA를 활성화한다. | 미충족 상태에서는 `POST /api/v2/gifts`를 호출하지 않는다. submit 중 중복 탭이 방지된다. | `P3-T3` | | `SEND-005` | 확정 | 필수 입력/동의가 충족될 때만 CTA를 활성화한다. | 미충족 상태에서는 `POST /api/v2/gifts`를 호출하지 않는다. submit 중 중복 탭이 방지된다. | `P3-T3` |
| `SEND-006` | 확정 | 신청 성공 후 상세 화면으로 이동한다. | 응답의 `applicationNo`로 `GiftDetailView`를 replace 방식으로 열고 뒤로가기로 입력 폼에 돌아가지 않는다. | `P3-T4` | | `SEND-006` | 확정 | 신청 성공 후 상세 화면으로 이동한다. | 응답의 `applicationNo`로 `GiftDetailView`를 replace 방식으로 열고 뒤로가기로 입력 폼에 돌아가지 않는다. | `P3-T4` |
| `SEND-007` | 확정 | 보내는 사람 이름과 휴대폰 번호를 제한한다. | 이름은 한글·영문 1~12자이며 한글 조합 중 임시 문자열을 확정값으로 덮어쓰지 않는다. 휴대폰은 편집 중 ASCII 숫자 최대 11자, 제출 시 `010`으로 시작하는 정확히 11자리만 허용한다. | `P10-T1`~`P10-T4` | | `SEND-007` | 확정 | 보내는 사람 이름과 휴대폰 번호를 제한한다. | 이름은 한글·영문 1~12자이며 한글 조합 중 임시 문자열을 확정값으로 덮어쓰지 않는다. 휴대폰은 편집 중 ASCII 숫자 최대 11자, 제출 시 `010`으로 시작하는 정확히 11자리만 허용한다. | `P10-T1`~`P10-T4` |
| `SEND-008` | 확정 | 크리에이터 채널에서 받은 프로필 이미지 URL을 선물 보내기 화면까지 전달한다. | 받는 크리에이터 영역에 전달받은 프로필 이미지가 표시되며 기존 닉네임과 `recipientMemberId` 전달은 유지된다. | `P11-T2` |
### 8.3 선물함 리스트 ### 8.3 선물함 리스트
@@ -183,6 +186,8 @@ DeepLink GIFT_DETAIL(applicationNo)
| `COMMON-003` | 확정 | 푸시 딥링크는 `deepLinkValue=GIFT_DETAIL`, `deepLinkId=applicationNo`를 사용한다. | 딥링크 진입 시 상세 API를 먼저 호출하고 응답으로 UI를 결정한다. | `P8-T1` | | `COMMON-003` | 확정 | 푸시 딥링크는 `deepLinkValue=GIFT_DETAIL`, `deepLinkId=applicationNo`를 사용한다. | 딥링크 진입 시 상세 API를 먼저 호출하고 응답으로 UI를 결정한다. | `P8-T1` |
| `COMMON-004` | 확정 | API 실패는 기존 오류 노출 방식을 사용한다. | 입력값과 스크롤 상태를 불필요하게 초기화하지 않는다. | 각 Phase Gate | | `COMMON-004` | 확정 | API 실패는 기존 오류 노출 방식을 사용한다. | 입력값과 스크롤 상태를 불필요하게 초기화하지 않는다. | 각 Phase Gate |
| `COMMON-005` | 확정 | 선물 상세의 전달 불가 `선물 정책 확인`은 약관 `(필수)` 링크와 같은 페이지로 이동한다. | 발신·수신 상세 모두 `GiftConstants.termsURL`을 시스템 브라우저로 연다. | `P2-R3`, `P5-T4`, `P7-T4` | | `COMMON-005` | 확정 | 선물 상세의 전달 불가 `선물 정책 확인`은 약관 `(필수)` 링크와 같은 페이지로 이동한다. | 발신·수신 상세 모두 `GiftConstants.termsURL`을 시스템 브라우저로 연다. | `P2-R3`, `P5-T4`, `P7-T4` |
| `COMMON-006` | 확정 | `voiceon://gift-detail/{applicationNo}`와 `voiceon-test://gift-detail/{applicationNo}` 경로형 딥링크를 지원한다. | `gift-detail` 뒤 첫 path component를 신청번호로 사용해 기존 `GiftDetailView(applicationNo)`로 이동하며 scheme별 별도 분기는 추가하지 않는다. | `P11-T1` |
| `COMMON-007` | 확정 | 파손 면책 동의 `(필수)`는 별도 파손 정책 페이지로 이동한다. | `requiresDamageWaiver=true`인 동의 행의 `(필수)`만 `https://app.notion.com/p/3f227b3596738018ba5dea2e5205293b`를 열고 기존 sender/recipient 약관 링크는 유지한다. | `P11-T2` |
## 9. 반응형 기능 범위 ## 9. 반응형 기능 범위
@@ -288,12 +293,15 @@ DeepLink GIFT_DETAIL(applicationNo)
### 14.1 기능 수용 기준 ### 14.1 기능 수용 기준
- [ ] 선물 보내기 진입 시 전달받은 닉네임과 `memberId`가 화면/API에 연결된다. - [ ] 선물 보내기 진입 시 전달받은 닉네임과 `memberId`가 화면/API에 연결된다.
- [ ] 선물 보내기 진입 시 전달받은 크리에이터 프로필 이미지 URL이 받는 크리에이터 영역에 표시된다.
- [ ] 필수 입력/동의 누락 시 신청 API를 호출하지 않는다. - [ ] 필수 입력/동의 누락 시 신청 API를 호출하지 않는다.
- [ ] `requiresDamageWaiver=true` 카테고리에서만 파손 면책 동의가 표시되고 필수다. - [ ] `requiresDamageWaiver=true` 카테고리에서만 파손 면책 동의가 표시되고 필수다.
- [ ] 신청 성공 후 `applicationNo` 상세로 replace 이동하고 뒤로가기로 입력 폼에 돌아가지 않는다. - [ ] 신청 성공 후 `applicationNo` 상세로 replace 이동하고 뒤로가기로 입력 폼에 돌아가지 않는다.
- [ ] 선물함 리스트는 `type=ALL` 한 번 조회와 `direction` 카드 분기를 사용한다. - [ ] 선물함 리스트는 `type=ALL` 한 번 조회와 `direction` 카드 분기를 사용한다.
- [ ] Figma의 `신청 내역`, `선물 내역` 섹션 타이틀이 노출되지 않는다. - [ ] Figma의 `신청 내역`, `선물 내역` 섹션 타이틀이 노출되지 않는다.
- [ ] 리스트 item, 푸시 딥링크, 신청 완료 이동이 같은 상세 조회 플로우를 사용한다. - [ ] 리스트 item, 푸시 딥링크, 신청 완료 이동이 같은 상세 조회 플로우를 사용한다.
- [ ] 양 앱 scheme의 `gift-detail/{applicationNo}` 경로형 딥링크가 같은 상세 조회 플로우를 사용한다.
- [ ] 파손 면책 `(필수)`는 파손 정책 페이지를 열고 기존 약관 `(필수)` 링크는 기존 페이지를 유지한다.
- [ ] 상세 progress는 `statusTimeline` 5단계를 사용한다. - [ ] 상세 progress는 `statusTimeline` 5단계를 사용한다.
- [ ] 운송장 등록과 배송지 입력 성공 후 상세를 재조회해 최신 상태를 표시한다. - [ ] 운송장 등록과 배송지 입력 성공 후 상세를 재조회해 최신 상태를 표시한다.
- [ ] 신청 취소는 확인 dialog 이후에만 API를 호출하고 성공 시 취소 완료 UI로 replace 된다. - [ ] 신청 취소는 확인 dialog 이후에만 API를 호출하고 성공 시 취소 완료 UI로 replace 된다.
@@ -319,13 +327,13 @@ DeepLink GIFT_DETAIL(applicationNo)
| 요구사항 범위 | API Contract | 계획 Phase | 자동 검증 | 수동 검증 | | 요구사항 범위 | API Contract | 계획 Phase | 자동 검증 | 수동 검증 |
|---|---|---:|---|---| |---|---|---:|---|---|
| `GIFT-001~003` | 해당 없음 | 1, 2 | Debug build | 진입점 표시/이동 | | `GIFT-001~004` | 해당 없음 | 1, 2, 11 | Debug build/source check | 진입점 표시/이동·버튼 UI |
| `SEND-001~007` | §11.2 | 2, 3, 10 | ViewModel validation/build | 선물 신청 journey | | `SEND-001~008` | §11.2 | 2, 3, 10, 11 | ViewModel validation/build/source check | 선물 신청 journey·프로필 이미지 |
| `LIST-001~005` | §11.2 | 2, 4 | pagination/build | 선물함 상태별 화면 | | `LIST-001~005` | §11.2 | 2, 4 | pagination/build | 선물함 상태별 화면 |
| `DETAIL-001~006` | §11.2 | 2, 5 | status mapping/build | 보낸 상세/취소 | | `DETAIL-001~006` | §11.2 | 2, 5 | status mapping/build | 보낸 상세/취소 |
| `TRACK-001~007` | §11.2 | 2, 6, 10 | validation/build | 운송장 등록·신청 취소 | | `TRACK-001~007` | §11.2 | 2, 6, 10 | validation/build | 운송장 등록·신청 취소 |
| `RECV-001~007` | §11.2 | 2, 7, 10 | privacy/validation/build | 받은 상세/배송지 | | `RECV-001~007` | §11.2 | 2, 7, 10 | privacy/validation/build | 받은 상세/배송지 |
| `COMMON-001~004` | §11.2 | 2, 8 | deeplink parsing/build | 푸시/딥링크 | | `COMMON-001~007` | §11.2 | 2, 8, 11 | deeplink parsing/link source/build | 푸시/딥링크·약관 링크 |
## 17. Decision Log ## 17. Decision Log
@@ -340,6 +348,10 @@ DeepLink GIFT_DETAIL(applicationNo)
| 2026-10-06 | `DEC-007` | 확정 | 선물함에서 받은 선물의 배송지 미입력 상태는 별도 파란 배너가 아니라 각 item 카드에서 표시한다. | 사용자 정정 요청 | `LIST-004`, `P4-T3` | | 2026-10-06 | `DEC-007` | 확정 | 선물함에서 받은 선물의 배송지 미입력 상태는 별도 파란 배너가 아니라 각 item 카드에서 표시한다. | 사용자 정정 요청 | `LIST-004`, `P4-T3` |
| 2026-10-06 | `DEC-008` | 확정 | 운송장 등록 화면의 `신청 취소`는 입력 중단이 아니라 선물 신청 취소이며, 확인 이후 기존 취소 API를 호출한다. | 사용자 선택 | `TRACK-006`, `P6-T2`, `P6-T3` | | 2026-10-06 | `DEC-008` | 확정 | 운송장 등록 화면의 `신청 취소`는 입력 중단이 아니라 선물 신청 취소이며, 확인 이후 기존 취소 API를 호출한다. | 사용자 선택 | `TRACK-006`, `P6-T2`, `P6-T3` |
| 2026-10-08 | `DEC-009` | 확정 | 휴대폰 제출은 `010`으로 시작하는 ASCII 숫자 11자리만 허용하고, 운송장 번호는 ASCII 숫자 10~14자리만 제출한다. | 사용자 선택과 현행 국내 이동전화 번호체계 조사 | `SEND-007`, `TRACK-007`, `RECV-007`, Phase 10 | | 2026-10-08 | `DEC-009` | 확정 | 휴대폰 제출은 `010`으로 시작하는 ASCII 숫자 11자리만 허용하고, 운송장 번호는 ASCII 숫자 10~14자리만 제출한다. | 사용자 선택과 현행 국내 이동전화 번호체계 조사 | `SEND-007`, `TRACK-007`, `RECV-007`, Phase 10 |
| 2026-10-08 | `DEC-010` | 정정 | `DEC-003`의 아이콘 없는 버튼 결정을 정정해 `ic_send_gift`, 흰색 배경, 검은색 문구를 적용한다. | 사용자 요청 및 설계 승인 | `GIFT-004`, `P11-T3` |
| 2026-10-08 | `DEC-011` | 확정 | 경로형 선물 상세 딥링크는 `gift-detail/{applicationNo}`를 사용하고 `voiceon`, `voiceon-test`는 기존 scheme 지원만 재사용한다. | 사용자 제공 딥링크 예시 및 설계 승인 | `COMMON-006`, `P11-T1` |
| 2026-10-08 | `DEC-012` | 확정 | 파손 면책 `(필수)`에만 별도 파손 정책 URL을 사용하고 기존 약관 링크는 유지한다. | 사용자 제공 URL 및 설계 승인 | `COMMON-007`, `P11-T2` |
| 2026-10-08 | `DEC-013` | 확정 | Gift 모듈의 브랜드 문구는 이미 모두 `소다라이브`이므로 추가 문자열 변경 없이 충족 처리한다. | 코드 검색 결과와 사용자 선택 A | Phase 11 |
## 18. 변경 관리 ## 18. 변경 관리
@@ -360,6 +372,14 @@ DeepLink GIFT_DETAIL(applicationNo)
- 운송장 번호는 편집 중 ASCII 숫자 최대 14자를 허용하고 제출 시 10~14자리만 허용한다. 외부 택배 조회와 실재 운송장 검증은 제외한다. - 운송장 번호는 편집 중 ASCII 숫자 최대 14자를 허용하고 제출 시 10~14자리만 허용한다. 외부 택배 조회와 실재 운송장 검증은 제외한다.
- 기존 request, repository, API, 택배사 선택, mutation/navigation lifecycle과 선물 사이즈 선택은 변경하지 않는다. - 기존 request, repository, API, 택배사 선택, mutation/navigation lifecycle과 선물 사이즈 선택은 변경하지 않는다.
### Phase 11 선물 딥링크·정책 링크·크리에이터 표시 보정 (2026-10-08 확정)
- 기존 딥링크 parser에 `gift-detail/{applicationNo}` path route만 추가하고 query형 `GIFT_DETAIL`과 scheme 판정은 유지한다.
- 크리에이터 채널의 기존 `creator.profileImageUrl`을 선물 보내기 route와 화면에 전달하며 별도 크리에이터 조회 API는 추가하지 않는다.
- 공용 약관 행은 호출부가 링크 URL을 지정할 수 있게 최소 확장하고 파손 면책 행에만 새 정책 URL을 전달한다.
- 선물 보내기 버튼은 기존 노출 조건과 action을 유지하면서 사용자 제공 `ic_send_gift` asset, 흰색 배경, 검은색 문구를 적용한다.
- Gift 모듈의 브랜드 문구는 이미 `소다라이브`로 확인되어 변경하지 않는다.
- 요구사항 변경 시 Decision Log에 정정 행을 추가한다. - 요구사항 변경 시 Decision Log에 정정 행을 추가한다.
- 구현 범위가 바뀌면 이 PRD를 먼저 갱신하고 `plan-task.md`의 Phase/Task를 갱신한 뒤 코드를 수정한다. - 구현 범위가 바뀌면 이 PRD를 먼저 갱신하고 `plan-task.md`의 Phase/Task를 갱신한 뒤 코드를 수정한다.
- 기존 완료된 Phase 1 기록은 삭제하지 않는다. - 기존 완료된 Phase 1 기록은 삭제하지 않는다.