Socket.io๋ž€?

Daehyeon Yunยท2024๋…„ 8์›” 1์ผ

๐Ÿ“– Socket IO Reference
Server API : https://socket.io/docs/v4/server-api/
Client API : https://socket.io/docs/v4/client-api/


๐Ÿค” Socket.io ํ•™์Šต

: Socket.io enables real-time, bidirectional and event-bases communication.

โ†’ ์‹ค์‹œ๊ฐ„, ์–‘๋ฐฉํ–ฅ, event ๊ธฐ๋ฐ˜์˜ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

โ†’ Front์™€ Back์ด ์„œ๋กœ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

  • Socket.io๋Š” WebSocket์„ ์‹คํ–‰ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ๋Š”๊ฑธ ๋ช…์‹ฌํ•˜๊ธฐ.
    • **Socket.io is not a WebSocket implementation.**
    • Socket.io๋Š” WebSocket์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹˜. ์ฆ‰ โ†’ ์ฆ‰, WebSocket์ด ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €๋„ Socket.io ์‚ฌ์šฉ ๊ฐ€๋Šฅ โ†’ WebSocket์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €๋Š” HTTP์˜ long-polling์„ ์‚ฌ์šฉ.

๐Ÿ’กSocket.io ์ค‘์š” ๊ฐœ๋…

๐ŸŽˆSocket.io ๊ธฐ๋ณธ ๊ฐœ๋…

1) Socket : ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋œปํ•จ.
โ†’ Socket์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ.

2) Server : ํด๋ผ์ด์–ธํŠธ์™€์˜ ์†Œ์ผ“ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ณ  ๊ด€๋ฆฌ.
โ†’ ํด๋ผ์ด์–ธํŠธ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.

3) Client : ์„œ๋ฒ„์™€์˜ ์†Œ์ผ“ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ณ  ๊ด€๋ฆฌ.
โ†’ ์„œ๋ฒ„์™€ ๋ฐ˜๋Œ€๋กœ, ์„œ๋ฒ„๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.


๐ŸŽˆSocket.io ํŠธ๋ž˜ํ”ฝ ๊ฒฉ๋ฆฌ ๊ตฌ๋ถ„

1) Event : ์†Œ์ผ“ ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„์— ์ „์†ก๋œ ๋ฉ”์‹œ์ง€๋ฅผ ๋œปํ•จ.
โ†’ ์ด๋ฒคํŠธ ์ด๋ฆ„์€ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ์„ ์–ธ๋˜์–ด์•ผํ•œ๋‹ค.
JSON, ๋ฌธ์ž์—ด, ์ด์ง„ ๋“ฑ ๋ชจ๋“  ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ ํฌํ•จ ๊ฐ€๋Šฅ

2) Namespace : ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ๋ณ„๋„ ํ†ต์‹  ์ฑ„๋„
โ†’ ๋‹จ์ผ์„œ๋ฒ„์—์„œ ์—ฌ๋Ÿฌ Namespace ์ž‘์„ฑ ๊ฐ€๋Šฅ.
โ†’ ํด๋ผ์ด์–ธํŠธ๋Š” ํŠน์ • Namespace์— ์—ฐ๊ฒฐํ•˜์—ฌ ํ•ด๋‹น Namespace์˜
๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๋“ค์—๊ฒŒ๋งŒ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌ ํ˜น์€ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Œ.

3) Room : ๊ฒฐํ•ฉ๋œ Socket๋“ค์˜ ์ง‘ํ•ฉ(๊ทธ๋ฃน).
โ†’Socket์€ ์—ฌ๋Ÿฌ Room์— ํ•ฉ๋ฅ˜ํ•˜๊ฑฐ๋‚˜ ๋– ๋‚  ์ˆ˜ ์žˆ์Œ.
โ†’ Room์€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  Socket์—๊ฒŒ ๋ฐฉ์†กํ•˜๋Š” ๋Œ€์‹ , ํŠน์ • ๊ทธ๋ฃน์—๊ฒŒ
๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š”๋ฐ ์œ ์šฉํ•˜๋‹ค.


๐ŸŽˆSocket.io ์ด๋ฒคํŠธ ์†ก์ˆ˜์‹  ๋ฐฉ์‹

