인프런 커뮤니티 질문&답변

yeolan님의 프로필 이미지
yeolan

작성한 질문수

[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지

chat.adapter.rooms의 시간순 정렬 여부

작성

·

40

0

// socket.js
socket.on('disconnect', async () => {
      console.log('chat 네임스페이스 접속 해제');
      // /room/방아이디 => URL에서 가져오기.
      const { referer } = socket.request.headers;
      const roomId = new URL(referer).pathname.split('/').at('-1');
      const currentRoom = chat.adapter.rooms.get(roomId); // 현재 방의 인원이 0이면(방장도 나감) 자동삭제.
      const userCount = currentRoom?.size || 0;

      if (userCount === 0) {
        await removeRoom(roomId);
        room.emit('removeRoom', roomId); // room 네임스페이스에 이 방이 제거됬다고 알려서 실시간으로 제거할 것임.
        console.log('방 제거 요청 성공');
      } else {
        // 시스템 메시지 DB 저장
        const systemChat = `${socket.request.session.color}님이 퇴장하셨습니다.`;
        await createChat(roomId, 'system', systemChat);

        const memberList = [...currentRoom].map((socketId) => {
          return {
            color: chat.sockets.get(socketId).request.session.color,
            socketId,
          };
        });

        // 누군가 나가면 그 방의 모든 사람에게 시스템 메시지 및 정보 전달.
        socket.to(roomId).emit('exit', {
          user: 'system',
          chat: systemChat,
          memberList,
        });
      }
    });
  });
};

여기서 chat.adapter.rooms.get(roomId) = currentRoom이 Set객체인데 여기 쌓이는 socketId들은 접속한 순서대로 쌓이나요? 그러니까, 시간순 정렬이 되어있는 건가요?

방장 위임하는 기능 구현 중인데 '방에 방장 정보를 저장한다' 이걸 어떻게 해야할 지 모르겠습니다🤔

답변 2

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

일단 방장 정보는 DB에 저장하면 됩니다. 현재 익명 방장인지라 방장의 소켓아이디를 방에 저장하여야 합니다. 방장 위임은 방장 소켓아이디를 다른 사람으로 바꿔주면 됩니다. 방장의 컬러이름과 소켓아이디를 서버에서 연결해둔 객체를 활용해야 합니다.

0

안녕하세요, 인프런 AI 인턴입니다. yeolan님.

문의하신 사항에 대해 연관된 기존 답변이 아래에 있습니다. 이는 Socket.io와 Room 관리를 다루고 있으며, 방장 정보를 관리하는 것에 대한 개념을 포함하고 있습니다.

여기 두 가지 관련된 질문과 답변을 참고하실 수 있을 것 같습니다:

  1. 왜 방을 처음 만든 사람은 ‘XXX님이 입장하셨습니다.’ 가 안뜨는 이유가 궁금합니다.

  2. 질문이요

위 질문에서는 socket.io를 이용한 방과 접속자 관리를 다루며, 사용자 정보를 어떻게 관리할 수 있는지에 대해 논의하고 있습니다. 이를 참고하여 방장 정보를 별도로 저장하고 관리하는 방법을 고민해보시면 도움이 될 수 있을 겁니다.

요약된 설명:

  • socket.io에서 adapter.rooms: adapter.rooms는 각 방의 소켓 ID들을 관리하는 객체입니다. 이는 방에 속한 소켓들이 Set 형태로 저장되므로 순서는 보장되지 않습니다. 따라서 방장 위임 등의 기능을 구현하려면 방장 정보를 별도로 관리하는 것이 좋습니다.
  • 방장 정보 관리: 방장 정보를 방금 생성된 방에 저장하거나, 방장 교체 시 적절하게 업데이트하여 보관하는 방식으로 관리할 수 있습니다. 예를 들어, 방장의 소켓 ID를 별도의 변수나 데이터베이스에 저장할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

yeolan님의 프로필 이미지
yeolan

작성한 질문수

질문하기