๐ Socket IO Reference
Server API : https://socket.io/docs/v4/server-api/
Client API : https://socket.io/docs/v4/client-api/
: Socket.io enables real-time, bidirectional and event-bases communication.
โ ์ค์๊ฐ, ์๋ฐฉํฅ, event ๊ธฐ๋ฐ์ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ํ๋ ์์ํฌ
โ Front์ Back์ด ์๋ก ์ค์๊ฐ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ํ๋ ์์ํฌ

1) Socket : ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ์ ์ฐ๊ฒฐ์ ๋ปํจ.
โ Socket์ ์ฌ์ฉํ์ฌ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์.
2) Server : ํด๋ผ์ด์ธํธ์์ ์์ผ ์ฐ๊ฒฐ์ ์ค์ ํ๊ณ ๊ด๋ฆฌ.
โ ํด๋ผ์ด์ธํธ๋ก ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๊ฑฐ๋ ์์ ํ ์ ์๋ค.
3) Client : ์๋ฒ์์ ์์ผ ์ฐ๊ฒฐ์ ์ค์ ํ๊ณ ๊ด๋ฆฌ.
โ ์๋ฒ์ ๋ฐ๋๋ก, ์๋ฒ๋ก ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๊ฑฐ๋ ์์ ํ ์ ์๋ค.
1) Event : ์์ผ ์ฐ๊ฒฐ์ ํตํด ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ์ ์ ์ก๋ ๋ฉ์์ง๋ฅผ ๋ปํจ.
โ ์ด๋ฒคํธ ์ด๋ฆ์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๋ชจ๋ ๋์ผํ๊ฒ ์ ์ธ๋์ด์ผํ๋ค.
JSON, ๋ฌธ์์ด, ์ด์ง ๋ฑ ๋ชจ๋ ํ์์ ๋ฐ์ดํฐ ํฌํจ ๊ฐ๋ฅ
2) Namespace : ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ๋ณ๋ ํต์ ์ฑ๋
โ ๋จ์ผ์๋ฒ์์ ์ฌ๋ฌ Namespace ์์ฑ ๊ฐ๋ฅ.
โ ํด๋ผ์ด์ธํธ๋ ํน์ Namespace์ ์ฐ๊ฒฐํ์ฌ ํด๋น Namespace์
๋ค๋ฅธ ํด๋ผ์ด์ธํธ๋ค์๊ฒ๋ง ์ด๋ฒคํธ๋ฅผ ์ ๋ฌ ํน์ ์์ ํ ์ ์์.
3) Room : ๊ฒฐํฉ๋ Socket๋ค์ ์งํฉ(๊ทธ๋ฃน).
โSocket์ ์ฌ๋ฌ Room์ ํฉ๋ฅํ๊ฑฐ๋ ๋ ๋ ์ ์์.
โ Room์ ์ฐ๊ฒฐ๋ ๋ชจ๋ Socket์๊ฒ ๋ฐฉ์กํ๋ ๋์ , ํน์ ๊ทธ๋ฃน์๊ฒ
๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋๋ฐ ์ ์ฉํ๋ค.
1) Public : ์ฐ๊ฒฐ๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ๋ค์๊ฒ ๋ฉ์ธ์ง๊ฐ ์ ์ก๋๋ ๊ฒฝ์ฐ
// ์๋ฒ
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 : ํน์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ๋
// ์๋ฒ
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 : ๋ฐ์ ์๋ฅผ ์ ์ธํ ๋ชจ๋ ํด๋ผ์ด์ธํธ๋ค์๊ฒ ๋ฉ์์ง๊ฐ ์ ์ก๋๋ ๊ฒฝ์ฐ
// ์๋ฒ ์ธก
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}`);
});
1) Emit : ํด๋ผ์ด์ธํธ โ์๋ฒ์์ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ด๋๋ฐ ์ฌ์ฉํ๋ค.
// ์ด๋ฒคํธ ์ด๋ฆ, ์ ์ก์ํฌ ๋ฐ์ดํฐ
socket.emit('chat message', 'Hello DaeHyeon!');
2) To : ํน์ Socket์ด๋ Room์ ์ด๋ฒคํธ๋ฅผ ์ ์ก์ํค๋๋ฐ ์ฌ์ฉํ๋ค.
// to method๋ event๋ฅผ ๋ณด๋ผ Socket ID๋ฅผ ์ง์ ํ๋๋ฐ ์ฌ์ฉํ๋ค.
io.to('00001').emit('chat message', 'Hello DaeHyeon!');
3) On : ํด๋ผ์ด์ธํธโ์๋ฒ์์ Event์ ๋ํ listener๋ฅผ ๋ง๋๋ ์ฉ๋
// ์ด๋ฒคํธ ์ด๋ฆ, ์ด๋ฒคํธ๊ฐ ์์ ๋ ๋ ํธ์ถ๋๋ Callback ํจ์
socket.on('chat message', (message) => {
console.log(`Received message: ${message}`);
});
4) Of : ์์ฒด Socket ๋ฐ Event ์ธํธ๋ก ์๋ก์ด Namespace๋ฅผ ๋ง๋๋๋ฐ ์ฌ์ฉํ๋ค.
// of <- ์๋ก์ด Namespace ์์ฑ
const chatNamespace = io.of('/chat');

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์ ์๋ ์ ์ ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ณ ์ถ์ ๋ ๋๊ธฐ์ ์ผ๋ก ๋ณด๋ผ ์ ์๋๋ก ํ๋ค.**
rooms: Map(2) {
// ... ํ์ฌ ์ดํ๋ฆฌ์ผ์ด์
์ ์๋ ๋ชจ๋ room
}
sids: Map(2) {
// ...socket id๋ค ํ์ธ ๊ฐ๋ฅ
}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);