1) Public : ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋“ค์—๊ฒŒ ๋ฉ”์„ธ์ง€๊ฐ€ ์ „์†ก๋˜๋Š” ๊ฒฝ์šฐ

  • Socketio์—์„œ emit์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋“ค์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ Broadcast(์ž์‹ ์˜ ํ˜ธ์ŠคํŠธ๊ฐ€ ์†ํ•ด ์žˆ๋Š” ๋„คํŠธ์›Œํฌ ์ „์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํŒจํ‚ท์„ ์ „์†กํ•˜๋Š” ์ผ๋Œ€๋‹ค ํ†ต์‹ ๋ฐฉ์‹)ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€์™€ ๊ฐ™์€ ์ผ๋ฐ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋“ค์—๊ฒŒ ๋ณด๋‚ผ๋•Œ ์œ ์šฉ
// ์„œ๋ฒ„
io.on("connection", (socket) => {
	socket.on("chat message', (message) => {
		io.emit('chat message',message);
		// ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋“ค์—๊ฒŒ ๋ฉ”์‹œ์ง€ ํ†ต์‹ (๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ)
	});
});
// ๋ธŒ๋ผ์šฐ์ €
socket.on('chat message', (message) => {
	console.log(`Received message: ${message}`);
});

2) Private : ํŠน์ • ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ

  • ํŠน์ • emit ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•
  • ์•Œ๋ฆผ ๋˜๋Š” ์•Œ๋ฆผ๊ณผ ๊ฐ™์€ ๊ฐœ์ธ ๋ฉ”์‹œ์ง€๋ฅผ ํŠน์ • ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ผ ๋•Œ ์œ ์šฉ
// ์„œ๋ฒ„
io.on('connection' (socket) => {
	socket.on('send notification' ,(message, recipientId) => {
		io.to(recipientId).emit('notification', message);
		// ์ง€์ •๋œ ํด๋ผ์ด์–ธํŠธ(์ˆ˜์‹ ์ž)์—๊ฒŒ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ
	});
});
// ๋ธŒ๋ผ์šฐ์ €
socket.on('notification', (message) => {
	console.log(`Received notification: ${message}`);
});

3) Broadcasting : ๋ฐœ์‹ ์ž๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋“ค์—๊ฒŒ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜๋Š” ๊ฒฝ์šฐ

  • socket.broadcast.emit์œผ๋กœ ๋ฐœ์‹ ํ•œ ๋ฐœ์‹ ์ž๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์—ฐ๊ฒฐ๋œ ํด๋ผ์ด์–ธํŠธ๋“ค์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•.
  • ๋ฐœ์‹ ์ž๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์—ฐ๊ฒฐ๋œ ํด๋ผ์ด์–ธํŠธ๋“ค์—๊ฒŒ ์‚ฌ์šฉ์ž ์—ฐ๊ฒฐ ๋˜๋Š” ์ข…๋ฃŒ์™€ ๊ฐ™์€ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š”๋ฐ ์œ ์šฉ
// ์„œ๋ฒ„ ์ธก 
io.on('connection', (socket) => {
  socket.on('user join', (userName) => {
    socket.broadcast.emit('new user', userName); 
		// ๋ฐœ์‹ ์ž๋ฅผ ์ œ์™ธํ•œ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฉ”์‹œ์ง€ ํ†ต์‹ (๋ธŒ๋กœ๋“œ ์บ์ŠคํŠธ)
		// room์„ ๊ฐ€๋ฆฌ์ง€ ์•Š๊ณ  ๋ชจ๋“  socket์—๊ฒŒ ํ†ต์‹ 
  });
});
// ํด๋ผ์ด์–ธํŠธ ์ธก 
socket.on('new user', (userName) => {
  console.log(`New user joined: ${userName}`);
});

๐ŸŽˆSocket.io ์ด๋ฒคํŠธ ์†ก์ˆ˜์‹  ๊ฐœ๋…

1) Emit : ํด๋ผ์ด์–ธํŠธ โ†”์„œ๋ฒ„์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋‚ด๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

  • Event ์ด๋ฆ„๊ณผ ์ „์†กํ•  ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ๋œ ์ด 2๊ฐœ์˜ props๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
// ์ด๋ฒคํŠธ ์ด๋ฆ„, ์ „์†ก์‹œํ‚ฌ ๋ฐ์ดํ„ฐ
socket.emit('chat message', 'Hello DaeHyeon!');

2) To : ํŠน์ • Socket์ด๋‚˜ Room์— ์ด๋ฒคํŠธ๋ฅผ ์ „์†ก์‹œํ‚ค๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์ด๋ฒคํŠธ๊ฐ€ ์ „์†ก๋  Socket ID ํ˜น์€ Room Name ์ด๋ผ๋Š” prop์ด ํ•„์š”ํ•˜๋‹ค.
// to method๋Š” event๋ฅผ ๋ณด๋‚ผ Socket ID๋ฅผ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.
io.to('00001').emit('chat message', 'Hello DaeHyeon!');

