2023. 6. 18. 22:59ใStudy_Develop/ํฌ์ค์ฝ X ์ฝ๋ฉ์จ ๋ถํธ์บ ํ
์์ ์ ๋ฃ๊ธฐ ์ ์๋
์ฑํ ์ฑ์ ๋ง๋๋ ๊ฒ์ด ๋๊ฒ ์ด๋ ค์ด ์์ ์ด๋ผ๊ณ ์๊ฐํ๋๋ฐ!
socket.io๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋
์๊ฐ๋ณด๋ค ์ด๋ ค์ด ์์ ์ด ์๋๋ผ์
์ ๊ธฐํ๋ค!
๊ทธ๋์ ์ฌ๋ฏธ๋๊ฒ ์์ ์ ๋ค์๋ค
ใ ใ ๐
๊ทธ๋ฌํ๋ฉด ๋ฐฐ์ด ๋ด์ฉ ๋ณต์ต์ ํด๋ณด์ !
์์ผ ์ด๋?
ํ๊ต ์ ๊ณต์์ ์ค์ ๋ฐฐ์ด ์ฉ์ด๊ฐ ๋์
์กฐ๊ธ์ ๋ฐ๊ฐ์ ๋ค
๊ทธ๋๋ ๋ ์ ๊ณต์๊ตฌ๋~ ใ ใ
(๊ทผ๋ฐ ์ฌ์ค ๊ธฐ์ต์ ์ ์๋จ,,)
์์ผ ! (Socket)
- ํ๋ก์ธ์ค๊ฐ ๋คํธ์ํฌ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ด๊ฑฐ๋
๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ธฐ ์ํ ์ค์ ์ ์ธ ์ฐฝ๊ตฌ์ญํ ์ ํ๋ ๊ฒ
- ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ๋๊ตฌ๋ก์จ
์ธํฐํ์ด์ค ์ญํ ์ ํ๋ ๊ฒ
- ์์ผ์ ํ๋กํ ์ฝ, ip์ฃผ์, ํฌํธ ๋๋ฒ๋ก ์ ์๋๋ค
Socket.io
WebSocket์ด๋?
- ์๋ฐฉํฅ ์ํต์ ์ํ ํ๋กํ ์ฝ (์ฝ์)
- html5 ์น ํ์ค ๊ธฐ์
- ๋น ๋ฅด๊ฒ ์๋ํ๋ฉฐ ํต์ ํ ๋ ์์ฃผ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ๋ค.
- ์ด๋ฒคํธ๋ฅผ ๋จ์ํ ๋ฃ๊ณ , ๋ณด๋ด๋ ๊ฒ๋ง ๊ฐ๋ฅํ๋ค.
Socket vs WebSocket ?
์์ผ์ ๋ค์ํ ํ๋กํ ์ฝ์์ ๋ฒ์ฉ ํต์ ์ฑ๋์ ์ ๊ณตํ๋ค.
WebSocket์ ์ค์๊ฐ ์น ์์ฉ ํ๋ก๊ทธ๋จ์ฉ์ผ๋ก ํน๋ณํ ์ค๊ณ๋์ด
๊ฐ์ํ๋ ํ๋กํ ์ฝ์ ํตํด ์๋ํ๊ณ ์๋ช ์ด ๊ธด ๋จ์ผ ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ค.
Socket.io๋?
- ์๋ฐฉํฅ ํต์ ์ ํ๊ธฐ ์ํด ์น ์์ผ ๊ธฐ์ ์ ํ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ํ์ค์ด ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ!
- ๋ฐฉ ๊ฐ๋ ์ ์ด์ฉํด ์ผ๋ถ ํด๋ผ์ด์ธํธ์๊ฒ๋ง
๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ธ๋ก๋ ์บ์คํ ์ด ๊ฐ๋ฅํ๋ค
- ์น ์์ผ์ ๊ธฐ๋ฐ์ผ๋ก ์ค์๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ
js๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์น ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ค์๊ฐ ์๋ฐฉํฅ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ํจํค์ง
- ์ฌ๋ฌ๊ฐ์ง ๋ฉ์๋ ๋ค์ ์ ๊ณตํด์ค๋ค
emit(๋ณด๋ด๋ค), on(๋ฐ๋ค), join(๋ค์ด๊ฐ๋ค), leae(๋๊ฐ๋ค),
room(๋ฐฉ์ ๋ง๋ค์ด room์ ๋ค์ด์๋ ์์ผ๋ผ๋ฆฌ ํต์ ํ ์ ์๊ฒ ํด์ค๋ค) ๋ฑ๋ฑ
Socket IO์ด๋ฒคํธ ํต์
์์ผ io์ ๋ฉ์๋์ ํน์ง์ ํด๋ผ์ด์ธํธ์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ ๊ฐ๋ฐ์๊ฐ ์์๋ก ์ค์ ํ ์ ์๋ค
// ํด๋น ์ด๋ฒคํธ๋ฅผ ๋ฐ๊ณ ์ฝ๋ฐฑํจ์๋ฅผ ์คํ
socket.on('๋ฐ์ ์ด๋ฒคํธ ๋ช
', (msg) => {
})
// ์ด๋ฒคํธ ๋ช
์ ์ง์ ํ๊ณ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ธ๋ค.
socket.emit('์ ์กํ ์ด๋ฒคํธ ๋ช
', msg)
์ด๋ฐ ์์ผ๋ก ๋ฉ์ธ์ง ๋ง๋ค ๊ณ ์ ํ ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํด ๊ตฌ๋ณํด์ ์ก์์ ํ๋ฉด,
์ฑํ ๋ฐฉ์์ '๊ท์๋ง' ๊ธฐ๋ฅ์ฒ๋ผ
ํน์ ์ด๋ ์ฌ๋ํํ ๋ง ๋ฉ์ธ์ง๋ฅผ ์ก์ ํ๋ค๋ ๋ฑ์
๋ค์ํ ํต์ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค.
socket.io ์ฌ์ฉ๋ฒ
์ค์นํ๊ธฐ!
npm install socket.io
์์ ๊ฐ์
cannot find module 'socket.io' ์๋ฌ๊ฐ ๋ฌ๋ค๋ฉด?
ํด๊ฒฐ๋ฐฉ๋ฒ>
npm link socket.io
์คํ jsํ์ผ๊ณผ ๋์ผ์ ์์
node_modules๋ฅผ ํฌํจํ ๋งํฌ๋ฅผ ๋ง๋ค์ด์ฃผ์ด์ผ ํ๋ค.
index.js>
const SocketIO = require("socket.io");
const io = SocketIO(server);
io.on("connection", (socket) => {
console.log("socketId: ", socket.id);
socket.on("chat", (value, room, call) => {
console.log(value);
socket.to(room).emit("new_chat", value.msg);
call();
});
socket.on("room", (value, call) => {
socket.join(value.msg);
call();
socket.to(value.msg).emit("Welcome", nickArray[nickArray.length - 1]);
});
socket.on("nick", (value) => {
nickArray.push(value);
console.log(nickArray);
});
- io.on("commection", (socket)=>{ ... }
์ด ๋ถ๋ถ์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ฐ๊ฒฐ ๋ ๋ ๋ง๋ค ์คํ๋๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ
- socket.on("chat", (value, room, call) => {...} ํด๋ผ์ด์ธํธ๊ฐ
chat์ด๋ฒคํธ๋ฅผ ์ ์กํ ๋ ์คํ๋๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ
value ๋ ํด๋ผ์ด์ธํธ์์ ์ ์ก๋ ๋ฐ์ดํฐ
room์ ์ฑํ ์ด ์ ์ก๋ ๋ฐฉ,
call์ ํด๋ผ์ด์ธํธ๋ก ๋ถํฐ ์ ๋ฌ๋ ์ฝ๋ฐฑํจ์
- socket.on("room", (value, call) => { ...} :
ํด๋ผ์ด์ธํธ๊ฐ 'room'์ด๋ฒคํธ๋ฅผ ์ ์กํ ๋ ์คํ๋๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ
value๋ ํด๋ผ์ด์ธํธ์์ ์ ์ก๋ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ธ๋ค
- socket.join(value.msg): ํด๋ผ์ด์ธํธ๋ฅผ value.msg๋ก ์ง์ ๋ ๋ฐฉ์ ์ฐธ์ฌ
- socket.to(value.msg).emit("Welcome", nickArray[nickArray.length - 1]);
: ํด๋น ๋ฐฉ์ ์ํ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ์๊ฒ
welcome์ด๋ฒคํธ๋ฅผ ์ ์กํ์ฌ
๋ฐฉ์ ์๋ก ์ฐธ์ฌํ ํด๋ผ์ด์ธํธ๋ฅผ ํ์,
nickArray ๋ ๋๋ค์์ ์ ์ฅํ๋ ๋ฐฐ์ด๋ก,
nickArray[nickArray.length-1]์ ์ต๊ทผ์ ์ถ๊ฐ๋ ๋๋ค์์ ๋ํ๋ธ๋ค
- socket.on("nick", (value) => { .. }
: ํด๋ผ์ด์ธํธ๊ฐ nick์ด๋ฒคํธ๋ฅผ ์ ์กํ ๋ ์คํ๋๋ ์ด๋ฒคํธ ํธ๋ค์ด
value๋ ํด๋ผ์ด์ธํธ์์ ์ ์ก๋ ๋๋ค์์ ๋ํ๋ธ๋ค.
- nickArray.push(value): nickArray
: ๋ฐฐ์ด์ ํด๋ผ์ด์ธํธ์ ๋๋ค์์ ์ถ๊ฐ
views/index.ejs>
์ผ๋ถ๋ง!
socket.on("new_chat", (message) => {
const li = document.createElement("li");
const nick = document.querySelector("#nick");
li.textContent = `${message}`;
ul.append(li);
});
- ํด๋น ์ฝ๋๋ new_chat์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์คํ๋๋ ์ฝ๋ฐฑ ํจ์์ด๋ค!
- ์๋ก์ด ์ฑํ ๋ฉ์์ง๊ฐ ๋์ฐฉํ๋ฉด ํด๋น ๋ฉ์์ง๋ฅผ ๊ฐ์ง
li ์์๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ ์ฑํ ๋ชฉ๋ก ul์ ์ถ๊ฐํ๋ ์ญํ ์ ํ๋ค.
์์ 2.
index.js>
//data๋ฅผ ๋ณด๋ด์ฃผ๋ ์ญํ
io.on("connection", (socket) => {
socket.on("chatting", (data) => {
const { name, msg } = data;
io.emit("chatting", {
name,
msg,
time: moment(new Date()).format("h:ss A"),
});
});
});
- ์ฑํ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ฐ๊ฒฐ๋ ํด๋ผ์ด์ธํธ์
๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ธฐ ์ํ ์๋ฒ ์ธก ์ฝ๋์ด๋ค.
- connenction์ด๋ฒคํธ์ ๋ํ socket.io์ด๋ฒคํธ ํธ๋ค๋ฌ ์ค์
- socket.on("chatting", (data) =>{ ... } :
connection์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด์์ ์ด ์ฝ๋๋
chatting ์ด๋ฒคํธ์ ๋ํ ๋ค๋ฅธ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ค์ ํ๋ค.
- io.emit("chatting", { ... }) :
์์ ๋ ๋ฐ์ดํฐ์์ name๊ณผ msg๋ฅผ ์ถ์ถํ ํ ์๋ฒ๋io๋ฅผ ์ฌ์ฉํ์ฌ
์ฐ๊ฒฐ๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ์๊ฒ chatting์ด๋ฒคํธ๋ฅผ ๋ณด๋ธ๋ค.
- time: moment(new Date()).format("h:ss A"):
์ : ์ด AM/PMํ์์ผ๋ก ํ์ฌ ์๊ฐ์ ์ ๊ณตํ๋ค.
์๋ฅผ ๋ค์ด, 10์ 30๋ถ 45์ด ์ด๋ฉด ๊ฒฐ๊ณผ๋
์ค์ 10์ 30๋ถ์ด๋ค.
index.ejs>
socket.on("chatting", (data) => {
const { name, msg, time } = data;
const item = new LiModel(name, msg, time);
item.makeLi();
displayContainer.scrollTo(0, displayContainer.scrollHeight);
});
data๋ฅผ ๋ฐ๋์ญํ !
์์ ์ ๋ค์ ๋ ๋์ถฉ ์๊ฒ ๋ค ์ถ์๋๋ฐ
๋ ํผ์ ๋ณต์ตํ๋ค ๋ณด๋
์ ๋๋ก ๋ชจ๋ฅด๊ฒ ๋ ๋๋..
๋ญ์ง..
์ด ๋๋..

ํ๋ฒ์ ์ดํดํ๋ฉด ๊ฐ๋ฐ์ ๋๊ฐ ๋ชปํด~ ์ถ์ง๋ง
์ง๊ธ ๋น์ฅ์..
๋ฌด์งํ ๋ด๊ฐ ์ซ๋ค !!

ํ๋ค๋ณด๋ฉด ์ต์ํด์ง๋ ๊ฑฐ ..
๋ง๊ฒ ์ง?
...
๊ทธ๋ ๋ค๊ณ ํ์