Files

5.1 KiB

PRD: openRoom 응답 상대방 프로필/닉네임 추가

1. Overview

GET /api/v2/user-creator-chat/rooms/{roomId}/open 응답에 채팅 상대방의 닉네임과 프로필 이미지 URL을 포함해, 클라이언트가 방 입장 직후 별도 조회 없이 상단 프로필 정보를 표시할 수 있게 한다.


2. Problem

  • 현재 openRoom API는 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.nickname
    • opponentProfileImageUrl: 현재 로그인 회원을 제외한 활성 참여 회원의 프로필 이미지 URL
  • opponentProfileImageUrl은 기존 메시지 DTO의 senderProfileImageUrl과 같은 CloudFront URL 조합 정책을 따른다.
  • 상대방 Member.profileImagenull이면 기존 메시지 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 값 보정 정책은 기존 getMessageslimit.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.kt
    • src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/service/UserCreatorChatService.kt
    • 관련 테스트 파일
  • cloud.aws.cloud-front.host를 사용하는 기존 URL 생성 방식을 유지한다.
  • 새 추상화는 만들지 않고, 기존 toMessageItemDto의 기본 프로필 이미지 정책과 일치시키는 최소 변경을 우선한다.

9. Metrics

  • 클라이언트의 채팅방 입장 후 상대방 프로필 조회용 추가 API 호출 제거 여부
  • openRoom API 성공 응답에서 opponentNickname, opponentProfileImageUrl 누락 사례 0건

10. Open Questions

  • 없음. 필드명은 구현 계획에서 opponentNickname, opponentProfileImageUrl 기준으로 확정한다.