9.7 KiB
9.7 KiB
홈 팔로잉 최근 대화 팔로우 필터 PRD
문서 정보
| 항목 | 내용 |
|---|---|
| 문서 상태 | 구현 기준 확정 |
| 작성일 | 2026-08-19 |
| 최종 수정일 | 2026-08-19 |
| 대상 제품 | 메인 홈 팔로잉 탭 API의 최근 대화 섹션 |
| 작성자·결정권자 | Codex 작성, 사용자 승인 |
| 선행 PRD | docs/20260625_메인_홈_팔로잉_탭_API/prd.md |
| 관련 API Contract | 별도 문서 없음. 기존 GET /api/v2/home/following 계약을 유지한다. |
| 관련 구현 계획 | docs/20260819_홈_팔로잉_최근대화_팔로우필터/plan-task.md |
| 관련 review | 없음 |
선행 문서와의 관계
- 이 문서는 선행 PRD의 Feature D와 "최근 대화는 팔로잉 여부와 무관하다"는 Edge Case만 대체한다.
- 선행 PRD에서 정의한 나머지 팔로잉 탭 요구사항과 완료 기록은 변경하지 않는다.
1. Overview
로그인 사용자가 메인 홈 팔로잉 탭을 조회할 때 recentChats에는 현재 팔로우 중인 크리에이터와의 DM 및 AI 채팅만 노출한다. 기존 응답 스키마, 최신순 정렬, 최대 10개, 메시지 미리보기 정책은 유지한다.
2. Problem Statement
HomeFollowingFacade는 현재ChatRoomListService.getRooms(member, filter = "ALL", cursor = null, limit = 10)을 호출한다.- 이 호출은 사용자의 모든 DM 및 AI 채팅방을 조회하므로, 팔로우하지 않은 크리에이터와의 대화도 팔로잉 탭에 노출된다.
- 팔로잉 탭의 최근 대화 섹션이 탭의 목적과 다른 대상을 보여준다.
문제를 해결했다는 판단은 팔로잉 탭 응답에서 활성 팔로우 대상의 DM 및 AI 채팅만 최신순 최대 10개로 반환되고, 일반 채팅 목록 API의 결과는 바뀌지 않는 것으로 한다.
3. Goals
- 팔로잉 탭의
recentChats를 현재 활성 팔로우 관계가 있는 크리에이터의 대화로 제한한다. - DM과 AI 채팅을 모두 포함한다.
- 팔로우 필터를 저장소 조회에 적용한 뒤 최대 10개를 선택해, 더 최신인 미팔로우 대화 때문에 결과 수가 줄지 않게 한다.
- 기존 공개 API 스키마, 정렬, 미리보기, 최대 개수 정책을 유지한다.
- 일반 채팅 목록 API의 기존 전체 조회 동작을 유지한다.
4. Non-Goals
GET /api/v2/home/following또는GET /api/v2/chat/rooms의 request/response 스키마를 변경하지 않는다.- 채팅방 생성, 메시지 전송, 읽음 처리, cursor 형식과 메시지 미리보기 정책을 변경하지 않는다.
- 팔로우/언팔로우 처리 자체와 알림 설정 정책을 변경하지 않는다.
- 차단 관계, 크리에이터 계정 활성 상태 등 이번 요청에 포함되지 않은 추가 노출 조건을 도입하지 않는다.
- DB schema, index, dependency를 추가하지 않는다.
- 선행 홈 팔로잉 PRD의 최근 대화 이외 섹션을 변경하지 않는다.
5. Target Users and Permissions
| 사용자 | 기대 결과 |
|---|---|
| 로그인 회원 | 팔로우 중인 크리에이터와의 최근 DM 및 AI 채팅을 확인한다. |
| 비로그인 사용자 | 기존과 동일하게 로그인 필요 상태와 빈 recentChats를 받는다. |
| 앱 클라이언트 | 변경 없는 응답 스키마로 최근 대화 섹션을 표시한다. |
- 인증 회원의
Member.id를 팔로우 관계와 채팅 참가자 조회 기준으로 사용한다. - 비로그인 요청에서는 기존과 동일하게 채팅 조회를 실행하지 않는다.
6. 핵심 사용자 흐름
- 사용자가
GET /api/v2/home/following을 호출한다. - 서버는 로그인 회원의 홈 팔로잉 데이터와 최근 대화를 조회한다.
- 최근 대화 조회는 현재
CreatorFollowing.isActive = true인 크리에이터의 채팅만 선택한다. - DM과 AI 결과를 기존 정렬 규칙으로 병합하고 최대 10개를 반환한다.
- 앱은 기존
recentChats응답 필드로 채팅방 진입 화면을 구성한다.
7. 기능 요구사항
| ID | 상태 | 요구사항 | 수용 기준 | Goal 연결 |
|---|---|---|---|---|
HFC-001 |
확정 | 팔로잉 탭의 최근 대화는 요청 회원이 현재 활성 팔로우 중인 크리에이터의 채팅만 포함한다. | 활성 팔로우 대상은 포함되고 팔로우 row가 없거나 isActive = false인 대상은 제외된다. |
P1-T1, P1-GATE |
HFC-002 |
확정 | DM 채팅의 크리에이터 식별자는 UserCreatorChatParticipant의 상대 회원 opponent.member.id를 사용한다. |
상대 회원과 요청 회원의 활성 CreatorFollowing이 있을 때만 DM 방이 반환된다. |
P1-T1 |
HFC-003 |
확정 | AI 채팅의 크리에이터 식별자는 ChatCharacter.creatorMember.id를 사용한다. |
AI 캐릭터의 creatorMember와 요청 회원의 활성 CreatorFollowing이 있을 때만 AI 방이 반환된다. |
P1-T1 |
HFC-004 |
확정 | 팔로우 필터는 저장소 조회에서 pagination보다 먼저 적용한다. | 최신 미팔로우 대화가 10개 이상이어도 그보다 오래된 팔로우 대화를 최대 10개까지 조회할 수 있다. | P1-T1 |
HFC-005 |
확정 | DM과 AI 결과는 기존 lastMessageAt, chatType, roomId 내림차순으로 병합하고 최대 10개를 반환한다. |
기존 정렬·limit·ChatRoomListItemResponse 변환 테스트가 통과한다. |
P1-T1 |
HFC-006 |
확정 | 일반 채팅 목록은 기존처럼 팔로잉 여부와 무관하게 조회한다. | GET /api/v2/chat/rooms가 팔로우 필터를 요청하지 않고 기존 서비스 테스트가 통과한다. |
P1-T1, P1-GATE |
HFC-007 |
확정 | 비로그인 홈 팔로잉 요청 동작은 유지한다. | isLoginRequired = true, 빈 recentChats, 채팅 서비스 미호출이 유지된다. |
P1-GATE |
HFC-008 |
확정 | 홈 팔로잉의 크리에이터 목록 최대 20개와 관계없이 모든 활성 팔로우 관계를 최근 대화 필터에 사용한다. | followingCreators 응답 목록을 후처리 필터로 재사용하지 않고 DB의 활성 팔로우 관계를 직접 판정한다. |
P1-T1 |
Edge Cases
- 활성 팔로우 관계가 없으면
recentChats는 빈 배열이다. - 과거에 팔로우했더라도 현재
CreatorFollowing.isActive = false이면 해당 대화를 제외한다. - 활성 팔로우 관계가 있는 AI와 DM 대화가 함께 있으면 두 유형 모두 기존 최신순 정렬에 포함한다.
- 방, 참가자 또는 메시지가 비활성인 경우 기존 채팅 목록 조회 조건대로 제외한다.
- 메시지가 없는 방은 기존 채팅 목록 정책대로 최근 대화에 포함하지 않는다.
8. API 계약
Endpoint
- Method/Path:
GET /api/v2/home/following - request parameter: 변경 없음
- 인증 처리: 변경 없음
- response wrapper: 변경 없음
recentChats: 기존List<ChatRoomListItemResponse>유지roomId,chatType,targetName,targetImageUrl,lastMessage,lastMessageAt: 필드와 의미 변경 없음
GET /api/v2/chat/rooms의 공개 계약과 전체 조회 의미도 변경하지 않는다.
9. 데이터·보안·성능 요구사항
- 팔로우 판정은
creator_following.member_id,creator_following.creator_id,creator_following.is_active = true를 사용한다. creator_following의 기존(member_id, creator_id)unique constraint를 활용하고 신규 index를 추가하지 않는다.- 팔로우 여부는 응답 생성 시점의 DB 상태를 기준으로 한다.
- 회원·채팅·팔로우 식별자와 메시지 본문을 새 log로 남기지 않는다.
- 팔로우 필터는 DB query에 포함해 미팔로우 결과를 메모리에서 제거하거나 전체 대화를 로드하지 않는다.
- 신규 dependency와 DB migration을 추가하지 않는다.
10. 성공 기준
- 활성 팔로우 중인 일반 크리에이터와의 DM이
recentChats에 포함된다. (HFC-001,HFC-002) - 활성 팔로우 중인 AI 캐릭터와의 AI 채팅이
recentChats에 포함된다. (HFC-001,HFC-003) - 팔로우하지 않았거나 현재 비활성 팔로우인 크리에이터의 대화는 제외된다. (
HFC-001) - 필터 적용 후 최신순 최대 10개와 기존 응답 필드가 유지된다. (
HFC-004,HFC-005) - 일반 채팅 목록과 비로그인 홈 팔로잉 응답이 회귀하지 않는다. (
HFC-006,HFC-007) - 공개 API schema, DB schema와 dependency 변경이 없다.
11. Open Questions
없음.
인터뷰 종료 시 최종 모호성은 0.07이며, 명확성 점수는 Goal 1.00, Scope 1.00, Constraints 1.00, Success 0.75, Context 0.90이다.
12. 요구사항 추적표
| 요구사항 범위 | 계획 Phase | Goal | 자동 검증 |
|---|---|---|---|
HFC-001~005, HFC-008 |
1 | P1-T1 |
ChatRoomListServiceTest, HomeFollowingFacadeTest, HomeFollowingEndToEndTest |
HFC-006~007 |
1 | P1-GATE |
ChatRoomListControllerTest, HomeFollowingFacadeTest, HomeFollowingEndToEndTest |
13. Decision Log
| 날짜 | ID | 상태 | 결정 | 근거 | 영향 요구사항·Goal |
|---|---|---|---|---|---|
| 2026-08-19 | DEC-001 |
확정 | 최근 대화는 DM과 AI 채팅을 모두 포함한다. | 사용자는 AI 채팅 가능 캐릭터도 크리에이터라고 확정했다. | HFC-001~003, P1-T1 |
| 2026-08-19 | DEC-002 |
확정 | 일반 채팅 목록은 유지하고 홈 팔로잉 조회에서만 활성 팔로우 필터를 사용한다. | 변경 범위를 홈 팔로잉 탭으로 제한하고 기존 공개 API 회귀를 방지한다. | HFC-006, P1-T1 |
| 2026-08-19 | DEC-003 |
확정 | 기존 완료 문서는 유지하고 이 PRD가 최근 대화 규칙만 대체한다. | 완료 이력을 보존하면서 새 변경의 범위와 검증을 독립적으로 추적한다. | 문서 전체 |