3) On : ํด๋ผ์ด์–ธํŠธโ†”์„œ๋ฒ„์—์„œ Event์— ๋Œ€ํ•œ listener๋ฅผ ๋งŒ๋“œ๋Š” ์šฉ๋„

  • Event์ด๋ฆ„๊ณผ Event๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ์œ„ํ•œ Callback ํ•จ์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ ์ด 2๊ฐœ์˜ props๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
// ์ด๋ฒคํŠธ ์ด๋ฆ„, ์ด๋ฒคํŠธ๊ฐ€ ์ˆ˜์‹ ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” Callback ํ•จ์ˆ˜
socket.on('chat message', (message) => {
	console.log(`Received message: ${message}`);
});

4) Of : ์ž์ฒด Socket ๋ฐ Event ์„ธํŠธ๋กœ ์ƒˆ๋กœ์šด Namespace๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์ƒ์„ฑํ•  Namespace์˜ ์ด๋ฆ„์„ prop์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
// of <- ์ƒˆ๋กœ์šด Namespace ์ƒ์„ฑ
const chatNamespace = io.of('/chat');

๐Ÿ’ก Socket.io ์ž‘๋™ ๋ฐฉ์‹

  • ์„œ๋ฒ„๋Š” ๋“ค์–ด์˜ค๋Š” ์—ฐ๊ฒฐ์„ ํ™•์ธํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ˆ˜์‹ ํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๊ณ  ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ฑฐ๋‚˜ ์ „๋‹ฌ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์„œ๋ฒ„๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ๋ฐ›์•„ ํด๋ผ์ด์–ธํŠธ๋กœ ์‘๋‹ต์„ ๋‹ค์‹œ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์„œ๋ฒ„๋Š” ๋™์ผํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋˜๋Š” Room์— ์žˆ๋Š” ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐ŸŽˆ Adapter๋ž€?

An Adapter is a server-side component which is responsible for broadcasting events to all or a subset of clients.

When scaling to multiple Socket.IO servers, you will need to replace the default in-memory adapter by another implementation, so the events are properly routed to all clients.

Adapter๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋‚˜ ์ผ๋ถ€ ํด๋ผ์ด์–ธํŠธ์— ์ด๋ฒคํŠธ๋ฅผ ์ค‘๊ณ„ํ•ด์ฃผ๋Š” ์„œ๋ฒ„์ธก ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.

Socket์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ๋Š˜์–ด๋‚  ๋•Œ, ๊ธฐ๋ณธ ๋ฉ”๋ชจ๋ฆฌ Adapter๋ฅผ ๋‹ค๋ฅธ Adapter๋กœ ๊ต์ฒดํ•ด์•ผํ•˜๋ฉฐ, ๊ทธ๋ž˜์•ผ ์ด๋ฒคํŠธ๋“ค์ด ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์—์„œ ์ ์ ˆํ•˜๊ฒŒ ๋ผ์šฐํŒ…๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • socket.io์—์„œ Adapter๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„๋“ค ์‚ฌ์ด์— ์‹ค์‹œ๊ฐ„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋™๊ธฐํ™” ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰
    • ๋ณธ๋ž˜ ์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ธฐ๋ณธ Adapter๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (socket.io์˜ adapter๊ฐ€ ์•„๋‹Œ, ์„œ๋ฒ„์—์„œ ๊ธฐ๋ณธ ์ œ๊ณต ๋˜๋Š” ๊ฒƒ.)
    • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์™€์˜ ์ปค๋„ฅ์…˜๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•œ๋‹ค.
    โ†’ ์ด๋•Œ, DB์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
    
