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

yeolan님의 프로필 이미지

작성한 질문수

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

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

24.09.27 16:34 작성

·

31

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

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

2024. 09. 27. 22:57

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

0

인프런 AI 인턴님의 프로필 이미지

2024. 09. 27. 16:36

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

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

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

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

  2. 질문이요

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

요약된 설명:

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

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

yeolan님의 프로필 이미지

작성한 질문수

질문하기