May 07, 2021
21-12-03 ์ ๋ฐ์ดํธ
์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ , ์์ฒญ์ ๋ง๋ ์๋ต์ ํด์ฃผ๋ ๊ฒ. ์๋ฒ์ ๊ด๋ จ๋ ๊ฒ์ ์กฐ๊ธ์ฉ ์์๊ฐ๋ฉด์ ํธ๊ธฐ์ฌ์ด ์๊ฒผ์๋ค.
๋๊ตฐ๊ฐ์๊ฒ ์๋ต์ ๋ฐ๋๊ฒ. ๋๊ตฐ๊ฐ์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌ๋ฐ๋ ๊ฒ.
์นด์นด์คํก์ด๋ค?
๋จ์ํ ์๊ฐํด๋ณด๋ฉด ๋ด๊ฐ ๋ณด๋ธ ๋ฉ์์ง๋ฅผ ์๋ฒ์์ ์ ์ฅํ๊ณ , ๋๊ตฐ๊ฐ์๊ฒ ๋๋ ค์ค๋ค๋ฉด ๊ทธ๊ฒ์ด ์ฑํ ์ด ์๋๊น? ๋ผ๋ ์๊ฐ์ ํ๊ฒ ๋์๋ค.
ํ์ง๋ง, ํฐ ๋ฌธ์ ๊ฐ ์์๋ค.
์ฐ๋ฆฌ๊ฐ ํํ ์ฌ์ฉํ๋ HTTP ๋ฐฉ์์ ๋ด๊ฐ ์์ฒญ์ ๋ณด๋์ ๋, ๊ทธ๊ฒ์ ๋ง๋ ์๋ต๋ง ์๋ฒ์์ ๋๋ ค์ค๋ค.
์ฆ, ์๋ฒ๊ฐ ์์ฒญ์์ด ์ค์ค๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํ๋๊ฒฝ์ฐ๋ ์กด์ฌํ์ง ์๋๋ค.
์ฌ์ค ์ฑํ ์ด๋๊ฒ์ด ๋ด๊ฐ ์๋ฌด๋ฐ ์์ฒญ์ ํ์ง ์์๋, ์๋๋ฐฉ์ด ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ฒ๋๋ค๋ฉด, ์๋ฒ์์ ๊ทธ ๋ฉ์์ง๋ฅผ ๋์๊ฒ ๋๋ ค์ค์ผํ๋ค.
๋ง์น ์ค์๊ฐ ํต์ ์ ํ๋ ๊ฒ์ฒ๋ผ
๋๊ฐ์ ํ๋ก๊ทธ๋จ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๊ฒ.
ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๊ฒ.
http
ํต์ ์ด๋ ๊ฐ์๋ณด์ด์ง๋ง, ํด๋ผ์ด์ธํธ ์์ฒญ์ด ์ ๋ฌ๋์ด์ผ๋ง ์๋ฒ๊ฐ ์๋ต์ ํ๋ ์๋์ ์ธ ๊ฒ์ด ์๋, ์๋ฒ์์๋ ๋ฅ๋์ ์ผ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ๋ฌด์ธ๊ฐ๋ฅผ ์ ๋ฌํ ์ ์์.
๋ ธ๋ง๋์ฝ๋ ์์์์๋, ์์ฒญ์ ์ ๋ฌํ๊ณ ์์ ํ์์ ๋ ์ฐ๊ฒฐ์ด ๋๊ธฐ๋๊ฒ์ด ์๋ ์ฒซ
connection
์ ํตํด ์ฐ๊ฒฐ ์ํ๋ฅผ ์ ์งํ๊ณ ์๋ก ๊ตํํ๋ค๊ณ ์๊ธฐํ์ฌ.
์๋ฐฉํฅ ํต์ ์ด ๊ฐ๋ฅํจ. ์์์ ์ค๋ช ๋ ํน์ง
์ค์๊ฐ ๋คํธ์ํน ์ฑํ , ์ฃผ์๊ณผ ๊ฐ์ด ์ ํด์ง ์๊ฐ์ด ์๋ ๋๋คํ ์๊ฐ์ ๋ฐ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ง๋ค ํด๋ผ์ด์ธํธ์ ๋ฐ์์ด ๋๋ ๊ฒ์ด ๊ฐ๋ฅํจ
WebSocket
์ด์ , ์์ ์๋ฐฉํฅ ํต์ , ์ค์๊ฐ ๋คํธ์ํน์ด๋ผ๋ ํน์ง์ด ํ์ํ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ํจ.
์ผ์ ์ฃผ๊ธฐ๋ง๋ค ํด๋ผ์ด์ธํธ์์ ์๋ฒ์์ผ๋ก ์์ฒญ์ ์ก์ ํจ. ํ์ง๋ง, ์ฑํ ๊ณผ ๊ฐ์ ํ๋ก๊ทธ๋จ์์ ์ ํด์ง ์๊ฐ์ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ํ์ฑ๋๋๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์, ๋ถํ์ํ ์์ฒญ์ด ์๊ธธ์ ์๊ณ , ์ค์๊ฐ์ด๋ผ๊ณ ํ๊ธฐ์ ์ ๋งคํจ.
์ ํด์ง ์๊ฐ์ ์์ฒญ์ ๋ณด๋ด์ด ๋ถํ์ํ ์์ฒญ์ด ๋ฐ์ํ๊ฑฐ๋, ๋ณ๊ฒฝ๋ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์๊ธฐ์๋ง์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ผ ์ ์๋ค๋ ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด์ ์ฒ์ ์๋ฒ์ ์์ฒญ์ด ์ ๋ฌ๋์์ ๋, ๋ณํ๊ฐ ์๊ธธ๋๊น์ง ๋๊ธฐํ๋ค๊ฐ ์๊ธฐ๋ฉด ํด๋ผ์ด์ธํธ๋ก ์๋ต.
์ด์ฐ๋์๋ , ๋ง์ ์์ ๋ฉ์์ง๊ฐ ๋ฐ์ํ๋ค๋ฉด ๊ทธ ์ฃผ๊ธฐ๊ฐ ์งง์์ง๋ฉด์
Polling
๊ณผ ๋ค๋ฅผ๊ฒ์ด ์๊ฒ๋๋ค ํจ.
์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ ์ฐ๊ฒฐ์ ๋์ง ์์ ์ํ์์ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ํด์ ๋ฐ์์ด.
ํด๋ผ์ด์ธํธ์๊ฒ ์์์ ๋ณด๋ฅผ ๋ณด๋ด๋๊ฒ์ด ๋ํ์ ์ด๋ผ๊ณ ํจ.
์๋ง ์ ํ๋ธ, ํธ์์น์ ๊ฐ์ ์ธํฐ๋ท ๋ฐฉ์ก ํ๋ซํผ์์ ์ด์๊ฐ์ ํน์ง์ด ์ด์ฉ๋๋๊ฒ์ด ์๋๊น ์๊ฐํด๋ด
๋ค๋ง ์ฒ์ ํด๋ผ์ด์ธํธ์์ ์์ฒญ์ด ์ ๋ฌ๋ ์ดํ์๋ ๋ณ๋ค๋ฅธ ์์ฒญ์์ด ์ฐ๊ฒฐ๋ ์ํ๋ก ์๋ฒ์์ ํด๋ผ์ด์ธํธ์์ ์กฐ๊ธ์ฉ ๊ณ์ํด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ฐ์ดํฐ์ก์ ์ด ์ด๋ ต๋ค๊ณ ํจ.
๊ทธ๋์ ํด๋ผ์ด์ธํธ์์ผ๋ก ์์์ ์๊ฐ ๋๋์ด์ ์ ์กํ๋๋ฐ์ ์ฃผ๋ก ์ฐ์ด๋๊ฒ ๊ฐ์.
๋ชจ๋ ๊ณตํต์ ์ผ๋ก HTTP
ํต์ ์ ์ฌ์ฉํ๋ ํ๊ฒฝ์์ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ, ์ค์๊ฐ์ ๋ชฉ์ ์ผ๋ก ์ฃผ๊ณ ๋ฐ์์ผ ํ๋ค๋ณด๋ ๊ท๋ชจ๊ฐ ํฐ header
๊ฐ ์์ฃผ ๊ตํ๋๋ ์ํฉ์ด๋ผ๊ณ ํ๋ค.
WebSocket
๋ ์ผ๋ฐ ์๋ฒ์์ ํต์ ์น๋ผ ํธ๋์์ดํน์ ๊ณผ์ ์ ๊ฑฐ์น๋ค๊ณ ํจ
ํธ๋์์ดํน. ์ฒ์๋ณด์ง๋ง ๋๋ต์ ์ผ๋ก ์๋ฏธ๋ฅผ ์์๋ณด๋, ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ์ฐ๊ฒฐ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ฒ์์๋ ์ฐ๊ฒฐ ์๋ต์ ํด๋ผ์ด์ธํธ์ ๋ณด๋ด์ด์ ์๋ก์ ์ฐ๊ฒฐ ๊ณผ์ ์ ํธ๋์์ดํน์ด๋ผ๊ณ ํ๋๊ฒ ๊ฐ๋ค. ๋ ์์๋ณด์.
http(80)
, https(443)
ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ์๋ฒ์ ์์ฒญ์ ์ ๋ฌํ๋๋ฐ, ํต์ฌ header
์์ฑ๋ค์ด ์๋ค๊ณ ํ๋ค.
// GET /chat
const header = {
Host: javascript.info
Origin: https://javascript.info
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Key: Iv8io/9s+lYFgZWcXczP8Q==
Sec-WebSocket-Version: 13
}
Origin
: webSocket
์ฐ๊ฒฐ์ ํ ํด๋ผ์ด์ธํธ ์ฃผ์
Connection
: ํด๋ผ์ด์ธํธ ์ธก์์ ํ๋กํ ์ฝ์ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ ์์ฒญ
Upgrade
: ํด๋ผ์ด์ธํธ ์ธก์์ ๋ณ๊ฒฝํ๊ณ ์ถ์ ํ๋กํ ์ฝ
Sec-WebSocket-Key
: ์ฐ๊ฒฐ๋๋ ํ๋กํ ์ฝ์ ๋ณด์์ ์ํ ํค
์ด๋ ๊ฒ ์ ์ก์ด ๋๋ฉด ์๋ฒ์์๋ webSocket
์ด ์ฐ๊ฒฐ๋์๋ค๋ ์๋ต์ ํด๋ผ์ด์ธํธ๋ก ์ ์กํ๋ค.
์ด ์ดํ์๋ http
ํ๋กํ ์ฝ์ด ์๋ ws80
ํน์ wss(443)
ํ๋กํ ์ฝ์ด ์ ์ฉ๋๋ค๊ณ ํ๋ค.
wss
๋https
์ฒ๋ผSSL
๋ณด์ ์ธ์ฆ์ด ์ ์ฉ๋ ํ๋กํ ์ฝ์ด๋ผ๊ณ ํจ
webSocket
ํ๋กํ ์ฝ๋ก ์ฐ๊ฒฐ๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ตฌ์กฐ๋ฅผ webSocket frame
๋ผ๊ณ ํ๋ค.
frame
์ header
์ payload
๋ก ๊ตฌ์ฑ๋์ด์๋ค๊ณ ํจ.
์ ๋ฌ๋๋ frame
์ ํฌ๊ธฐ์ ๋ฐ๋ผ frame header
๊ฐ ๋ค๋ฅธ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ค๋๊ฒ ๊ฐ๋ค.
header
์ OPCODE
๋ฅผ ํตํด ํด๋น frame
์ด ํ
์คํธ ํ๋ ์์ธ์ง, ์ด์ง ๋ฐ์ดํฐ ํ๋ ์์ธ์ง ์๋๋ฉด webSocket
์ปค๋ฅ์
์ ์ข
๋ฃํ๋ ํ๋ ์์ธ์ง ๊ตฌ๋ถํ๋ค๊ณ ํจ.
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ค๋ ๊ฒ๋ค๋ง์ ๊ณจ๋ผ๋ด..
์ดํ์ ํจ๊ป ์ ๋ฌ๋ UTF-8
ํ์์ payload
๋ฅผ ์์๋ณผ์ ์๋ ์ผ๋ฐ ํ
์คํธ๋ก ๋์ฝ๋ฉํ๋๊ฒ ๊ฐ๋ค
http
ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ํธ๋์์ดํน์ ํ๊ธฐ ์ํด ํ๋ฒ๋ง http header
๋ฅผ ์ฌ์ฉํ๋ค.http
, https
ํ๋กํ ์ฝ์ ์ฌ์ฉํจwebSocket
์ฐ๊ฒฐ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๋ ๊ตฌ์กฐ๋ webSocket frame
์ ์ฌ์ฉํจHTML5
๋ถํฐ ์๊ฐ๋ ๊ธฐ์ ๋ก ์ด์ ์ ๋ฒ์ ์์๋ ํธํ๋์ง ์๋ ์ํฉ์ด ๋ฐ์ํจ.
Socket.io
, SockJS
์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ webSocket
์ ํธํํ์ง ๋ชปํ๋ ๋ฒ์ ์์ ํน์ง์ธ ์ค์๊ฐ ์น์ ๊ตฌํํ๋๋ก ๋์์ค
๋ธ๋ผ์ฐ์ ์ ์น ์๋ฒ์ ์ข ๋ฅ, ๋ฒ์ ์ ํ์ ํ์ฌ ์ ํฉํ ๊ธฐ์ ์ ์ ํํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ์
Web Socket
์ HTML5
์ ๊ธฐ์ ์ด๊ธฐ ๋๋ฌธ์, ์ค๋๋ ๋ฒ์ ์ ์น ๋ธ๋ผ์ฐ์ ์์๋ Web Socket
์ ์ง์ํ์ง ์๋๋ค๊ณ ํ๋ค.
๋ํ์ ์ธ
IE
.. ์์ฆIE
์ ๋ํ ์ง์์ด ๋๋ถ๋ถ ๋๊ธฐ๊ณ ์๋ค๋ผ๋ ์นด๋๋ผ ํต์ (feat Youtube)
์ด์ฒ๋ผ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํด ์๊ธด๊ฒ์ด Socket.io
๋ผ๊ณ ํ๋ค.
Socket.io
๋ Node.js
๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ๊ธฐ์ ๋ก, ๊ฑฐ์ ๋ชจ๋ ์น๋ธ๋ผ์ฐ์ ์ ๋ชจ๋ฐ์ผ ์ฅ์น๋ฅผ ์ง์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ณ ํ๋ค.
๋ง์ฝ, Web Socket
์ ์ง์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ผ๋ฉด ํด๋น ๊ธฐ์ ์ ์ฌ์ฉํ๊ณ , ๊ทธ๋ ์ง ์์ ๋ธ๋ผ์ฐ์ ๋ผ๋ฉด ๊ธฐ์กด์ HTTP
๋ฅผ ์ด์ฉํด์ ํ๋ด๋ฅผ ๋ธ๋ค๊ณ ํ๋ค.
์ด๋ป๊ฒ ํ๋ด๋ฅผ ๋ด๋๊ฑฐ์ง..?
Socket.io
๋ ๊ณต์์ฌ์ดํธ์์ ๊ฐ๋จํ ์์ ๋ฅผ ํตํด ์ฒดํํด ๋ณผ ์ ์๋ ์ฝ๋์, ๊ฐ์ขAPI
๋ฅผ ์ ๋ฆฌํด๋์ ๋ฌธ์๊ฐ ์์ผ๋ ํ๋ฒ ๊ฐ๋ณด๋๊ฒ ์ข์๋ฏ ํ๋ค! - ์๋ ์ฐธ๊ณ ํ์ธ
๊ณต์ ์ฌ์ดํธ์ ๋์์๋ ๊ฐ๋จํ ์ฑํ ์ฌ์ดํธ๋ฅผ ๊ตฌํํด๋ณธ ๊ฒฝํ์ด๋ค.
ํ์ธํด๋ณด๊ณ ์ถ์ ํน์ ์ํฉ๋ค์ด ์์ด, ์ด์ง ์์ ํ์๋ค.
๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ
const path = require('path')
const express = require('express')
const app = express()
const http = require('http')
const server = http.createServer(app)
const port = 3000
const { Server } = require('socket.io')
const io = new Server(server)
const basePath = path.join(__dirname, '..', '/')
app.get('/', (req, res) => {
res.sendFile(basePath + 'public/index.html')
})
app.get('/room', (req, res) => {
res.sendFile(basePath + 'public/room.html')
})
io.on('connection', socket => {
// ์ํท ์ฐ๊ฒฐ
console.log('Socket Connected')
// ์
์ฅ ๊ฐ์งยท๋ฐํ
socket.on('join', name => {
// ๋๋ฅผ ์ ์ธํ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ ๋ฌ - broadcast.emit
// socket.broadcast.emit("join", name);
// ๋๋ฅผ ํฌํจํ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ ๋ฌ - emit
io.emit('join', name)
})
// ํด์ฅ ๊ฐ์งยท๋ฐํ
// ํ์ฌ ์ ์ํ ๊ณณ์ด ์ฑํ
๋ฐฉ์ด์ฌ์, ํด์ฅํ๋ฉด ์ํท ์ข
๋ฃ์ํด
socket.on('leave', name => {
io.emit('leave', name)
// socket.broadcast.emit("leave", name);
socket.disconnect(true)
})
// ์ฑํ
๊ฐ์งยท๋ฐํ
socket.on('chat', msg => {
io.emit('chat', msg)
})
// ์ํท ์ข
๋ฃ
socket.on('disconnect', () => {
console.log('Socket Disconnected ')
})
})
server.listen(port, () => {
console.log(`Server is connected on ${port}`)
})
.on
์ด๋ผ๋ API
๊ฐ ํด๋ผ์ด์ธํธ Socket
์์์ ์์ฒญ์ ์๋ฒ์ Socket
์์ ๋ฐ์ ๋ ์ฌ์ฉํ๋๊ฒ ๊ฐ๋ค..emit
์ .on
๊ณผ ๋ฐ๋๋ก, ์๋ฒ์ Socket
์์ ํด๋ผ์ด์ธํธ์ Socket
์ผ๋ก ๋ณด๋ด์ฃผ๋ ์ญํ์ ํ๋ค.connection
, disconnect
์ ๊ฐ์ด Socket
์์ ์ ํ ๋ค์ด๋ฐ๋
์์ง๋ง, join
, leave
์ ๊ฐ์๊ฒ์ ์ปค์คํ
ํ ๋ค์ด๋ฐ์ด๋ค.
์ปค์คํ ์ด๋ฒคํธ์ฒ๋ผ ์ด ๋ค์ด๋ฐ์ด ์ดํ์ ์ฝ๋ฐฑํจ์๋ฅผ ์คํํ๋ ์ด๋ฒคํธ ํค๋ผ๊ณ ๋ณด๋๊ฒ ์ข์๋ฏ ํ๋ค.
Socket
์ ์ ์ํ๋ฉด ๋ฐ๋ก ์ฑํ
์ ์ฐธ์ฌํ๋๊ตฌ์กฐ์ด์ง๋ง, Room
์ด๋ผ๋ ๊ฐ๋
๊ณผ .to
API
๋ฅผ ํตํด ์ํธ์์ฉ์๋ํ ๊ฒ์ ๊ตฌ๋ถ์ง์์? ์๋๊ฒ ๊ฐ์๋ค.
์ผ์ข ์ ์นด์นด์คํก ๋ํ๋ฐฉ ๊ฐ์?
<a href="room">๋ฐฉ์ผ๋ก ์ด๋</a>
connection
์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ์ถ์ด, Socket
์ด ์คํ๋๋ ๊ฒฝ๋ก๋ฅผ ๊ตฌ๋ถ์ง์ด๋๊ธฐ ์ํด ์ถ๊ฐํ์๋ค.
๋ณ ์๋ฏธ๋ ์์..
// Socket CDN
<script src="/socket.io/socket.io.js"></script>
// html
<div class="bar">
<button id="out">Out</button>
</div>
<div id="messages"></div>
<form id="form" class="bar" action="">
<input id="input" autocomplete="off" /><button>Send</button>
</form>
// script
const form = document.querySelector("#form");
const input = document.querySelector("#input");
const messages = document.querySelector("#messages");
const out = document.querySelector("#out");
const name = "์๋ฏผ";
// ์ํท ์ฐ๊ฒฐ
const socket = io();
// ๋์ ์
์ฅ์ ๋ชจ๋์๊ฒ ์๋ฆผ
socket.emit("join", name);
// ๋๊ตฐ๊ฐ ์
์ฅํ์ ๋ ์๋ฆผ ๋ฐ์
socket.on("join", name => {
recordChat(`${name} ๋์ด ์
์ฅํ์
จ์ต๋๋ค.`);
});
// ์ฑํ
์
๋ ฅ
form.addEventListener("submit", e => {
e.preventDefault();
if (input.value) {
socket.emit("chat", { name, msg: input.value });
input.value = "";
}
});
// ๋๊ตฐ๊ฐ์ ์ฑํ
๋ฐ์์ด
socket.on("chat", ({ name, msg }) => {
recordChat(`${name} : ${msg}`);
});
// ๋ด๊ฐ ๋ ๋๊ธฐ ์ํ ๋ฒํผ
out.addEventListener("click", e => {
e.preventDefault();
socket.emit("leave", name);
});
// ๋๊ตฐ๊ฐ ๋ ๋ฌ์ ๋ ์๋ฆผ ๋ฐ์์ด
socket.on("leave", name => {
recordChat(`${name} ๋์ด ํด์ฅํ์
จ์ต๋๋ค.`);
});
function recordChat(msg) {
const item = document.createElement("p");
item.textContent = msg;
messages.appendChild(item);
window.scrollTo(0, document.body.scrollHeight);
}
Socket
๊ณผ ๋์ผํ๊ฒ, on
์ผ๋ก ํน์ ์ด๋ฒคํธ ํค์ ๋ํ ๊ฐ์ง๋ฅผ ํ๊ณ , .emit
์ผ๋ก ํน์ ์ด๋ฒคํธ ํค์ ๋ํ ์์ฒญ์ ๋ณด๋ธ๋ค.const socket = io();
์ด ๋ถ๋ถ์์, url
์ ์ธ์๋ก ๋ณด๋ด ๋์ผ ํฌํธ๊ฐ ์๋ ๋ค๋ฅธ ํฌํธ๋ก ์์ฒญ์ ๋ณด๋ผ ์ ๋ ์๋๊ฒ ๊ฐ์๋ค.
๋ฌผ๋ก , ์๋ฒ์์
cors
์ ๊ด๋ จ๋์ด ํ์ฉ ์ฃผ์๋ก ์ง์ ํด์ค์ผ ํจ.
Socket
์ ์ ์ํ๋๋ก ๋์ด์์ง๋ง, ํ์์ ๋ฐ๋ผ ์ฌ์ฉ์๊ฐ ์ํ ๋ connect
๋ฅผ ํ ์ ์๋๋ก ํ ์ ์๋ค๊ณ ํ๋ค.index.html
๋ก ๋์๊ฐ์ง๋ง, ํด์ฅํ๋ค๋ ๋ฌธ๊ตฌ๊ฐ ์ ๋จ๋์ง ํ์ธํ๊ธฐ ์ํด ์ด๋ํ์ง ์์๋ค.room.html
๋ก ์ด๋ํ์์ ๋, Socket Connected
๊ฐ ์๋ฒ์์ ํธ์ถ๋๊ณ , ํด๋ผ์ด์ธํธ์์ ๋๊ฐ๊ธฐ๋ฅผ ๋๋ ์ ๋, ์๋ฒ์์ Socket Disconnected
๊ฐ ํธ์ถ๋๋ค.Socket Disconnected
๊ฐ ํธ์ถ๋ ๋ค๋ก๋ ํด๋ผ์ด์ธํธ์์ ๋ฌด์จ ์ฑํ
์ ์ฒ๋ ์๋ฌด๋ฐ ๋ณํ๊ฐ ์๋ค.์ ๋ง ์ฌ๋ฏธ์๋๊ฒ ๊ฐ๋ค. ์นด์นด์คํก์ด๋ ๋น์ ๋ฅผ ํด๋ณธ๋ค๋ฉด
์นด์นด์คํก ๋ก๊ทธ์ธ - Socket Connect
๋ํ๋ฐฉ - Socket Room
DB
๋ก ์ ์ฅํ๊ณ , ํด๋น ๋ฐฉ์ ์
์ฅํ์ ๋ ๊ธฐ๋ก์ ๋ถ๋ฌ์ค๋ ๋ฐฉ์id
์ ๋ํ๋ฐฉ์ ์ฌ์ฉํ๊ณ ์๋ ์ฌ๋์ ์ฑํ
)๋ฅผ ์๋ฒ์์๋ .emit
์ผ๋ก ๋ณด๋ด๊ณ , ํด๋ผ์ด์ธํธ์์๋ .on
์ผ๋ก ๊ฐ์งํจ
๋ง์ฝ
React
๋ผ๋ฉด,.on
์ผ๋ก ๋ฐ์์จ ํ์๋ฅผ ์นด์ดํ ํ์ฌ ๋์ ๋ ์๋ก์ด ๋ฉ์์ง ๊ฐฏ์ ์ถ๋ ฅ? ๊ฐ์ฅ ์ต์ ์ ๋ํ๋งthumbnail
๋ก ๋ ธ์ถ
์นด์นด์คํก ๋ก๊ทธ์์ - Socket disConnect
์ด๋ฐ ๋๋์ด์ง ์์๊น..?
๊ฑด๋ฐฉ์ง๊ฒ ๊ฐํ ์์์ ํด๋ณด์๋ค.