- **์„œ๋ฒ„๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์— ์ปค๋„ฅ์…˜์„ ์˜คํ”ˆํ•ด์•ผํ•˜๊ธฐ์— ์ˆ˜๋งŽ์€ ํด์•„์ด์–ธํŠธ์—๊ฒŒ ์ปค๋„ฅ์…˜์ด ์š”์ฒญ๋˜๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ํ•ด๋‹น ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„๋ฅผ ๋‘ ์„ธ๊ฐœ, ํ˜น์€ ๋” ๋งŽ์ด ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.**
- ๊ทธ๋ ‡๊ฒŒ ๋Š˜์–ด๋‚œ ์„œ๋ฒ„๋Š” ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ํด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ์— ๊ฐ ์„œ๋ฒ„๋Š” **๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ**๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.
- ์ฆ‰, **๋‘ ๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋˜‘๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ด์šฉํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋˜์–ด ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.**
- ์ด๋Ÿฐ ๊ฒฝ์šฐ์— socket io์˜ adapter๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, **adapter๋Š” ๋งŒ์•ฝ ์„œ๋ฒ„ A์— ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ด์šฉํ•˜๋Š” ์œ ์ €๊ฐ€ ์„œ๋ฒ„ B์— ์žˆ๋Š” ์œ ์ €์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๋™๊ธฐ์ ์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.**
  • Adapter๋Š” ๋ˆ„๊ฐ€ ์—ฐ๊ฒฐ๋˜์—ˆ๋Š”์ง€, ํ˜„์žฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— room์ด ์–ผ๋งˆ๋‚˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
    rooms: Map(2) {
    	// ... ํ˜„์žฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์žˆ๋Š” ๋ชจ๋“  room
    }
    sids: Map(2) {
    	// ...socket id๋“ค ํ™•์ธ ๊ฐ€๋Šฅ
    }
    • socket์€ ๊ทธ ์ž์ฒด๋กœ room ํ•˜๋‚˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
    • socket id (=sids)๋Š” ํด๋ผ์ด์–ธํŠธ ์‹๋ณ„์ž, ์ฆ‰ ์‚ฌ์šฉ์ž ID์ด๋ฉฐ ๋™์‹œ์— socket์˜ privateํ•œ room id.
    • ์ฆ‰, socket id = private room id
    • ๊ฐ์ฒด rooms๋Š” socket.id์ด์ž private room๊ณผ join์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ public room์˜ ์ง‘ํ•ฉ ๊ฐ์ฒด
    • ๊ฐ์ฒด rooms์€ sids๋ฅผ ํฌํ•จํ•œ๋‹ค.
    • ๋งŒ์•ฝ, ๊ฐ์ฒด rooms์— sids๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋ฉด ํ•ด๋‹น room์€ Public Room. โ†’ ๐ŸŽ‡ ์ตœ์ข… ์š”์•ฝ โ†’ sids๋Š” private room์ด์ž ์‚ฌ์šฉ์ž ID(socket id) โ†’ rooms๋Š” private room, public room ๋ชจ๋‘ ์กด์žฌ.
      • ์ด๋•Œ, rooms๋Š” sids๊ฐ’์„ ํฌํ•จํ•œ๋‹ค.
      • ์ฆ‰, rooms์—์„œ sids๊ฐ’์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€๋Š” Public room.

๐Ÿ’ก Admin Panel

  • Socket.io๋Š” Admin UI๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ์„œ๋น„์Šค์ค‘์ธ Socket.io ๋ฐฐํฌ ์ƒํƒœ์— ๋Œ€ํ•œ ๊ฐœ์š”๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ˜„์žฌ ์—ฐ๊ฒฐ๋œ ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ ์ •๋ณด
    • ๊ฐ Socket ์ธ์Šคํ„ด์Šค์˜ ์„ธ๋ถ€ ์ •๋ณด (active transport, handshake, room ๋“ฑ๋“ฑ..)
    • ๊ฐ room์— ๋Œ€ํ•œ ์ •๋ณด
    • ์„œ๋ฒ„(Server-side)์—์„œ emit์‹œํ‚ค๋Š” ๋ชจ๋“  Event์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด
    • Socket ๊ด€๋ฆฌ ์ž‘์—… (join, leave, disconnect ๋“ฑ๋“ฑ..)
  • ๐Ÿค” ์„ค์น˜ ๋ฐฉ๋ฒ•
    npm install @socket.io/admin-ui
    
    // server-side (server.js)
    const { createServer } = require("http");
    const { Server } = require("socket.io");
    const { instrument } = require("@socket.io/admin-ui");
    
    const httpServer = createServer();
    
    const io = new Server(httpServer, {
      cors: {
        origin: ["https://admin.socket.io"],
        credentials: true
      }
    });
    
    instrument(io, {
      auth: false,
      mode: "development",
    });
    
    httpServer.listen(3000);

์ฐธ๊ณ 

๐Ÿฅฒ https://velog.io/@fejigu/Socket.IO-client

profile
์—ด์‹ฌํžˆ ์‚ด์•„์•ผ์ง€

0๊ฐœ์˜ ๋Œ“๊ธ€