본문 바로가기

JavaScript

Node.js 심화 1주차_2

728x90

Node.js 심화 1주차_2


선행지식

 

📌 TCP

  • 서버와 클라이언트 간 신뢰성 있는 데이터 송수신을 위해 만들어진 프로토콜
  • 연결 지향성
  • 데이터를 나눠서 보낼 수 있어 재조립 가능, 누락된 데이터를 다시 요청해 완전한 데이터를 만듦
  • 서버/클라이언트 간 연결이 된 경우 양뱡향으로 데이터를 주고 받을 수 있음
  • 데이터의 순서가 뒤바뀌는 일이 없어 안정적이며 신뢰성이 높음
  • UDP에 비해 비용이 크고 전송속도가 느림

 

📌 UDP

  • 비연결
  • 데이터를 제대로 받았는지 확인되지 않아 신뢰도가 낮음
  • 데이터를 순차적으로 보내도 다른 순서로 전달 될 수 있음
  • 데이터를 보내기만 하고 별다른 처리를 하지 않음
  • TCP에 비해 비용이 적고 전송속도가 빠름.

소켓이란?

 

📌 Socket

네트워크에서 데이터를 송수신하기 위해 반드시 거쳐야 하는 연결부

예를 들어 전기를 사용하기 위해 거쳐야하는 콘센트구멍과 비슷

 

TCP 소켓 안정적인 데이터 송수신하기 위해
UDP 소켓 빠른 전송 속도가 필요한 경우

 

📌 Packet

소켓을 통해 송수신하는 데이터 덩어리 하나가 한개의 패킷임.

쉽게 말해, 콘센트 배선에 흐르는 전기와 비슷.

 

📌  WebSocket

실시간 웹 서비스를 제공하기 위해 만들어진 Socket

실시간 공동 편집 기능, 웹 메신저 등에 사용되는 기술

새로고침하지 않아도 실해되는 기능.


socket.io 사용해보기

 

📌 socket.io 모듈 설치(Terminal)

npm init -y
npm i socket.io -S

 

📄index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <script src="https://cdn.socket.io/socket.io-3.0.1.min.js"></script>
    <title>Hello Socket.io!</title>
  </head>
  <body>
    <script>
      const socket = io("ws://localhost:3000");
      socket.on("connect", () => {
        socket.send("Hello!");
      });

      socket.on("message", (data) => {
        console.log(data);
      });
    </script>
  </body>
</html>

 

📄app.js

// app.js

const io = require("socket.io")(3000, {
  cors: {
    origin: "*",
    methods: ["GET", "POST"],
  },
});

io.on("connection", (socket) => {
  console.log("새로운 소켓이 연결됐어요!");

  socket.on("message", (data) => {
    console.log(data);
  });
});

 

소켓 연결 확인
소켓 연결 확인

 


커스텀 이벤트 핸들링 코드 추가

 

📄index.html

  <body>
    <script>
    
      socket.on("customEventName", (data) => {
        console.log(data);
      });
      
    </script>
  </body>

 

📄app.js

  io.on("connection", (socket) => {
    socket.emit("customEventName", "this is custom event data");
  });

커스텀 데이터 실행


http 모듈로 express 서버 실행

 

📌 express 모듈 설치(Terminal)

npm i express -S

 

📄app.js

const express = require("express");
const { createServer } = require("http");

const app = express();
const http = createServer(app);
const io = require('socket.io')(http, {
  cors: {
    origin: "*",
    methods: ["GET", "POST"],
  },
});

http.listen(3000, () => {
  console.log("서버가 요청을 받을 준비가 됐어요");
});

쇼핑몰 실시간 구매알림 기능

 

📄app.js

const express = require("express");
const { Server } = require("http"); // 1. 모듈 불러오기
const socketIo = require("socket.io"); // 1. 모듈 불러오기

... // 생략

const app = express();
const http = Server(app); // 2. express app을 http 서버로 감싸기
const io = socketIo(http); // 3. http 객체를 Socket.io 모듈에 넘겨서 소켓 핸들러 생성

// 4. 소켓 연결 이벤트 핸들링
io.on("connection", (sock) => {
  console.log("새로운 소켓이 연결됐어요!");

  sock.emit("BUY_GOODS", {
    nickname: "서버가 보내준 구매자 닉네임",
    goodsId: 10, // 서버가 보내준 상품 데이터 고유 ID
    goodsName: "서버가 보내준 구매자가 구매한 상품 이름",
    date: "서버가 보내준 구매 일시",
  });

  sock.on("disconnect", () => {
    console.log(sock.id, "연결이 끊어졌어요!");
  });
});

... // 생략

// 5. app 대신 http 객체로 서버 열기
http.listen(8080, () => {
  console.log("서버가 요청을 받을 준비가 됐어요");
});

network - websocket


 

📄app.js

// 4. 소켓 연결 이벤트 핸들링
io.on("connection", (sock) => {
  console.log("새로운 소켓이 연결됐어요!");

  sock.on("BUY", data => {
    console.log(data);
    const emitData = {
      nickname: data.nickname,
      goodsId: data.goodsId,
      goodsName: data.goodsName,
      date: new Date().toISOString(),
    }
    io.emit("BUY_GOODS", emitData);
  })

  sock.on("disconnect", () => {
    console.log(sock.id, "연결이 끊어졌어요!");
  });
});

서버 입장에서는 연결된 소켓 하나 하나에만 각자 접근하기 때문에 서버와 클라이언트가 1:1로 개인 채팅방을 갖는 형태가 됩니다.

'JavaScript' 카테고리의 다른 글

Node.js 심화 1주차_4  (0) 2022.12.28
Node.js 심화 1주차_3  (0) 2022.12.27
Node 숙련 개인과제 ER다이어그램  (0) 2022.12.26
Node.js 심화 1주차_1  (0) 2022.12.26
Node.js 숙련 주차 개인 과제_3  (0) 2022.12.23