현재 동작 구조 파악

  1. socket 연결
  2. 채팅 작성 및 전송

프론트 내 채팅 메시지 구조

import { IChat } from "./IChat";
import { IUser } from "./IUser";

export interface IMessage {
  chat: IChat;
  content: string;
  readBy: IUser[];
  sender: IUser;
  createdAt: Date;
  updatedAt: Date;
  __v: number;
  _id: string;
}

수정 사항

백엔드에서 Chat을 Join 시킨 뒤, 프론트에 전달하고, 다시 돌려받는 과정을 거친다.

이는 그리 좋은 방식은 아닌듯하다.

물론 소켓 통신 도중에, DB와 통신하여, chat과 관련된 데이터를 불러오는 것 또한 시간이 걸리는 동작이겠지만, 아마 다른 방식이 있지 않을까 생각한다. 기존의 room을 사용한다면…

// 브로드케스트 : 자신 이외의 모든 클라이언트에게 브로드캐스트
socket.broadcast.to(chat.id).emit("message received", newMessageReceived);
// 모든 클라이언트에 송신
socket.in(chat.id).emit("message received", newMessageReceived);

https://github.com/SWYP-LUCKY-SEVEN/chat-server/pull/5

채팅방 데이터 페이징

현재 채팅방에 입장할 경우. 이전의 모든 채팅 데이터를 한번에 불러오게된다.

채팅 기록이 쌓일수록 해당 방식은, HTTP 통신으로는 감당할 수 없을만큼 데이터가 커질 뿐 아니라, 백엔드에서 데이터를 처리하는 과정에 있어서 또한 결코 효율적이지 않다.

사용자는 쌓여온 모든 채팅 데이터가 한순간에 필요한 순간은 거의 없기 때문이다.