인프런 커뮤니티 질문&답변
chat.adapter.rooms의 시간순 정렬 여부
작성
·
98
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 관리를 다루고 있으며, 방장 정보를 관리하는 것에 대한 개념을 포함하고 있습니다.
여기 두 가지 관련된 질문과 답변을 참고하실 수 있을 것 같습니다:
위 질문에서는 socket.io를 이용한 방과 접속자 관리를 다루며, 사용자 정보를 어떻게 관리할 수 있는지에 대해 논의하고 있습니다. 이를 참고하여 방장 정보를 별도로 저장하고 관리하는 방법을 고민해보시면 도움이 될 수 있을 겁니다.
요약된 설명:
- socket.io에서 adapter.rooms:
adapter.rooms는 각 방의 소켓 ID들을 관리하는 객체입니다. 이는 방에 속한 소켓들이 Set 형태로 저장되므로 순서는 보장되지 않습니다. 따라서 방장 위임 등의 기능을 구현하려면 방장 정보를 별도로 관리하는 것이 좋습니다.
- 방장 정보 관리: 방장 정보를 방금 생성된 방에 저장하거나, 방장 교체 시 적절하게 업데이트하여 보관하는 방식으로 관리할 수 있습니다. 예를 들어, 방장의 소켓 ID를 별도의 변수나 데이터베이스에 저장할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





