1초당 10장씩 이미지를 보여줘야하는 기능을 구현하는 과정에서 웹 소켓을 적용하였습니다.
해당 기능을 구현하면서 공부한 과정/문제/해결 과정을 정리하고자 작성했습니다.
웹 소켓은 하나의 TCP 접속에 전이중 통신 채널을 제공하는 통신 프로토콜입니다.
장점
단점
웹 소켓을 사용하는 프로토콜에는 2가지 방법이 있습니다.
ws://
wss://
http
, https
와 같이 보안/신뢰성에서 차이가 나는 프로토콜 종류입니다.
노드에서 사용하기 위해서 socket.io
라이브러리를 설치합니다
이후 아래와 같이 설정합니다.
import { createServer } from 'http';
import { Server } from 'socket.io';
import express, { Request, Response } from 'express';
// ...code
const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, {
cors: {
origin: 'http://localhost:3000', // 리액트 앱 주소
methods: ['GET', 'POST'],
},
});
io.on('connection' , (socket) => {
console.log('connected');
// 로직 작성
socket.on('disconnect', () => {
console.log('disconnect');
}
socket.on('error', (error) => {
console.error(error);
}
}
노드에서 선언한 웹 소켓을 리액트에서 호출하여 연결합니다.
socket.io-client
라이브러리로 쉽게 소켓에 연결을 진행합니다.
import { io } from 'socket.io-client';
import React, { useEffect, useState } from 'react';
const socket = io('http://localhost:8000');
function App() {
useEffect(() => {
socket.on('image-stream', (base64Image) => {
// 로직
});
return () => {
socket.disconnect();
};
}, []);
}
소켓을 통신하는 이벤트는 emit
과 on
을 사용합니다.
//보낼 때
//많은 인수를 보내도 상관없으며, Buffer나 TypedArray등의 바이너리 객체도 지원
socket.emit('hello', 'world', (response) => {
console.log(response);
});
// 받을 때
socket.on('hello', (arg, callback) => {
console.log(arg); // world
callback('got it');
});
//이벤트 제거 방법
socket.off('hello');
socket.removeAllListeners();
또한 서버에서 연결된 모든/일부 클라이언트에 이벤트를 보낼 수 있습니다.
// 연결된 모든 클라이언트로 보냄
io.emit('hello');
// news룸으로 연결된 클라이언트에 보냄
io.to('news').emit('hello');
연결 중 cors에러가 발생한 경우에는 아래와 같이 교차 출처를 허용하여 통신할 수 있도록 설정합니다.
// server-side
const io = new Server(httpServer, {
cors: {
origin: "https://example.com",
allowedHeaders: ["my-custom-header"],
credentials: true
}
});
// client-side
import { io } from "socket.io-client";
const socket = io("https://api.example.com", {
withCredentials: true,
extraHeaders: {
"my-custom-header": "abcd"
}
});
아직 웹 소켓을 적용하는 과정에서 많은 에러들이 발생하고 있어 좀 더 학습해야합니다.
아래에서 웹 소켓에서 발생한 에러를 해결하는 과정을 담은 블로그를 참고하면 좋아보입니다.
우아한형제들 배달운영시스템
좋은 글이네요. 덕분에 어려웠던 내용도 이해 했습니다. 감사합니다~!!