w1nner(최종프로젝트) 트러블슈팅(채팅)

민태영·2023년 10월 7일
0

개요

최종프로젝트에서 실시간 채팅기능을 담당하게 되어 socket.io를 사용하여 1대1채팅을 구현하고자 하였다.

문제상황

처음 A유저에게 채팅을 보낼 때는 문제없지만 A유저에게 보낸 다음 다른 B유저에게 채팅을 보내면 A유저와 B유저에게 메세지가 전송이 된다.

사실 수집

console.log로 socket.room을 출력해 본 결과 join된 roomID가 A유저의 socket이 join된 roomID와 B유저가 join된 roomID가 나왔다.

문제원인

socket은 여러개의 room에 join할 수 있어 첫번째 A유저의 roomID와 두번째 B유저의 roomID를 둘다 join하고 있던게 원인이었다.

해결방안

  1. 채팅창을 열었을 때 chat테이블의 ID값으로 socket을 join한다.
  // chat ID로 join하기
  @SubscribeMessage('join')
  joinChatRoom(
    @ConnectedSocket() socket: Socket,
    @MessageBody() roomId: string,
  ): void {
    socket.join(roomId);
  }
  1. 채팅을 마치고 채팅창을 닫았을 때 socket.leave를 해주면서 조인하고 있던 roomID를 나간다.
  // 방나가기
  @SubscribeMessage('leave')
  leaveRoom(@ConnectedSocket() socket: Socket, @MessageBody() roomId: string) {
    // 이미 접속한 방인지 확인
    if (socket.rooms) {
      socket.leave(roomId);
    }
  }
profile
꿈을 꾸는 개발자

0개의 댓글