ํฌ์Šค์ฝ” X ์ฝ”๋”ฉ์˜จ 7๊ธฐ 8์ฃผ์ฐจ ch2. ์›น์†Œ์ผ“

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๋ฅผ ๋ฐ›๋Š”์—ญํ•  !

 

 

 

 

 

์ˆ˜์—…์„ ๋“ค์„ ๋• ๋Œ€์ถฉ ์•Œ๊ฒ ๋‹ค ์‹ถ์—ˆ๋Š”๋ฐ

๋˜ ํ˜ผ์ž ๋ณต์Šตํ•˜๋‹ค ๋ณด๋‹ˆ

์ œ๋Œ€๋กœ ๋ชจ๋ฅด๊ฒ ๋Š” ๋А๋‚Œ..

 

๋ญ์ง€.. 

์ด ๋А๋‚Œ..

 

 

 

ํ•œ๋ฒˆ์— ์ดํ•ดํ•˜๋ฉด ๊ฐœ๋ฐœ์ž ๋ˆ„๊ฐ€ ๋ชปํ•ด~ ์‹ถ์ง€๋งŒ

์ง€๊ธˆ ๋‹น์žฅ์€.. 

๋ฌด์ง€ํ•œ ๋‚ด๊ฐ€ ์‹ซ๋‹ค !!

 

 

ํ•˜๋‹ค๋ณด๋ฉด ์ต์ˆ™ํ•ด์ง€๋Š” ๊ฑฐ ..

๋งž๊ฒ ์ง€?

 

...

๊ทธ๋ ‡๋‹ค๊ณ  ํ•˜์ž