From 0811f92bf56f548714eb483a5dbebbff90f893b8 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 19 Jun 2026 02:45:51 +0900 Subject: [PATCH] =?UTF-8?q?docs(user-creator-chat):=20=ED=81=B4=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EC=96=B8=ED=8A=B8=20WebSocket=20=EC=97=B0=EB=8F=99=20?= =?UTF-8?q?=EC=95=88=EB=82=B4=EB=A5=BC=20=EA=B0=B1=EC=8B=A0=ED=95=9C?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20260513_유저크리에이터채팅방개편.md | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/docs/plan-task/20260513_유저크리에이터채팅방개편.md b/docs/plan-task/20260513_유저크리에이터채팅방개편.md index c9e5239a..429ea8eb 100644 --- a/docs/plan-task/20260513_유저크리에이터채팅방개편.md +++ b/docs/plan-task/20260513_유저크리에이터채팅방개편.md @@ -201,8 +201,10 @@ CREATE TABLE user_creator_chat_message ( - 모든 요청은 `Authorization: Bearer ` 헤더를 포함한다. - API prefix는 `/api/v2/user-creator-chat/rooms`를 사용한다. - 메시지 타입은 `TEXT`, `VOICE`만 처리한다. -- 앱이 백그라운드로 전환되거나 채팅방 화면에서 나가면 `POST /{roomId}/events/disconnect`를 호출하고 SSE 연결을 종료한다. -- SSE 연결이 끊기면 3초부터 재연결하고, 연속 실패 시 3초, 6초, 12초, 24초, 최대 30초까지 지수 백오프한다. +- 채팅방 화면 진입 시 `openRoom` REST 호출 후 WebSocket `/ws/v2/user-creator-chat`에 연결한다. +- WebSocket 연결 직후 `JOIN_ROOM`을 보내고, `JOINED` 수신 후 텍스트 전송을 허용한다. +- 앱이 백그라운드로 전환되거나 채팅방 화면에서 나가면 `LEAVE_ROOM`을 보낸 뒤 WebSocket을 close한다. +- 현재 채팅방 화면에 남아 있는 동안 WebSocket이 끊기면 지수 백오프로 재연결하고 `JOIN_ROOM`을 다시 보낸다. 연동할 API: 0. 채팅방 리스트 조회 @@ -225,16 +227,16 @@ CREATE TABLE user_creator_chat_message ( - `GET /api/v2/user-creator-chat/rooms/{roomId}/messages?cursor={nextCursor}&limit=20` - response data: `{ "messages", "hasMore", "nextCursor" }` -4. SSE 연결 - - `GET /api/v2/user-creator-chat/rooms/{roomId}/events` - - Accept: `text/event-stream` - - 이벤트 이름 `message`를 수신하면 payload를 현재 채팅방 메시지 목록에 append한다. - - 이벤트 이름 `connected`는 연결 확인용으로만 사용한다. +4. WebSocket 연결 + - endpoint: `/ws/v2/user-creator-chat` + - handshake header: `Authorization: Bearer ` + - 연결 직후 `{ "type": "JOIN_ROOM", "requestId": "client-request-id", "roomId": roomId, "payload": {} }`를 전송한다. + - `JOINED`를 수신하면 현재 방 실시간 수신 상태로 판단한다. -5. 텍스트 메시지 전송 - - `POST /api/v2/user-creator-chat/rooms/{roomId}/messages/text` - - body: `{ "textMessage": string }` - - response data: `{ "message", "deliveredRealtime", "pushSent" }` +5. 텍스트 메시지 전송(WebSocket) + - `{ "type": "SEND_TEXT", "requestId": "client-request-id", "roomId": roomId, "payload": { "textMessage": string } }`를 전송한다. + - `SEND_ACK` 수신 시 pending 메시지를 서버 응답의 `messageId`, `createdAt`, 프로필 정보 기준으로 확정한다. + - `MESSAGE` 수신 시 현재 채팅방 `roomId`와 일치하면 메시지 목록에 append한다. 6. 음성 메시지 전송 - `POST /api/v2/user-creator-chat/rooms/{roomId}/messages/voice` @@ -243,9 +245,15 @@ CREATE TABLE user_creator_chat_message ( - part `request`: `{}` JSON 문자열 - response data: `{ "message", "deliveredRealtime", "pushSent" }` -7. 실시간 연결 해제 - - `POST /api/v2/user-creator-chat/rooms/{roomId}/events/disconnect` - - DB 참여자를 삭제하거나 비활성화하지 않고 SSE/presence 상태만 해제한다. +7. 실시간 연결 해제(WebSocket) + - `{ "type": "LEAVE_ROOM", "requestId": "client-request-id", "roomId": roomId, "payload": {} }`를 전송한 뒤 WebSocket을 close한다. + - DB 참여자를 삭제하거나 비활성화하지 않고 WebSocket presence 상태만 해제한다. + +제거된 호출: +- `GET /api/v2/user-creator-chat/rooms/{roomId}/events` +- `POST /api/v2/user-creator-chat/rooms/{roomId}/events/disconnect` +- `POST /api/v2/user-creator-chat/rooms/{roomId}/messages/text` +- SSE reconnect/retry 처리 코드 메시지 DTO 필드: - `messageId`: number