Socket.io: socket.rooms๋Š” ์“ธ๋ชจ์—†๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 03์›” 08์ผ  ยท  8์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: socketio/socket.io

์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฌธ์„œํ™”๋œ socket.rooms ๊ฐ์ฒด์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์žˆ๋Š” ๋ฐฉ์„ ์‹๋ณ„ํ•˜๋Š” ๋ฌธ์ž์—ด ํ•ด์‹œ๋กœ, ๋ฐฉ ์ด๋ฆ„์œผ๋กœ ์ธ๋ฑ์‹ฑ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์˜ˆ ๋Š” ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

io.on('connection', function(socket){
  socket.join('room 237', function(){
    console.log(socket.rooms); // [ <socket.id>, 'room 237' ]
    io.to('room 237', 'a new user has joined the room'); // broadcast to everyone in the room
  });
});

console.log(socket.rooms); ์‹คํ–‰ํ•  ๋•Œ ๋‚˜๋Š” ๊ทธ ์˜ˆ์œ ๋ฐฐ์—ด์„ _์›ํ•ฉ๋‹ˆ๋‹ค_ (๊ทธ๋ž˜์„œ ๋‚˜๋Š”๋ฐฉ๋งŒ ๊ฐ€์ ธ์˜ด), ํ•˜์ง€๋งŒ ์ด ๋ชป์ƒ๊ธด ๋ฌผ๊ฑด์„ ๋‹ค์‹œ ์–ป์Šต๋‹ˆ๋‹ค.

io.on('connection', function(socket){
  socket.join('room 237', function(){
    console.log(socket.rooms); // { <socket.id>: '<socket.id>', 'room 237': 'room 237' }
  });
});

... ๊ทธ๋Ÿฐ ๋‹ค์Œ .keys() ์žˆ๋Š” ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ ์†์œผ๋กœ socket.id ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ฒซ ๋ฒˆ์งธ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ).

๋ฒ„๊ทธ์ธ๊ฐ€์š”? ๋‚˜๋Š” 1.7.3์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์˜ˆ, ์ด๊ฒƒ์€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์†Œ์ผ“ ID๊ฐ€ "๋ฐฉ"์ด ๋˜๋Š” ์ด์œ  ๋˜๋Š” ํ‚ค:๊ฐ’ ์Œ์ด ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ์ •๋ง ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ชฉ๋ก์ผ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฐฉ์ด ์žˆ๋“ , ๋‹น์‹ ์€ ๊ฑฐ๊ธฐ์— ์žˆ๊ณ , ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

['room1', 'room2', 'room3']

๊ทธ๋ฆฌ๊ณ  ์œ„์™€ ๊ฐ™์ด io.rooms๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด๋กœ, ๋˜๋Š” ์ด ๊ฒฝ์šฐ ๋ฐฉ ์ด๋ฆ„์„ ํ‚ค๋กœ, ์†Œ์ผ“ ID ๋ฐฐ์—ด์„ ๊ฐ’์œผ๋กœ ๊ฐ€์ง„ ๊ฐ์ฒด๋กœ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

{ room1: ['id1', 'id2', 'id3'], room2: ['id4', 'id5', 'id6'] }

๋ชจ๋“  8 ๋Œ“๊ธ€

๊ธ€์Ž„, ์—ฌ๊ธฐ ๋ฌธ์„œ๊ฐ€ ์ตœ์‹ ์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. rooms ๋Š” ์‹ค์ œ๋กœ v1.4๊นŒ์ง€ ๋ฐฐ์—ด์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ๋ถ€์šธ์„ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ธฐ๋Šฅ ์š”์ฒญ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. socket.io๋ฅผ ๋‹ค์‹œ ๋ฉ‹์ง€๊ฒŒ ๋งŒ๋“œ์‹ญ์‹œ์˜ค. ์–ด๋ ˆ์ด๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค์„ธ์š”!

์—ฌ๊ธฐ์„œ ๋‚ด ๋ชฉํ‘œ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์žˆ๋Š” ๋ฐฉ์˜ ๋ฐฐ์—ด์„ ์–ป๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ socket.id ๊ฐ€ ์ฒซ ๋ฒˆ์งธ๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

var rooms = socket.rooms.slice(1);

ํ˜„์žฌ ๊ตฌํ˜„ ์‚ฌ์šฉ:

var roomKeys = Object.keys(socket.rooms);
var socketIdIndex = roomKeys.indexOf( socket.id );
var rooms = roomKeys.splice( socketIdIndex, 1 );

