docs(channel-donation): 익명 표시 응답 계약과 검증 결과를 기록한다
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
|
||||
| 항목 | 내용 |
|
||||
|---|---|
|
||||
| 문서 상태 | 구현 및 기능 범위 Gate 완료, 전체 테스트 suite 검증은 timeout으로 미완료 |
|
||||
| 문서 상태 | 응답 isSecret UI 표시 의미 변경 및 관련 기능 검증 완료 (`P2-GATE`) |
|
||||
| 작성일 | 2026-11-04 |
|
||||
| 최종 수정일 | 2026-11-04 |
|
||||
| 대상 제품 | 크리에이터 채널 비밀 후원 익명 조회 |
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
## 1. Overview
|
||||
|
||||
크리에이터 채널 홈과 후원 탭에서 비밀 후원 행은 그대로 보이되, 크리에이터와 후원자 본인 외의 조회자에게 후원자의 식별 정보와 메시지를 숨긴다. 조회 응답은 비밀 여부를 모든 사용자에게 표시해 클라이언트가 비밀 후원을 식별할 수 있게 한다. 마스킹 대상 비밀 후원 이미지 URL은 기존 `default-profile`과 같은 방식으로 `cloud.aws.cloud-front.host`에 `/profile/anonymous-profile.png`를 붙여 구성한다. 구현 및 범위 한정 검증을 마쳤고, 전체 테스트 suite는 실행 제한 시간 내 완료하지 못했다.
|
||||
크리에이터 채널 홈과 후원 탭에서 비밀 후원 행은 그대로 보이되, 크리에이터와 후원자 본인 외의 조회자에게 후원자의 식별 정보와 메시지를 숨긴다. 응답 `isSecret`은 현재 조회자에게 익명 UI로 표시해야 하는지를 나타낸다. 마스킹 대상 비밀 후원 이미지 URL은 기존 `default-profile`과 같은 방식으로 `cloud.aws.cloud-front.host`에 `/profile/anonymous-profile.png`를 붙여 구성한다. 최초 구현 검증 이력은 보존하고, 후속 의미 변경은 `P2-T1`에서 별도로 검증한다.
|
||||
|
||||
## 2. Problem Statement
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
- 홈의 `channelDonations`와 후원 탭 `donations`에 현재 KST 월의 비밀 후원을 포함한다.
|
||||
- 비밀 후원에 한해 크리에이터 본인 또는 해당 후원자 본인에게 원래 닉네임, 메시지, 프로필 이미지를 보여 준다. 공개 후원은 기존처럼 모든 인증 조회자에게 원본을 보여 준다.
|
||||
- 비밀 후원의 나머지 조회자에게 확정된 익명 표시 문구와 `"$cloudFrontHost/profile/anonymous-profile.png"` 이미지를 보여 준다. 공개 후원과 크리에이터·후원자 본인의 프로필 이미지 및 기존 default-profile fallback은 변경하지 않는다.
|
||||
- 두 응답의 모든 후원 항목에 저장된 비밀 여부를 나타내는 `isSecret`을 제공한다.
|
||||
- 두 응답의 `isSecret`은 현재 조회자에게 익명 후원 UI로 표시해야 하는지를 나타낸다. DB의 실제 비밀 여부는 변경하지 않는다.
|
||||
|
||||
### 3.2 UX 목표
|
||||
|
||||
@@ -54,14 +54,14 @@
|
||||
|
||||
- 기존 인증 및 크리에이터 조회 권한을 그대로 적용한다.
|
||||
- 기존 차단 확인과 크리에이터 역할 검증을 변경하지 않는다.
|
||||
- 비밀 후원 목록 행에서 새 `memberId` 또는 donation 식별자를 응답에 노출하지 않는다.
|
||||
- 이번 후속 변경은 새 `memberId`나 식별 필드를 추가하지 않으며, 현재 구현의 채널 주인 전용 `donationId` 반환 정책을 유지한다.
|
||||
|
||||
## 6. 핵심 사용자 흐름
|
||||
|
||||
1. 인증 사용자가 크리에이터 채널 홈 또는 후원 탭을 조회한다.
|
||||
2. 서버는 기존 권한·차단·크리에이터 검증을 수행하고 현재 KST 월 후원 목록을 가져온다.
|
||||
3. 비밀 후원은 크리에이터와 해당 후원자만 원본 필드를 받고, 그 외 조회자는 익명화된 값을 받는다. 공개 후원은 기존대로 인증 조회자에게 원본 필드를 제공한다.
|
||||
4. 모든 항목은 `isSecret`으로 원래 비밀 상태를 확인할 수 있고 기존 정렬·건수·pagination을 따른다.
|
||||
4. 클라이언트는 응답 `isSecret` 하나로 익명 후원 UI를 선택한다. 기존 정렬·건수·pagination은 유지한다.
|
||||
|
||||
## 7. 기능 요구사항
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
| `SDA-002` | 확정 | 후원 탭 `donations`와 `donationCount`에 현재 KST 월의 공개·비밀 후원을 포함한다. | count가 공개/비밀 전체와 일치하고 기존 페이지 경계를 유지 | §8.1~§8.2, `P1-T2` |
|
||||
| `SDA-003` | 확정 | 비밀 후원은 본인 또는 크리에이터에게 원본 필드를 반환하고, 공개 후원은 기존처럼 모든 인증 조회자에게 원본을 반환한다. | 비밀의 경우 `viewerId == creatorId` 또는 `viewerId == donor.memberId`; 공개 행은 인증 viewer 모두 nickname/message/profile 원본 | §8.3, `P1-T1`, `P1-T2` |
|
||||
| `SDA-004` | 확정 | 비밀 후원의 나머지 조회자에게 해당 행 필드만 익명화한다. | 닉네임 `익명`, 메시지 `크리에이터에게만 보여요`, 프로필 URL은 `"$cloudFrontHost/profile/anonymous-profile.png"` | §8.3, `P1-T1`, `P1-T2`, `EXT-001` |
|
||||
| `SDA-005` | 확정 | 각 후원 항목에 저장된 비밀 여부를 `isSecret`으로 반환한다. | 두 목록, 모든 조회자, 공개·비밀 각각 Boolean이 persisted 값을 반영 | §8.1~§8.2, `P1-T1`, `P1-T2` |
|
||||
| `SDA-005` | 정정 확정 | 응답 `isSecret`은 현재 조회자에게 익명 처리된 항목일 때만 true다. | 공개·본인 후원·내 채널 후원은 false, 다른 채널의 타인 비밀 후원은 true. DB 원본은 보존 | §8.1~§8.2, `P2-T1` |
|
||||
| `SDA-006` | 확정 | 익명 닉네임과 메시지 문구를 요청 언어에 맞춰 반환한다. | `Lang.KO/EN/JA`와 기존 `SodaMessageSource` 사용, 두 key 모두 언어별 값, KO 문구 정확 일치 | §8.3, `P1-T1`, `P1-T2` |
|
||||
| `SDA-007` | 완료 | 익명 프로필 이미지 파일명은 `anonymous-profile.png`; URL은 `"$cloudFrontHost/profile/anonymous-profile.png"`로 구성한다. | 설정된 CDN에서 HTTP 200, `image/png`, 19,331 bytes를 확인했다. | `EXT-001`, `P1-GATE` |
|
||||
|
||||
@@ -84,12 +84,20 @@
|
||||
- 기존 인증, block 검사, creator 검증과 응답 envelope를 유지한다.
|
||||
- 현재 KST 월 시작은 inclusive, 다음 KST 월 시작은 exclusive이며 저장·비교 시간 변환 규칙은 기존 구현을 유지한다.
|
||||
- 최신순은 `createdAt DESC, donation.id DESC`다.
|
||||
- 비밀 여부는 마스킹 여부와 별개의 persisted 상태다. `isSecret`은 숨김 처리한 행에서도 `true`다.
|
||||
- 응답 `isSecret = 저장된 isSecret && viewerId != creatorId && viewerId != donorId`다. 공개 후원·본인이 한 비밀 후원·내 채널의 비밀 후원은 false, 다른 채널에서 타인이 한 비밀 후원만 true다.
|
||||
- 응답값은 실제 비밀 설정을 설명하지 않고 익명 UI 표시 여부만 나타낸다. DB와 repository record의 `isSecret`은 저장값 그대로 유지한다. `isMyDonation` 등 추가 필드는 만들지 않는다.
|
||||
- `can`과 `createdAtUtc`는 실제 값 그대로 반환한다.
|
||||
- 새 donor `memberId`나 donation ID는 목록 DTO에 추가하지 않는다.
|
||||
- 새 donor `memberId`나 추가 식별 필드를 만들지 않는다. 후속 기능으로 도입된 채널 주인 전용 `donationId` 노출 및 후원 숨김 정책은 이번 변경에서 그대로 유지한다.
|
||||
|
||||
### 8.2 Endpoint 계약
|
||||
|
||||
| 조회 대상 | 응답 `isSecret` | 표시 정보 |
|
||||
|---|---|---|
|
||||
| 공개 후원 | false | 원본 |
|
||||
| 내가 한 비밀 후원 | false | 원본 |
|
||||
| 내 채널의 비밀 후원 | false | 원본 |
|
||||
| 다른 채널에서 타인이 한 비밀 후원 | true | 익명 처리 |
|
||||
|
||||
| Method 및 경로 | 응답 필드 | 목록 및 page 규칙 |
|
||||
|---|---|---|
|
||||
| `GET /api/v2/creator-channels/{creatorId}/home` | `data.channelDonations[]`에 `nickname`, `profileImageUrl`, `can`, `message`, `createdAtUtc`, `isSecret` | 현재 월 전체 대상 중 최신 최대 8건 |
|
||||
@@ -136,7 +144,8 @@ EN/JA 문구는 사용자가 명시 승인한 문구가 아니며 작성자의
|
||||
- [x] 홈 `channelDonations`는 전체 현재 월 공개·비밀 후보 중 최신 8건을 유지하며 새 home count 필드를 추가하지 않는다 (`SDA-001`).
|
||||
- [x] 후원 탭 공개/비밀 모두 건수·페이지·hasNext에 포함된다 (`SDA-002`).
|
||||
- [x] 비밀 후원은 크리에이터와 해당 후원자 본인만 원본을 보고 다른 사용자는 익명 문구와 이미지 자산을 본다. 공개 후원은 모두 원본을 본다 (`SDA-003`, `SDA-004`).
|
||||
- [x] `isSecret`은 모든 응답 항목에 Boolean으로 직렬화되고 원래 상태를 나타낸다 (`SDA-005`).
|
||||
- [x] 최초 구현에서 저장된 비밀 상태를 Boolean으로 직렬화했다 (과거 기준, `DEC-008`로 의미 변경).
|
||||
- [x] 현재 조회자에게 익명 처리된 항목만 응답 `isSecret=true`이며 원본 반환 항목은 false다. 조회 후에도 DB의 비밀 설정은 동일하다 (`SDA-005`, `P2-T1`).
|
||||
- [x] `can`, `createdAtUtc`, 기존 인증·차단·크리에이터 오류 및 랭킹 동작이 유지된다.
|
||||
- [x] URL 계약과 설정된 CDN 접근을 검증했다. HTTP 200, `image/png`, 19,331 bytes (`SDA-007`).
|
||||
- [x] HTTP MockMvc E2E로 홈과 후원 탭의 익명/본인/크리에이터 응답을 검증했다. 별도 live application server 요청은 수행하지 않았다.
|
||||
@@ -150,6 +159,7 @@ EN/JA 문구는 사용자가 명시 승인한 문구가 아니며 작성자의
|
||||
| `SDA-001`, `SDA-003`, `SDA-005`, `SDA-006` | `P1-T1` | 홈 repository/service/controller 및 `CreatorChannelHomeEndToEndTest` |
|
||||
| `SDA-002`~`SDA-006` | `P1-T2` | donation repository/service/controller 및 `CreatorChannelDonationEndToEndTest` |
|
||||
| `SDA-007` | `P1-T1`, `P1-T2`, `P1-GATE` | 두 Task는 확정 URL 계약과 기존 이미지 회귀를 검증하고, Gate는 운영 CDN 접근 가능 여부를 검증 |
|
||||
| `SDA-005` 정정 | `P2-T1`, `P2-GATE` | 홈·후원 service/HTTP E2E의 역할별 UI flag, DB 원본 및 기존 donationId/숨김 회귀 |
|
||||
|
||||
## 12. 과거 문서와의 관계
|
||||
|
||||
@@ -167,6 +177,8 @@ EN/JA 문구는 사용자가 명시 승인한 문구가 아니며 작성자의
|
||||
| 2026-11-04 | `DEC-006` | 확정 | 사용자가 제공한 익명 이미지 파일명은 `anonymous-profile.png`; 기존 `defaultProfileImageUrl()`과 동일하게 `cloud.aws.cloud-front.host`를 사용해 `"$cloudFrontHost/profile/anonymous-profile.png"`로 직접 구성한다. | 파일명 및 default-profile 구성 방식 사용자 확정. 운영 CDN 접근성은 별도 미검증 | `SDA-007`, `EXT-001`, §8.3 |
|
||||
| 2026-11-04 | `DEC-007` | 확정 | 익명 이미지는 마스킹 대상 비밀 후원 행에만 적용하고 공개/본인 원본 이미지와 기존 default-profile fallback은 보존한다. | 기존 표시 정책 유지 | `SDA-003`, `SDA-004`, §8.3 |
|
||||
|
||||
| 2026-11-04 | `DEC-008` | 정정 확정 | `DEC-002`의 저장값 전달 계약을 대체한다. 응답 isSecret은 익명 UI 표시 여부이며 공개·본인·내 채널은 false, 타 채널 타인 비밀 후원만 true다. DB 저장값, 원본/익명 내용, 기존 donationId와 숨김 정책은 유지한다. | UI에서 실제 비밀 여부 구분이 필요 없다는 사용자 확정 및 수정 요청 | `SDA-005`, §8.1, `P2-T1` |
|
||||
|
||||
## 14. 변경 관리
|
||||
|
||||
요구사항 변경은 Decision Log, 이 PRD, 이 문서 안 API 계약, [plan-task.md](plan-task.md) 순서로 반영한다. 구현 시작 전에는 외부 의존 경계를 다시 확인하고, 진행 체크박스 및 검증 결과를 실제 증거에 따라 누적한다.
|
||||
|
||||
Reference in New Issue
Block a user