...

Socket.IO
node.js์์๋ ๋ง์ ์น ์์ผ ๊ตฌํ์ฒด๊ฐ ์๋ค. socket.io์ ws๊ฐ ์๋ค.
ws๋ ๊ธฐ๋ณธ์ ์ถฉ์คํ ๋๋์ด๊ณ , socket.io๋ ๊ธฐ๋ณธ๋ ๊ธฐ๋ณธ์ด์ง๋ง ๋ญ๊ฐ ์๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์๋ฅผ ๋ค์ด room์ด๋ผ๋ ๊ธฐ๋ฅ์ ์ด์ฉํด ์ฌ๋ฌ ๊ฐ์ ์ฑํ ๋ฐฉ์ ๋ง๋ค ์ ์๊ณ ์์ผ์ ์ฐ๊ฒฐ๋ ์ ์ฒด ํด๋ผ์ด์ธํธ์๊ฒ broadcast๋ฅผ ๋ณด๋ผ ์ ์๋ค๊ฑฐ๋, room ๋ณ๋ก broadcast๋ฅผ ๋ณด๋ผ ์ ์๋ค.
์ด๋ฐ ๋ถ๋ถ๋ค์ ์ข ๋ ์ฝ๊ณ ์ง๊ด์ ์ผ๋ก ์ ๊ณตํ๋ ๊ฒ์ด ํน์ง์ด๋ค.
๊ฑฐ๊ธฐ๋ค๊ฐ, HTML5 WebSocket์ ๋งค์ฐ ์ ์ฉํ ๊ธฐ์ ์ด์ง๋ง ์ค๋๋ ๋ธ๋ผ์ฐ์ ์ ๊ฒฝ์ฐ ์ง์ํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ ํธํ์ด๋ ์ด์ ๋ฒ์ ํธํ์ ๊ณ ๋ คํ์ฌ Node.js๋ฅผ ์ํ ๊ฐ๋ ฅํ Cross-platform WebSocket API์ธ Socket.io๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
socket.io๋ ์ฑํ ๋ฐฉ์ ํนํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ, ๋ง์ผ ์๋ฐฉํฅ ํต์ ๊ธฐ์ ์ด ํ์ํ๋ฐ ์ฑํ ๋ฐฉ์ด ์๋ ๋ค๋ฅธ ์๋น์ค๋ฅผ ๊ตฌํํ๋ค๊ณ ํ๋ค๋ฉด socket.io๋ ๋ง์ง ์์์ ์๋ค.
> npm i socket.io # ์์ผIO ์ค์น
Socket IO ์ด๋ฒคํธ ํต์
์์ผIO ์ ๋ฉ์๋์ ํน์ง์ ํด๋ผ์ด์ธํธ์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ ๊ฐ๋ฐ์๊ฐ ์์๋ก ์ค์ ํ ์ ์๋ค๋ ์ ์ด๋ค.
์ด๋ฒคํธ๋ ๋ฌธ์์ด๋ก ์ง์ ํ๋ฉฐ ์ง์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค. ์ ๋ฐ์ ์ผ๋ก ๋ ธ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฐฉ์์ ๋ฐ๋ฅด๊ณ ์๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
// ํด๋น ์ด๋ฒคํธ๋ฅผ ๋ฐ๊ณ ์ฝ๋ฐฑํจ์๋ฅผ ์คํ
socket.on('๋ฐ์ ์ด๋ฒคํธ ๋ช
', (msg) => {
})
// ์ด๋ฒคํธ ๋ช
์ ์ง์ ํ๊ณ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ธ๋ค.
socket.emit('์ ์กํ ์ด๋ฒคํธ ๋ช
', msg)
์ด๋ฐ์์ผ๋ก ๋ฉ์ธ์ง ๋ง๋ค ๊ณ ์ ํ ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํด ๊ตฌ๋ณํด์ ์ก์์ ํ๋ฉด,
์ฑํ ๋ฐฉ์์ '๊ท์๋ง' ๊ธฐ๋ฅ์ฒ๋ผ ํน์ ์ด๋ ์ฌ๋ํํ ๋ง ๋ฉ์ธ์ง๋ฅผ ์ก์ ํ๋ค๋์ง ..๋ฑ ๋ค์ํ ํต์ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค.
Socket IO ์ก์์ ๋ฉ์๋
์์ผ ๋ฉ์ธ์ง ์์
// ์ ์๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฉ์์ง๋ฅผ ์ ์กํ๋ค
io.emit('event_name', msg);
// ๋ฉ์์ง๋ฅผ ์ ์กํ ํด๋ผ์ด์ธํธ์๊ฒ๋ง ๋ฉ์์ง๋ฅผ ์ ์กํ๋ค
socket.emit('event_name', msg);
// ๋ฉ์์ง๋ฅผ ์ ์กํ ํด๋ผ์ด์ธํธ๋ฅผ ์ ์ธํ ๋ชจ๋ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฉ์์ง๋ฅผ ์ ์กํ๋ค
socket.broadcast.emit('event_name', msg);
// ํน์ ํด๋ผ์ด์ธํธ์๊ฒ๋ง ๋ฉ์์ง๋ฅผ ์ ์กํ๋ค
io.to(id).emit('event_name', data);
์์ผ ๋ฉ์ธ์ง ์ก์
// ํด๋ผ์ด์ธํธ์ ์์ผIO ์ฐ๊ฒฐ๋ฌ๋์ง ์๋ฌ๋์ง ์ด๋ฒคํธ ์คํ. (์ฑํ
๋ฐฉ์ ๋๊ฐ ์
์ฅํ์์ต๋๋ค/ํด์ฅํ์์ต๋๋ค )
io.on('connection/disconnection', (socket) => {
});
// ํด๋ผ์ด์ธํธ์์ ์ง์ ํ ์ด๋ฒคํธ๊ฐ emit๋๋ฉด ์์ ๋ฐ์
socket.on('event_name', (data) => {
});
Socket.IO ํต์ ๊ตฌํํด๋ณด๊ธฐ
์์ผ ์๋ฒ ์ค์
1) app์๋ฒ ์์ฑ
const app = require("express")();
const server = app.listen(8005, ()=>{ });
2) ์์ผIO์ ์๋ฒ ์ ๋ณด ๋๊ฒจ์ฃผ๊ณ ๊ตฌ๋
const SocketIO = require('socket.io');
// ์๋ฒ ์ฐ๊ฒฐ, path๋ ํ๋ก ํธ์ ์ผ์น์์ผ์ค๋ค.
const io = SocketIO(server, { path: '/socket.io' });
* path์ต์ : ์ด ๊ฒฝ๋ก๋ฅผ ํตํด ํต์ ์ ์ํํ๋ฉฐ, ์๋ต์ ๋ํดํธ ๊ฐ์ /socket.io ๋ก ์ง์ ๋๋ค.
3) ์์ผ ์ฐ๊ฒฐ์ ์ฑ๊ณตํ๋ฉด ์ด๋ฒคํธ ํต์
//* ์น์์ผ ์ฐ๊ฒฐ ์
io.on('connection', (socket) => {
//* ์ฐ๊ฒฐ ์ข
๋ฃ ์
socket.on('disconnect', () => {
console.log('ํด๋ผ์ด์ธํธ ์ ์ ํด์ ', ip, socket.id);
clearInterval(socket.interval);
});
//* ์๋ฌ ์
socket.on('error', (error) => {
console.error(error);
});
//* ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฉ์์ง ์์
socket.on('reply', (data) => { // reply๋ผ๋ ์ด๋ฒคํธ๋ก ์ก์ ์ค๋ฉด ๋ฉ์ธ์ง๊ฐ data์ธ์์ ๋ด๊น
console.log(data);
});
//* ํด๋ผ์ด์ธํธ๋ก ๋ฉ์ธ์ง ์ก์
socket.emit('news', 'Hello Socket.IO'); // news๋ผ๋ ์ด๋ฒคํธ๋ก ๋ฌธ์์ด์ ํฌํจํ์ฌ ์ก์
});
์์ผ ํด๋ผ์ด์ธํธ ์ค์
1) socket.io ๋ชจ๋ ์คํฌ๋ฆฝํธ ๋ก๋
<script src="/socket.io/socket.io.js"></script>
socket.io ๋ชจ๋์ ๋ด๋ถ์ ์ผ๋ก "๋ฃจํธ/socket.io" ๊ฒฝ๋ก์ socket.io.js ํ์ผ์ ์๋์ผ๋ก ๋ฑ๋กํด๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ์ ์ฝ๋๋ socket.io๋ชจ๋์ด ์๋์ผ๋ก ์์ฑํด๋ http://127.0.0.1:8005/socket.io/socket.io.js ์ ์ ๊ทผํ์ฌ JS ์คํฌ๋ฆฝํธ๋ฅผ ๋ถ๋ฌ์ค๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด JS์คํฌ๋ฆฝํธ์์ ์์ผIO ๊ฐ์ฒด๋ฅผ ๋ฝ์ ํด๋ผ์ด์ธํธ์์๋ ์์ผ ํต์ ์ ํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
2) ์์ผIO ๊ฐ์ฒด ์์ฑ ๋ฐ ์ฐ๊ฒฐ
<!-- ์ต์คํ๋ ์ค ์๋ฒ์ ์์ผ ์๋ฒ๊ฐ ์ฐ๊ฒฐ์ด ๋๋ฉด, ์์ผIO ์๋ฒ์์ jsํ์ผ์ ๋ฃ์ด์ค๋ค -->
<script src="/socket.io/socket.io.js"></script>
<script>
// ์์ socket.io.js์์ ๋ฝ์ ์ด๋ค.
const socket = io.connect('http://localhost:8005', { // ws:// ๋ฅผ ์์ฐ๊ณ http๋ฅผ ์ด๋ค
path: '/socket.io', // ์๋ฒ path์ ์ผ์น์์ผ์ค๋ค
transports: ['websocket']
});
</script>
์ฐ๊ฒฐํ ์๋ฒ ๊ฒฝ๋ก ๋ฐ ์ต์ ์ ์ค์ ํด์ค๋ค.
- path ์ต์
: ์ด ๊ฒฝ๋ก๋ฅผ ํตํด ๊ฐ์ข ํต์ ์ ์ํํ๋ฉฐ, node.js์์์ ์ค์ ํ path์ ๋์ผํ๊ฒ ์ง์ ํด์ผํ๋ค. - transports ์ต์
: socket.io๋ ์ฒ์์ polling ์ฐ๊ฒฐ์ ์๋ํ๊ณ , ์น์์ผ์ด ์ง์๋๋ ๋ธ๋ผ์ฐ์ ์ธ ๊ฒฝ์ฐ, wsํต์ ์ผ๋ก ์ดํํ๋ค.
: ์ฒ์๋ถํฐ ws๋ก ํต์ ํ๊ณ ์ ํ ๊ฒฝ์ฐ, transports ์ต์ ๊ฐ์ ['websocket']์ผ๋ก ์ถ๊ฐ ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
3) ์ก์์ ์ด๋ฒคํธ ์ฒ๋ฆฌ (์ฐ๊ฒฐ/์ข ๋ฃ/์๋ฌ/๋ฐ์ดํฐ ์์ ๋ฑ)
<!-- ์ต์คํ๋ ์ค ์๋ฒ์ ์์ผ ์๋ฒ๊ฐ ์ฐ๊ฒฐ์ด ๋๋ฉด, ์์ผIO ์๋ฒ์์ jsํ์ผ์ ๋ฃ์ด์ค๋ค -->
<script src="/socket.io/socket.io.js"></script>
<script>
// ์์ socket.io.js์์ ๋ฝ์ ์ด๋ค.
const socket = io.connect('http://localhost:8005', { // ws:// ๋ฅผ ์์ฐ๊ณ http๋ฅผ ์ด๋ค
path: '/socket.io', // ์๋ฒ path์ ์ผ์น์์ผ์ค๋ค
// transports: ['websocket']
});
// ์๋ฒ๋ก๋ถํฐ ๋ฉ์ธ์ง ์์
socket.on('news', function (data) {
console.log(data);
// ์๋ฒ์๊ฒ ๋ฉ์ธ์ง ์ก์
socket.emit('reply', 'Hello Node.JS');
});
</script>
์์ผIO ์ ์ฒด ์ฝ๋
๊ธฐ๋ณธ์ ์ธ express.js ์๋ฒ๋ ๋๋จธ์ง ๋ผ์ฐํฐ ์ฝ๋๋ ์ด์ ํฌ์คํ ์ฐธ์กฐํ๊ธธ ๋ฐ๋๋ค.
[SOCKET] ๐ WS ์น์์ผ ์ฌ์ฉํด๋ณด๊ธฐ
์ ํํ์ต [WEB] ๐ ์น ์์ผ (Socket) ์ญ์ฌ๋ถํฐ ์ ๋ฆฌ โ ์น ๊ฐ๋ฐ์ ์ฒ์ ๋ฐฐ์ฐ๊ธฐ ์์ํ๋ค๋ฉด ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ํต์ ์ ๋ชจ๋ HTTP ํ๋กํ ์ฝ๋ง ์ด์ฉํด์ ์ด๋ฃจ์ด์ง๋ค๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ํ์ง๋ง ์น
inpa.tistory.com
์๋ฒ (socket.js)
const SocketIO = require('socket.io');
module.exports = (server) => {
// ์๋ฒ ์ฐ๊ฒฐ, path๋ ํ๋ก ํธ์ ์ผ์น์์ผ์ค๋ค.
const io = SocketIO(server, { path: '/socket.io' });
//* ์น์์ผ ์ฐ๊ฒฐ ์
io.on('connection', (socket) => {
const req = socket.request; // ์น์์ผ๊ณผ๋ ๋ฌ๋ฆฌ req๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ๋ฝ์์ผํจ
//* ip ์ ๋ณด ์ป๊ธฐ
const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
console.log('์๋ก์ด ํด๋ผ์ด์ธํธ ์ ์!', ip, socket.id, req.ip);
// socket.id ๋ ์์ผ ์ฐ๊ฒฐ๋ ๊ณ ์ ํ ํด๋ผ์ด์ธํธ ์๋ณ์๋ผ๊ณ ๋ณด๋ฉด๋๋ค. ์ฑํ
๋ฐฉ์ ์
์ฅํ ๊ณ ์ ํ ์ฌ๋
//* ์ฐ๊ฒฐ ์ข
๋ฃ ์
socket.on('disconnect', () => {
console.log('ํด๋ผ์ด์ธํธ ์ ์ ํด์ ', ip, socket.id);
clearInterval(socket.interval);
});
//* ์๋ฌ ์
socket.on('error', (error) => {
console.error(error);
});
//* ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฉ์์ง
socket.on('reply', (data) => {
console.log(data);
});
//* ํด๋ผ์ด์ธํธ๋ก ๋ฉ์ธ์ง ๋ณด๋ด๊ธฐ
socket.interval = setInterval(() => {
// 3์ด๋ง๋ค ํด๋ผ์ด์ธํธ๋ก ๋ฉ์์ง ์ ์ก
socket.emit('news', 'Hello Socket.IO');
}, 3000);
});
};
๋จผ์ socket.io ํจํค์ง๋ฅผ ๋ถ๋ฌ์ ์ต์คํ๋ ์ค ์๋ฒ์ ์ฐ๊ฒฐํ๋ค.
SocketIO ๊ฐ์ฒด์ ๋ ๋ฒ์งธ ์ธ์๋ก ์ต์ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด ์๋ฒ์ ๊ดํ ์ฌ๋ฌ ๊ฐ์ง ์ค์ ๋ค์ ํ ์ ์๋ค.
์ฌ๊ธฐ์ ํด๋ผ์ด์ธํธ๊ฐ ์ ์ํ ๊ฒฝ๋ก์ธ path ์ต์ ๋ง ์ฌ์ฉํ๋ค. ํด๋ผ์ด์ธํธ๋ ์ด ๊ฒฝ๋ก์ ์ผ์นํ๋ path๋ฅผ ๋ฃ์ด์ผํ๋ค.
์ฐ๊ฒฐ ํ์๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ถ์ธ๋ค.
connection ์ด๋ฒคํธ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ ์ํ์ ๋ ๋ฐ์ํ๋ฉฐ, ์ฝ๋ฐฑ์ผ๋ก ์์ผ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๋ค.
Socket.IO์ ํต์ฌ์ socket ๊ฐ์ฒด์ io ๊ฐ์ฒด์ด๋ค.
socket.request ์์ฑ์ผ๋ก ์์ฒญ ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๊ณ , socket.request.res ๋ก๋ ์๋ต ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๋ค.
socket.id ๋ก ์์ผ ๊ณ ์ ์ ์์ด๋๋ ๊ฐ์ ธ์ฌ ์ ์์ผ๋ฉฐ ์ด ์์ด๋๋ก ์์ผ์ ์ฃผ์ธ์ ํน์ ํ ์ ์๋ค. (ํน์ ์ฑํ
๋ฐฉ ์ฐธ์ฌ์์๊ฒ ๊ท์๋ง์ ๋ณด๋ธ๋ค๊ฑฐ๋ ๊ฐํด์ํจ๋ค๊ฑฐ๋)