socket.id ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ตณ์ด ์ฐพ์•„์„œ ๊ณจ๋ผ์•ผ ํ•˜๋Š” ๊ฑด ์‹ซ๋‹ค.

var rooms = Object.keys(socket.rooms);

๋ถ€์šธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹ค์ œ ๊ฐ’์„ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋งž๋‚˜์š”?).

var roomKeys = Object.keys(socket.rooms);
var rooms = roomKeys.filter(function(key){ 
  return socket.rooms[key]==true;
});

indexOf() ๋กœ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ๋งŒํผ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—†๋Š” ๋ฐฉ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด _์ข‹์„ ๊ฒƒ_์ž…๋‹ˆ๋‹ค(์˜ˆ: ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ™”๋ฐฉ ํ‘œ์‹œ). Server ์ธ์Šคํ„ด์Šค์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ •๋ณด๊ฐ€ ๋” ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

var allRooms = io.rooms;
var myRooms = socket.rooms;

๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด์— ๋Œ€ํ•ด ์˜๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ์ด๊ฒƒ์€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์†Œ์ผ“ ID๊ฐ€ "๋ฐฉ"์ด ๋˜๋Š” ์ด์œ  ๋˜๋Š” ํ‚ค:๊ฐ’ ์Œ์ด ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ์ •๋ง ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ชฉ๋ก์ผ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฐฉ์ด ์žˆ๋“ , ๋‹น์‹ ์€ ๊ฑฐ๊ธฐ์— ์žˆ๊ณ , ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

['room1', 'room2', 'room3']

๊ทธ๋ฆฌ๊ณ  ์œ„์™€ ๊ฐ™์ด io.rooms๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด๋กœ, ๋˜๋Š” ์ด ๊ฒฝ์šฐ ๋ฐฉ ์ด๋ฆ„์„ ํ‚ค๋กœ, ์†Œ์ผ“ ID ๋ฐฐ์—ด์„ ๊ฐ’์œผ๋กœ ๊ฐ€์ง„ ๊ฐ์ฒด๋กœ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

{ room1: ['id1', 'id2', 'id3'], room2: ['id4', 'id5', 'id6'] }

๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ์กฐํšŒ ์„ฑ๋Šฅ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ 100๊ฐœ์˜ ๋ฐฉ์— ์ฐธ์—ฌํ–ˆ์„ ๋•Œ ๋ฐฐ์—ด ๊ฐ’์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฐœ์ฒด ์กฐํšŒ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๊ฐ€ ๋ฐฉ์— ์ฐธ์—ฌํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.

stackoverflow์— ๋Œ€ํ•œ ๋‚ด ๋Œ€๋‹ต์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

{
    "room1":"room1",
    "room2":"room2",
    ...
    "room100":"room100"
}

์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ์— ์ฐธ์—ฌํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.
if(socket.rooms[roomID]) return true;

๋ฐฐ์—ด ์œ ํ˜•์ธ ๊ฒฝ์šฐ indexOf๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  ๋ฐฐ์—ด์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
if(socket.rooms.indexOf(roomID) != -1) return true;

๊ทธ๋Ÿฌ๋‚˜ ํ‚ค ๊ฐ’์ด ๋ถ€์šธ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
{ room1: true, ... , room100: true }

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐ’์ด ๋ถ€์šธ์ด ๋˜๋„๋ก socket.rooms๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฑฐ ์ž‘์—…ํ•ด๋„ ๊ดœ์ฐฎ๋‚˜์š”? CONTRIBUTING.md ํŒŒ์ผ์„ ๋ณด์ง€ ๋ชปํ•ด์„œ ๊ธฐ์—ฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

Set ๊ฐ€ ๋” ํ•ฉ๋ฆฌ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

if (socket.rooms.has(roomID)) return true;

์˜ˆ๋ฅผ ๋“ค์–ด ๊ตฌ์กฐ๋Š” ๋‹จ์ˆœํžˆ Set(4)ย {"<socket ID>", "room1", "room2", "room3"} ์ž…๋‹ˆ๋‹ค.

์„ธํŠธ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ์ผ์ •ํ•˜๋‹ค๋ฉด ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฏฟ์Šต๋‹ˆ๋‹ค.

Socket.IO v3์—์„œ Socket#rooms ๋Š” ์ด์ œ Set์ด ๋˜๋ฉฐ ๊ธฐ๋ณธ ์–ด๋Œ‘ํ„ฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐ

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