5.1 KiB
5.1 KiB
PRD: openRoom 응답 상대방 프로필/닉네임 추가
1. Overview
GET /api/v2/user-creator-chat/rooms/{roomId}/open 응답에 채팅 상대방의 닉네임과 프로필 이미지 URL을 포함해, 클라이언트가 방 입장 직후 별도 조회 없이 상단 프로필 정보를 표시할 수 있게 한다.
2. Problem
- 현재
openRoomAPI는roomId, 최신 메시지 목록, 페이징 정보만 반환한다. - 클라이언트는 채팅방 화면에 필요한 상대방 표시 정보를
openRoom응답에서 바로 얻을 수 없다. - 메시지 목록의
senderNickname,senderProfileImageUrl은 각 메시지 발신자 정보라서, 메시지가 없거나 마지막 메시지가 본인 발신인 경우 채팅방 상대방 표시 정보로 안정적으로 쓰기 어렵다.
3. Goals
openRoom응답에 현재 로그인 회원 기준 상대방 닉네임을 추가한다.openRoom응답에 현재 로그인 회원 기준 상대방 프로필 이미지 URL을 추가한다.- 기존
messages,hasMore,nextCursor동작은 변경하지 않는다. - 인증/참여자 검증, 방 조회 실패, 페이징 정책은 기존
openRoom동작을 유지한다.
4. Non-Goals
createOrGetRoom,getMessages, 메시지 발송 API 응답은 이번 범위에서 변경하지 않는다.- 채팅방 리스트 API 응답 구조는 이번 범위에서 변경하지 않는다.
- DB 스키마 변경은 이번 범위에 포함하지 않는다.
- 상대방 프로필 스냅샷 저장, 닉네임 변경 이력 표시, 탈퇴 회원 표시 정책 변경은 이번 범위에 포함하지 않는다.
- 차단/비활성 회원 정책은 기존 유저-크리에이터 채팅 정책을 변경하지 않는다.
5. Target Users
- 유저: 크리에이터와의 채팅방에 입장해 상대방 프로필과 닉네임을 즉시 확인하려는 회원
- 크리에이터: 유저와의 채팅방에 입장해 상대방 프로필과 닉네임을 즉시 확인하려는 회원
- 모바일 클라이언트: 방 입장 응답만으로 채팅방 헤더를 렌더링하려는 클라이언트
6. User Stories
- 사용자는 채팅방에 입장하자마자 상단에서 상대방 닉네임을 보고 싶다.
- 사용자는 채팅방에 메시지가 없어도 상대방 프로필 이미지를 보고 싶다.
- 클라이언트는 방 입장 후 상대방 정보를 얻기 위해 추가 API를 호출하지 않고 싶다.
7. Core Features
openRoom 응답 확장
Requirements
- 대상 API는
GET /api/v2/user-creator-chat/rooms/{roomId}/open이다. - 응답 DTO는
UserCreatorChatRoomOpenResponse를 확장한다. - 응답에는 기존 필드에 더해 다음 필드를 포함한다.
opponentNickname: 현재 로그인 회원을 제외한 활성 참여 회원의Member.nicknameopponentProfileImageUrl: 현재 로그인 회원을 제외한 활성 참여 회원의 프로필 이미지 URL
opponentProfileImageUrl은 기존 메시지 DTO의senderProfileImageUrl과 같은 CloudFront URL 조합 정책을 따른다.- 상대방
Member.profileImage가null이면 기존 메시지 DTO와 동일하게profile/default-profile.png를 기본 이미지 경로로 사용한다. - 상대방 산출은 기존
UserCreatorChatParticipantRepository.findActiveOpponent(roomId, memberId)또는 같은 의미의 기존 조회 패턴을 재사용한다. - 현재 회원이 방 참여자가 아니면 기존처럼
chat.room.invalid_access예외를 유지한다. - 활성 방이 아니면 기존처럼
chat.error.room_not_found예외를 유지한다.
Edge Cases
- 메시지가 0개인 방도
opponentNickname,opponentProfileImageUrl을 반환해야 한다. - 최신 메시지 발신자가 본인이어도 상대방 필드는 현재 로그인 회원을 제외한 참여자를 기준으로 반환해야 한다.
- 프로필 이미지가 없는 상대방은 기본 이미지 URL을 반환해야 한다.
- 잘못된
limit값 보정 정책은 기존getMessages의limit.coerceIn(1, 100)동작을 유지한다.
8. Technical Constraints
- Spring Boot 2.7.14, Kotlin, Java 17, Gradle Wrapper 구조를 유지한다.
- 공개 API 응답 필드 추가이므로 기존 필드는 제거하거나 이름을 변경하지 않는다.
- 구현 변경 예상 파일은 다음 범위로 제한한다.
src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/dto/UserCreatorChatDtos.ktsrc/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/service/UserCreatorChatService.kt- 관련 테스트 파일
cloud.aws.cloud-front.host를 사용하는 기존 URL 생성 방식을 유지한다.- 새 추상화는 만들지 않고, 기존
toMessageItemDto의 기본 프로필 이미지 정책과 일치시키는 최소 변경을 우선한다.
9. Metrics
- 클라이언트의 채팅방 입장 후 상대방 프로필 조회용 추가 API 호출 제거 여부
openRoomAPI 성공 응답에서opponentNickname,opponentProfileImageUrl누락 사례 0건
10. Open Questions
- 없음. 필드명은 구현 계획에서
opponentNickname,opponentProfileImageUrl기준으로 확정한다.