socket์๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ถ์ธ๋ค.
disconnect๋ ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ์ ๋์์ ๋ ๋ฐ์ํ๊ณ , error๋ ํต์ ๊ณผ์ ์์ ์๋ฌ๊ฐ ๋์์ ๋ ๋ฐ์ํ๋ค.
reply๋ ์ฌ์ฉ์๊ฐ ์ง์ ๋ง๋ ์ด๋ฒคํธ์ด๋ค.
ํด๋ผ์ด์ธํธ์์ reply๋ผ๋ ์ด๋ฒคํธ ๋ช ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋ ์๋ฒ์์ ๋ฐ๋ ๋ถ๋ถ์ด๋ค.
์ด์ ๊ฐ์ด ์ด๋ฒคํธ ๋ฐฉ์์ด ws ๋ชจ๋๊ณผ๋ ๋ค๋ฅด๋ค.
์๋์ emit(์ด๋ฐ ์ด๋ผ ์ฝ๋๋ค) ๋ฉ์๋๋ก 3์ด๋ง๋ค ํด๋ผ์ด์ธํธ ํ ๋ช ์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ๋ถ๋ถ์ด ์๋๋ฐ, ์ธ์๊ฐ ๋ ๊ฐ์ด๋ค.
์ฒซ ๋ฒ์งธ ์ธ์๋ ์ด๋ฒคํธ ์ด๋ฆ, ๋ ๋ฒ์งธ ์ธ์๋ ๋ฐ์ดํฐ๋ค.
์ฆ, news๋ผ๋ ์ด๋ฒคํธ ์ด๋ฆ์ผ๋ก Hello Socket.IO๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ์ ๋ณด๋ธ ๊ฒ์ด๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ๊ธฐ ์ํด์ news๋ผ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ news ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ง๋ค์ด๋์ด์ผ ํ๋ค. ๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ ๋ถ๋ถ์ธ index.njk๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๊ฟ์ค๋ค.
ํด๋ผ์ด์ธํธ (index.njk)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>GIF ์ฑํ
๋ฐฉ</title>
</head>
<body>
<div>F12๋ฅผ ๋๋ฌ console ํญ๊ณผ network ํญ์ ํ์ธํ์ธ์.</div>
<!-- ์ต์คํ๋ ์ค ์๋ฒ์ ์์ผ ์๋ฒ๊ฐ ์ฐ๊ฒฐ์ด ๋๋ฉด, ์์ผIO ์๋ฒ์์ jsํ์ผ์ ๋ฃ์ด์ค๋ค -->
<script src="/socket.io/socket.io.js"></script>
<script>
// ์์ socket.io.js์์ ๋ฝ์ ์ด๋ค.
const socket = io.connect('http://localhost:8005', {
path: '/socket.io', // ์๋ฒ path์ ์ผ์น์์ผ์ค๋ค
//transports: ['websocket'] // polling ์๋ํ์ง๋ง๊ณ ๋ฐ๋ก ์น์์ผ์ผ๋ก ํ๋ ค๋ฉด ์ค์
});
socket.on('news', function (data) {
console.log(data);
socket.emit('reply', 'Hello Node.JS');
});
</script>
</body>
</html>
์์ src์ธ /socket.io/socket.io.js ๋ Socket.IO์์ ํด๋ผ์ด์ธํธ๋ก ์ ๊ณตํ๋ ์คํฌ๋ฆฝํธ์ด๋ฉฐ, ์ค์ ํ์ผ์ด ์๋๋ค.
์ด ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์๋ฒ์ ์ ์ฌํ API๋ก ์น ์์ผ ํต์ ์ด ๊ฐ๋ฅํ๋ค.
์คํฌ๋ฆฝํธ๊ฐ ์ ๊ณตํ๋ io ๊ฐ์ฒด์ ์๋ฒ ์ฃผ์๋ฅผ ์ ์ด ์ฐ๊ฒฐํ๋ค.
์๋ฒ์์ ๋ณด๋ด๋ news ์ด๋ฒคํธ๋ฅผ ๋ฐ๊ธฐ ์ํด news ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ถ์ฌ๋์๋ค. news ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด emit ๋ฉ์๋๋ก ๋ค์ ์๋ฒ์ ๋ต์ฅ์ ํ๋ค. ์๋ฒ์ reply ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ก ๋ต์ฅ์ด ๊ฐ๋ค.
์๋ฒ๋ฅผ ์คํํ๊ณ http://localhost:8005์ ์ ์ํด๋ณด์.
๊ฐ๋ฐ์ ๋๊ตฌ (F12) ์ Network ํญ์ ๋ณด๋ฉด ์กฐ๊ธ ๋ ํนํ ๊ฒ์ ๋ฐ๊ฒฌํ ์ ์๋๋ฐ, ๋ฐ๋ก ์น ์์ผ ์ฐ๊ฒฐ ๋ง๊ณ ๋ ํด๋ง ์ฐ๊ฒฐ (xhr) ์ด ์๋ค๋ ๊ฒ์ด๋ค.

