docs(gift): Phase 16 푸시와 가격 스냅샷 검증 결과를 기록한다

This commit is contained in:
2026-10-26 10:26:24 +09:00
parent cd865da6e0
commit 52e5c97423
2 changed files with 99 additions and 7 deletions
@@ -4,9 +4,9 @@
| 항목 | 내용 |
|---|---|
| 문서 상태 | Phase 15 서버 구현·전체 테스트·실소켓 QA·리뷰 완료, 운영 반영 전 |
| 문서 상태 | Phase 16 누락 푸시 보완·가격 스냅샷 검증 완료, 운영 반영 전 |
| 작성일 | 2026-09-29 |
| 최종 수정일 | 2026-10-23 |
| 최종 수정일 | 2026-10-26 |
| 대상 제품 | 크리에이터 선물하기 |
| 작성자·결정권자 | 사용자 |
| 관련 API Contract | 별도 문서 없음. 이 문서의 `8. API 계약`을 기준으로 사용 |
@@ -17,6 +17,8 @@
> Phase 15 서버 구현과 검증을 완료했다. 최종 2,396개 테스트·lint·build와 실제 JWT HTTP 삭제 전후 QA 및 리뷰를 통과했다. `gift-schema.sql` 하단의 nullable ALTER는 기록만 했으며 운영 DB 실행·배포·커밋·푸시는 하지 않았다.
> Phase 16은 수령확인·배송지 만료의 발신자 알림 두 곳과 기존 신청 가격 보존 검증을 완료했다. 최신 전체 2,400개 테스트·lint·build 및 독립 리뷰를 통과했다. 실제 FCM/기기 수신과 운영 배포는 미검증이며, 후속 커밋 승인에 따른 관련 216개 테스트 재검증 결과는 `plan-task.md`에 기록했다.
## 1. Overview
팬이 내부 재화인 캔을 사용해 크리에이터에게 실물 선물을 보낼 수 있는 API를 제공한다.
@@ -964,6 +966,14 @@ Response `data`는 기존 `AdminGiftOperationStatusResponse`를 사용한다.
크리에이터가 직접 수령확인 API를 호출해 `DELIVERED`가 된 경우에는 크리에이터 대상 `배송 완료` 푸시를 보내지 않는다.
### 9.3 Phase 16 호출 누락 보완
- 수취인 직접 수령확인 성공 시 기존 `sendDeliveredToSender(applicationNo, senderMemberId)`를 호출한다. 수취인에게는 추가 발송하지 않으며 실패·반복 요청으로 중복 발행하지 않는다.
- 배송지 입력 기한 초과로 실제 `UNDELIVERABLE` 전환한 선물만 기존 `sendUndeliverableToSender(applicationNo, senderMemberId)`를 호출한다. 비대상·기한 동일·주소 입력 완료·재실행은 추가 발행하지 않는다.
- 기존 GiftPushService의 제목·본문·수신자 지정·`GIFT_DETAIL`/신청번호 딥링크와 transaction 이벤트 경계를 재사용한다. 새 문구·수신자·알림 종류·스케줄·테이블은 추가하지 않는다.
- 가격·카테고리 검증은 실제 신청→관리자 가격 변경→재신청→카테고리 비활성화 흐름으로 수행한다. 이전 신청의 `salePriceCan`, `categoryNameSnapshot`, 결제 연결/금액은 유지하고, 새 신청에는 최신 가격을 적용하며 비활성화 이후 신규 신청은 거부한다.
- 이번 검증은 서버 이벤트 발행·DB/HTTP 계약까지이며 운영 FCM 및 실제 기기 수신 성공을 의미하지 않는다.
## 10. 데이터 모델 요구사항
### 10.1 Gift
@@ -1102,8 +1112,8 @@ Response `data`는 기존 `AdminGiftOperationStatusResponse`를 사용한다.
- [ ] 크리에이터는 배송지와 수령 약관 2개를 등록할 수 있다.
- [ ] 운영자는 상태별 전용 API로 상태를 전이하고, 잘못된 상태 전이는 실패한다.
- [ ] 팬은 `DELIVERED` 이후 리뷰를 1회 작성할 수 있다.
- [ ] 관리자 카테고리 논리삭제와 사이즈별 가격 변경이 새 신청에만 반영된다.
- [ ] 팬/크리에이터 푸시가 지정된 문구, 수신자, 딥링크로 발송된다.
- [x] 관리자 카테고리 논리삭제와 사이즈별 가격 변경이 새 신청에만 반영된다. 실제 신청A80→가격120→신청B120→비활성화 후 기존 DB/HTTP/결제 보존과 신규 신청 거부를 검증했다. (`P16-T2`)
- [x] 팬/크리에이터 푸시가 지정된 문구, 수신자, 딥링크로 발행된다. 누락된 두 호출과 발신자1회·수취인추가0회·거부/반복추가0, 기존 payload 계약을 서버 경계에서 검증했다. 실제 FCM·기기 수신은 별도다. (`P16-T1`)
- [ ] 선물 사용자/관리자 API의 날짜/시간 응답을 클라이언트가 UTC ISO 문자열로 해석할 수 있다.
- [ ] 카테고리 추가 필드와 새 신청번호 정책이 관리자 API, 사용자 폼 옵션, 선물 신청에 반영된다.
- [x] 관리자 취소는 `RECEIVED`에서만 전액 환불과 함께 성공하고, 목록/상세의 `CANCEL` 액션은 상태에 맞게 제공된다.
@@ -1162,7 +1172,10 @@ Phase 15 서버 구현 완료 판정에는 `P15-T2`~`P15-T4` focused test와 격
| 2026-10-23 | `DEC-019` | 확정 | 네 sender DB column 변경은 30줄 미만이므로 신규 SQL 파일 대신 기존 `gift-schema.sql` 말미에 작성한다. 기존 CREATE block은 두고 추가 ALTER로 fresh install 최종 schema도 nullable로 만든다. 실제 운영 SQL 실행은 별도 승인 rollout gate이며 아직 실행하지 않았다 | 사용자의 latest SQL placement decision; 기존 파일에 추가된 5줄 ALTER | `GIFT-019`, `P15-T1`, `P15-T2`, `P15-GATE` |
| 2026-10-23 | `DEC-020` | 확정 | sender 다섯 Kotlin property 중 `senderAddressDetail` 포함 다섯 모두 nullable, DB상 현재 NOT NULL인 sender 열 네 개만 변경한다 | entity 필드와 DDL nullable 경계의 구별 | `GIFT-019`, `P15-T2` |
| 2026-10-23 | `DEC-021` | 확정 | 신규 시간별 scheduler wrapper는 기존 만료/안내 업무 메서드에 위임하며, 기존 예약은 자동취소 `:00`뿐이다. 신규 등록은 `:10`, `:20`, `:40`이다 | 현재 scheduler 코드와 승인 일정 | `GIFT-021`, `P15-T3`~`P15-T4` |
| 2026-10-26 | `DEC-022` | 확정 | 기존 PRD의 수령확인·배송지 만료 발신자 알림 호출 누락 두 곳을 보완하고 관리자 가격 변경/카테고리 비활성화 후 기존 신청 스냅샷 보존 통합 테스트를 추가한다 | 사용자 후속 작업 승인 | `GIFT-008`, `GIFT-011`, `GIFT-013`, `P16-T1`~`P16-GATE` |
## 문서 상태 안내
Phase 14의 당시 전체 테스트 제외 및 검증 이력은 `plan-task.md`의 P14-GATE 기록을 보존한다. Phase 15는 후속 실행 승인에 따라 서버 구현과 최종 전체 테스트 2,396개·lint·build·실소켓 QA·리뷰를 완료했다. 운영 MySQL DDL 실행 및 배포는 별도 승인/조건이며 이번 완료 범위에 포함하지 않는다.
Phase 16은 2026-10-26 후속 승인 범위의 서버 구현·검증을 완료했다. 최종 전체 테스트 2,400개·lint·build 통과 및 실제 localhost HTTP/DB 시나리오와 독립 리뷰 승인을 확인했다. Phase15의 과거 기록과 달리 이번 두 성공 기준은 새 검증 근거로 완료 표시했으며, 나머지 과거 성공 기준은 일괄 체크하지 않았다.