개념
Socket
- 일반적인 소켓은 네트워크 통신을 위한 엔드포인트를 나타냅니다.
- TCP/IP 기반의 네트워크에서 사용되며, 클라이언트와 서버 간의 양방향 통신을 가능하게 합니다.
- 주로 로컬 네트워크 또는 인터넷을 통해 컴퓨터 간의 통신을 할 때 사용됩니다.
WebSocket
- 웹 소켓은 HTML5에서 지원하는 통신 프로토콜로, 클라이언트와 서버 간의 실시간 양방향 통신을 가능하게 합니다.
- 일반적인 소켓과 달리, 웹 브라우저에서도 사용할 수 있으며, HTTP 프로토콜 위에 구현되어 있습니다.
- 웹 소켓은 클라이언트와 서버가 지속적으로 연결된 상태를 유지하며, 실시간으로 데이터를 주고받을 수 있습니다.
Socket.IO
- Socket.IO는 웹 소켓을 이용한 실시간 양방향 통신을 구현하기 위한 JavaScript 라이브러리입니다.
- 웹 소켓을 기반으로 하지만, 브라우저가 웹 소켓을 지원하지 않는 경우에도 폴백 옵션을 통해 다른 통신 방식으로 자동으로 전환할 수 있습니다.
- Socket.IO는 간단한 API(자동 재연결, 룸(Room) 및 네임스페이스(Namespace) 지원 등)를 제공하며, 다양한 플랫폼(웹, 모바일 등)에서 사용할 수 있습니다.
웹 소켓은 직접적인 브라우저 통신이 필요하고 고성능이 요구되는 경우에 적합하며, Socket.IO는 다양한 플랫폼 호환성과 간편한 API, 다양한 기능을 제공하여 개발 효율성을 높이는 데 사용됩니다.
react 프로젝트에서 설정 방법
1. Socket.IO 설치
프로젝트 디렉토리에서 아래의 명령을 하나 실행하세요.
npm install socket.io-client
yarn add socket.io-client
2. Socket.IO 클라이언트 설정
클라이언트 측 코드에서 Socket.IO를 설정. (index.js에서 설정하는 것 추천)
- App.js 에서 설정
app.js에만 socket을 사용할 거라면 직접 선언하여 코드를 간결하게 할 수 있다.
// App.js
import "./App.css";
import io from "socket.io-client";
import { useEffect, useState, useRef } from "react";
const socket = io.connect("http://localhost:3001");
function App() {
// App 컴포넌트 내용...
}
- index.js에서 소켓을 선언하고 props로 넘겨주기
소켓을 하나의 인스턴스로 유지할 수 있으며, 모든 컴포넌트에서 재사용 가능
// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import io from 'socket.io-client';
const socket = io('http://localhost:3001');
ReactDOM.render(
<React.StrictMode>
<App socket={socket} />
</React.StrictMode>,
document.getElementById('root')
);
//App.js
import React, { useState, useEffect } from 'react';
function App({ socket }) {
// App 컴포넌트 내용에서 socket을 props로 받아 사용합니다.
const [message, setMessage] = useState('');
const [receivedMessage, setReceivedMessage] = useState('');
const sendMessage = () => {
socket.emit('send_message', message);
};
useEffect(() => {
socket.on('receive_message', (data) => {
setReceivedMessage(data);
});
return () => {
socket.off('receive_message');
};
}, [socket]);
return (
<div>
<input value={message} onChange={(e) => setMessage(e.target.value)} />
<button onClick={sendMessage}>Send</button>
<div>Received Message: {receivedMessage}</div>
</div>
);
}
export default App;
3. 서버 측 설정
클라이언트와 통신하고, 이벤트를 처리하는 로직을 작성
const express = require("express");
const app = express();
const http = require("http");
const { Server } = require("socket.io");
const server = http.createServer(app);
const io = new Server(server);
io.on("connection", (socket) => {
console.log(`User Connected: ${socket.id}`);
socket.on("send_message", (message) => {
io.emit("receive_message", message);
});
socket.on("disconnect", () => {
console.log("User Disconnected");
});
});
server.listen(3001, () => {
console.log("SERVER IS RUNNING");
});
클라이언트 측에서는 send_message 이벤트를 통해 메시지를 서버로 전송하고, 서버 측에서는 이를 받아서 모든 클라이언트에게 다시 전송하는 예시.
*서버는 클라이언트로부터 받은 메시지를 받으면 바로 모든 클라이언트에게 전송하므로, 클라이언트가 보낸 메시지를 다시 자신에게 받게 됩니다.
*socket.io 메서드
- socket.emit(eventName, data):
- socket.emit은 클라이언트에서 이벤트를 발생시키고, 서버에 데이터를 전달할 때 사용됩니다.
- 예를 들어, 클라이언트에서 채팅 메시지를 서버로 보내거나, 사용자의 액션을 서버로 알리는 등의 작업에 사용됩니다.
- socket.on(eventName, data):
- socket.on은 서버에서 클라이언트로부터 데이터를 수신하는 데 사용됩니다.
- 예를 들어, 서버에서 채팅 메시지를 수신하거나, 클라이언트의 요청에 응답하는 등의 작업에 사용됩니다.
- socket.once(eventName, callback):
- 특정 이벤트에 대한 리스너를 한 번만 실행하고 제거합니다.
- socket.removeListener(eventName, callback):
- 특정 이벤트에 대한 특정 리스너(콜백 함수)를 제거합니다.
- socket.removeAllListeners([eventName]):
- 모든 이벤트 리스너를 제거합니다. (특정 이벤트 선택 가능)
- socket.connect():
- 소켓을 서버에 연결합니다.
- 연결이 끊어진 경우 다시 연결할 때 사용됩니다.
- socket.disconnect():
- 소켓 연결을 종료합니다.
- 서버와의 연결을 끊고 소켓을 닫습니다.
- socket.close():
- 소켓을 닫습니다. 연결된 모든 이벤트 리스너를 제거하고 소켓을 종료합니다.
- socket.join(room):
- 클라이언트를 특정 방(room)에 조인시킵니다.
- 같은 방에 조인된 클라이언트끼리 특정 이벤트를 공유할 수 있습니다.
- socket.leave(room):
- 클라이언트를 특정 방(room)에서 나가게 합니다.
- 해당 방에서 나간 클라이언트는 해당 방에 속한 이벤트를 더 이상 수신하지 않습니다.
- socket.off(eventName, callback):
- socket.off은 이벤트 리스너를 제거. 불필요한 메모리 누수를 방지합니다.
'Frontend > react' 카테고리의 다른 글
React Hooks (0) | 2024.02.24 |
---|---|
Redux 설치 및 사용법 (0) | 2023.09.27 |
combineReducers (0) | 2023.09.27 |
react-router-dom 버전6 변경 사항 (0) | 2023.09.25 |
React Router Dom 설정(버전 5.x, 6링크) (0) | 2023.09.25 |