์น์์ผ ์ง์ ์ํ๋ ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋๋ฌธ์, socket.IO๋ ๋จผ์ polling ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐ ์๋๋ฅผ ํด๋ณด๊ณ ,
๊ทธ๋ค์์ ์น์์ผ์ด ๊ฐ๋ฅํ๋ฉด ์น์์ผ์ผ๋ก ์ ๊ทธ๋ ์ด๋(101 ์ฝ๋) ํ๋ ๊ฒ์ด๋ค.

์น์์ผ์ ํ๋กํ ์ฝ์ ws:// ์ธ๋ฐ http๋ฅผ ์จ์ฃผ๋ ์ด์ ๊ฐ ๋ฐ๋ก ์ด๊ฒ์ด๋ค.
๋จผ์ http๋ก ์ฐ๊ฒฐํด์ ์น์์ผ ์ง์์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ , ํ์ธ๋๋ฉด ws๋ก ์ ๊ทธ๋ ์ด๋ ํด์ฃผ๋ ๋ฐฉ์์ธ ๊ฒ์ด๋ค.
๊ทธ๋์ ws ํ๋กํ ์ฝ์ด ์๋๋ผ http ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ค๋ ์ ์ด ws ๋ชจ๋๊ณผ๋ ๋ค๋ฅธ ์ ์ด๋ค.
์ฒ์๋ถํฐ ์น ์์ผ๋ง ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ํด๋ผ์ด์ธํธ์์ socket ์ต์ ์ transports: ['websocket'] ์ ๋ฃ์ด ์ ํํ ์ ์๋ค.
๋คํธ์ํฌ ํญ์ ๋ณด๋ฉด, ์๋ก ํต์ ํ๋๊ฑธ ๋ณผ ์ ์๋๋ฐ, ๋ด์ฉ์ ๋ณด๋, ์์์ ์์ผ ์ด๋ฒคํธ ํต์ ํ๋ค๊ณ ๊ฑฐ์ฐฝํ๊ฒ ์ค๋ช ์ ํ์ง๋ง, ์ค์์ ๋จ์ํ ๋ฌธ์์ด ๋ฐฐ์ด์ ๋ฐ์ ๋ฐฐ์ด ์ธ์๋ฅผ ํ์ฑํด ๊ตฌ๋ถํ๋ ์์ฃผ ๋จ์ํ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ ๊ฑธ ์ ์ ์๋ค.

์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.