-
Notifications
You must be signed in to change notification settings - Fork 4
๐์น์์ผ ์์๋ณด๊ธฐ
Changhyun-Hong edited this page Dec 5, 2024
·
1 revision
์ฐ๋ฆฌ๊ฐ ํํ ์ฌ์ฉํ๋ HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ ์น์์ผ ํ๋กํ ์ฝ (ws, wss)์ ์ฌ์ฉํจ
- http:// ๊ฐ ์๋
ws://๋wss://์ ํํ๋ฅผ ๊ฐ์

- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ๊ฒ์ ๊ฐ๋ฅํ์ง๋ง, ์๋๋ฐฉ์ด ๋ด ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ๊ฒ์ ์๋๋ฐฉ์ด ํน๋ณํ ์์ฒญ์ด ์๋ ํ ์ด๋ฃจ์ด์ง ์๊ฐ ์์
- HTTP์
Polling๊ธฐ๋ฒ์ผ๋ก ํด๊ฒฐ๊ฐ๋ฅ- ํด๋ผ์ด์ธํธ๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด์ ์๋๊ฐ ์๋ก์ด ์ฑ์ ๋ณด๋๋์ง ํ์ธ
- ์์ฒญ์ฃผ๊ธฐ์ ๋ฐ๋ผ์ ์ค์๊ฐ์ผ๋ก ๋ฐ์ ์๊ฐ ์์
- ๋ถํ์ํ ์์ฒญ
-
Long Polling: ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ฐ๋ก ์๋ตํ์ง ์๊ณ ์ ๋ฐ์ดํธ๊ฐ ๋ฐ์ํ ๋๊น์ง ๊ธฐ๋ค๋ฆผ- ์๋๋ฐฉ์ด ์ฑ์ ๋ณด๋ด๊ฑฐ๋ ํ์์์์ ๊ฑธ๋ฆฌ๋ฉด ์๋ต์ ๋ณด๋ด๊ณ ํด๋ผ์ด์ธํธ๋ ๋ค์ ์์ฒญ์ ๋ณด๋ด์ ๋ค์ ์๋ต์ ๊ธฐ๋ค๋ฆผ
- ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ์ ๋ฐ์ํ๋ ์๋๋ ๋นจ๋ผ์ง์ง๋ง ์๋ฒ์ ๋ถ๋ด์ด ์ปค์ง (์ฌ๋ฌ๋ช ์ ํก๋ฐฉ)
- ํด๋ผ์ด์ธํธ๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด์ ์๋๊ฐ ์๋ก์ด ์ฑ์ ๋ณด๋๋์ง ํ์ธ
- ๋ฌผ๋ก HTTP/2 ์ด์์์๋ ์๋ฐฉํฅ ํต์ ์ด ๊ฐ๋ฅํ์ง๋ง, ์ฅ์๊ฐ์ ์๋ฐฉํฅ ํต์ ์ ์ํ ์ค๊ณ๋ ์๋
ํธ๋์์ดํฌ
- ํด๋ผ์ด์ธํธ๋ ์๋ฒ์๊ฒ
WebSocket์ ์ฐ๊ฒฐํ์๋ ์์ฒญ์HTTP๋ฅผ ํตํด ๋ณด๋-
Upgrade์Connection: Upgradeํค๋๊ฐ ํฌํจ๋์ด ์น์์ผ ์ ํ์ ์์ฒญ
-
- ์๋ฒ๋ ๊ทธ๊ฒ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ด๋ฅผ ์๋ฝํ๋ ์๋ต์
HTTP๋ก ๋ณด๋-
101 Switching Protocols์๋ต์ ๋ณด๋
-
- ํธ๋์์ดํฌ ๊ณผ์ ์ด ๋๋๊ฒ ๋๋ฉด ํด๋ผ์ด์ธํธ์ ์๋ฒ๋
WebSocket ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ์ํต
๋ฐ์ดํฐ ์ ์ก
- ํธ๋์ ฐ์ดํฌ ์ดํ ์น์์ผ์ ํ๋ ์์ด๋ผ๋ ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์
- ํ๋ ์์ ๋ฐ์ดํฐ์ ์์ ๋ฌถ์์ผ๋ก, ํ ์คํธ๋ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ
์ฐ๊ฒฐ ์ข ๋ฃ
- ์น์์ผ ์ฐ๊ฒฐ์ ์์ชฝ์์ ์ข ๋ฃ ์ ํธ๋ฅผ ๋ณด๋ด๋ฉด ์ข ๋ฃ๋จ
- ํด๋ผ์ด์ธํธ๊ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ๊ฑฐ๋ ๋ช ์์ ์ผ๋ก ์ฐ๊ฒฐ์ ๋์ ๋ ์ฐ๊ฒฐ์ด ์ข ๋ฃ๋๊ณ , ์๋ฒ์์๋ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ํด๋ผ์ด์ธํธ์์ ์ฐ๊ฒฐ์ ์ข ๋ฃํ ์ ์์
๋คํธ์ํฌ OSI 7๊ณ์ธต์์ 7๊ณ์ธต์์ ์๋ํ๋ฉฐ TCP socket์ ๊ธฐ๋ฐ์ผ๋ก ์๋

์ค์๊ฐ ์๋ฐฉํฅ ํต์ (Full-Duplex)
์ฐ๊ฒฐ ์ ์ง
- ์ผ๋ฐ์ ์ธ HTTP์์๋ ์์ฒญ๊ณผ ์๋ต์ด ๋๋๋ฉด ์ฐ๊ฒฐ์ด ๋์ด์ง์ง๋ง, ์น์์ผ์ ํ ๋ฒ ์ฐ๊ฒฐ์ด ์ฑ๋ฆฝ๋๋ฉด ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ฐ๊ฒฐ์ด ๊ณ์ ์ ์ง๋จ
- ์ค๋ฒํค๋ ๊ฐ์
- HTTP์ ๊ฒฝ์ฐ ๋งค ์์ฒญ๋ง๋ค ํค๋์ ๊ฐ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์กํด์ผ ํ์ง๋ง, ์น์์ผ์ ์ฒ์ ํธ๋์์ดํฌ ์ดํ์๋ ์ด๋ฌํ ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด์ง ์์
๋ฎ์ ์ง์ฐ ์๊ฐ (Low Latency)
- ์น์์ผ์ ์ฐ๊ฒฐ์ด ์ด๋ฆฐ ํ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ ์กํ ์ ์๊ธฐ ๋๋ฌธ์ ์ง์ฐ ์๊ฐ์ด ๋งค์ฐ ์งง์
- ์น์์ผ์ ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์ง์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฏ๋ก, HTTP ๊ธฐ๋ฐ์ ์์ฒญ/์๋ต ์ฃผ๊ธฐ๋ณด๋ค ํจ์ฌ ๋น ๋ฅธ ์๋ต์ ์ ๊ณต
ํจ์จ์ ์ธ ๋์ญํญ ์ฌ์ฉ
- ์น์์ผ์ ์ด๊ธฐ ํธ๋์์ดํฌ ์ดํ์ ํค๋ ํฌ๊ธฐ๊ฐ ์๊ณ ํ์ํ ๋ฐ์ดํฐ๋ง์ ์ ์กํ๋ฏ๋ก, ๋์ญํญ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ
- ๋ฐ๋ณต์ ์ธ HTTP ์์ฒญ/์๋ต์ ๊ฒฝ์ฐ ์๋์ ์ผ๋ก ๋ง์ ๋ฐ์ดํฐ๊ฐ ์ค๊ฐ๋๋ฐ, ์น์์ผ์ ์ง์์ ์ธ ์ฐ๊ฒฐ๋ก ์ธํด ์ด๋ฌํ ์ค๋ฒํค๋๊ฐ ์ค์ด๋ฆ
์๋ฒ ํธ์ (Server Push)
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ์ง ์์๋ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ ์์
- ์ด๋ฅผ ํตํด ์ค์๊ฐ ์๋ฆผ, ์ด๋ฒคํธ ์ ๋ฐ์ดํธ ๋ฑ ํด๋ผ์ด์ธํธ ์ธก์์ ์ฃผ๊ธฐ์ ์ผ๋ก ์๋ฒ๋ฅผ ์กฐํํ ํ์ ์์ด ์๋ฒ์์ ์๋์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํธ์ํ ์ ์์
์ด๊ธฐ ์ฐ๊ฒฐ ์ค๋ฒํค๋
- ์น์์ผ์ ์ด๊ธฐ ํธ๋์์ดํฌ๊ฐ ํ์ํจ
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์น์์ผ ์ฐ๊ฒฐ์ ์์ฒญํ๊ณ , ์๋ฒ๊ฐ ์ด๋ฅผ ์น์ธํ๋ ๊ณผ์ ์์ HTTP๋ฅผ ์ฌ์ฉํ์ฌ ํค๋ ํฌ๊ธฐ๊ฐ ํผ
- ํ ๋ฒ ์ฐ๊ฒฐ๋ ํ์๋ ์ค๋ฒํค๋๊ฐ ์ ์ง๋ง, ์ด๊ธฐ ์ฐ๊ฒฐ ์ค์ ์ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์
์ํ ์ ์ง ๋ฌธ์ (Stateful)
- ์น์์ผ ์ฐ๊ฒฐ์ ์ํ๊ธฐ๋ฐ, HTTP ์ฐ๊ฒฐ์ ๋ฌด์ํ(Stateless)
- ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ํด๋น ์ํ๊ฐ ๋ชจ๋ ์ฌ๋ผ์ง๋ฏ๋ก, ์๋ฒ๋ ํด๋ผ์ด์ธํธ์์ ์ฐ๊ฒฐ์ ์ ์งํ๊ณ ๊ด๋ฆฌํด์ผ ํจ
- ์ค์ผ์ผ๋ง์ด ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ฌ๋ฌ ์๋ฒ๊ฐ ์น์์ผ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํด์ผ ํ๋ฏ๋ก, ํด๋ผ์ด์ธํธ ์ํ๋ฅผ ๋๊ธฐํํ๊ฑฐ๋ ํด๋ฌ์คํฐ ๊ฐ์ ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ถ๊ฐ์ ์ธ ๋ถ๋ด
๋ธ๋ผ์ฐ์ ๋ฐ ๋คํธ์ํฌ ์ ํ
- ์ผ๋ถ ๋คํธ์ํฌ ํ๊ฒฝ์์๋ ์น์์ผ ์ฐ๊ฒฐ์ ์ฐจ๋จํ๊ฑฐ๋ ์ ํํ ์ ์์
- ์๋ฅผ ๋ค์ด, ๋ฐฉํ๋ฒฝ์ด๋ ํ๋ก์ ์๋ฒ
- ๋ธ๋ผ์ฐ์ ์์๋ ์น์์ผ์ ์ง์ํ์ง ์๊ฑฐ๋, ๋ณด์์์ ์ด์ ๋ก ์ผ๋ถ ์ ํ์ ๋๋ ๊ฒฝ์ฐ๊ฐ ์์
์๋ฒ ๋ฆฌ์์ค ์๋ชจ
- ์น์์ผ ์ฐ๊ฒฐ์ ์๋ฒ ๋ฆฌ์์ค๋ฅผ ๋ง์ด ์๋ชจ
- ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ด ์ง์์ ์ผ๋ก ์ ์ง๋๊ธฐ ๋๋ฌธ์, ๋ง์ ์์ ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ๋ ๊ฒฝ์ฐ ์๋ฒ๋ ์ด๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ์๋นํ ๋ฆฌ์์ค๋ฅผ ์๋นํ ์ ์์
- ๋๊ท๋ชจ์ ์น์์ผ ์๋ฒ๋ฅผ ์ด์ํ๋ ค๋ฉด ์ค์ผ์ผ๋ง๊ณผ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ ๊ณ ๋ คํด์ผ ํจ
๋ณด์ ๋ฌธ์
- ๊ธฐ๋ณธ์ ์ผ๋ก๋
ws://(์น์์ผ)์wss://(์น์์ผ ๋ณด์) ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ฉฐ,wss://๋ HTTPS์ฒ๋ผ SSL/TLS๋ก ์ํธํ๋ ์ฐ๊ฒฐ์ ์ฌ์ฉํ์ง๋ง ์ฌ์ ํ ์น์์ผ ํ๋กํ ์ฝ์ ์ ์ฉํ๋ ค๋ ๊ณต๊ฒฉ์ด ์์ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ๋ฐฉ์ดํ๊ธฐ ์ํ ์ถ๊ฐ์ ์ธ ๋ณด์ ์กฐ์น๊ฐ ํ์
๋ธ๋ผ์ฐ์ ์ ์ ํ๋ ์ฐ๊ฒฐ ์
- ๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ๋ ๊ฐ ๋๋ฉ์ธ์์ ๋์์ ์ด ์ ์๋ ์น์์ผ ์ฐ๊ฒฐ ์์ ์ ํ์ ๋๊ณ ์์
- ์๋ฅผ ๋ค์ด, ํน์ ๋ธ๋ผ์ฐ์ ์์๋ ํ ๋๋ฉ์ธ์ ๋ํด ์ต๋ 6๊ฐ์ ์น์์ผ ์ฐ๊ฒฐ๋ง์ ํ์ฉ
- ํน๋ณํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ ์์ด ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ ๊ณตํ๋ websocket ์ด์ฉ
import React, { useState, useEffect } from 'react';
const ChatApp = () => {
const [ws, setWs] = useState<WebSocket | null>(null);
const [messages, setMessages] = useState<string[]>([]);
const [userId, setUserId] = useState<string>('');
const [inputMessage, setInputMessage] = useState<string>('');
useEffect(() => {
// WebSocket ์๋ฒ ์ฐ๊ฒฐ
const socket = new WebSocket('ws://localhost:8080');
socket.onopen = () => {
console.log('WebSocket connected');
};
// ์๋ฒ๋ก๋ถํฐ ๋ฉ์์ง ์์
socket.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === 'userId') {
setUserId(data.userId); // ์๋ฒ๋ก๋ถํฐ ์ฌ์ฉ์ ID ๋ฐ๊ธฐ
} else {
setMessages((prevMessages) => [...prevMessages, data.message]);
}
};
setWs(socket);
// ์ปดํฌ๋ํธ ์ธ๋ง์ดํธ ์ WebSocket ์ฐ๊ฒฐ ์ข
๋ฃ
return () => {
socket.close();
};
}, []);
// ๋ฉ์์ง ๋ณด๋ด๊ธฐ
const sendMessage = () => {
if (ws && inputMessage) {
const message = JSON.stringify({
userId,
message: inputMessage,
});
ws.send(message);
setInputMessage('');
}
};
return (
<div>
<h1>์ฑํ
๋ฐฉ</h1>
<div>
{messages.map((message, index) => (
<div key={index}>{message}</div>
))}
</div>
<input
type="text"
value={inputMessage}
onChange={(e) => setInputMessage(e.target.value)}
placeholder="๋ฉ์์ง๋ฅผ ์
๋ ฅํ์ธ์"
/>
<button onClick={sendMessage}>๋ณด๋ด๊ธฐ</button>
</div>
);
};
export default ChatApp;- ๐ ์น ์์ผ์ ์ค์๊ฐ ์๋ฐฉํฅ ํต์ (feat. WS vs Socket.io)
- ๐คธโโ๏ธ ๋น์ ์ด ์ปดํฌ๋ํธ๋ก ๋ ๋๋ง ์ต์ ํ ํ๊ธฐ
- ๐ทโโ๏ธ Shared Worker๋ก ํด๋ผ์ด์ธํธ์ ์์ผ ํต์ ๊ฐ์ ํ๊ธฐ
- ๐จโ๐ฉโ๐งโ๐ฆ ๋ค์ค ํญ์์ ํ๋์ ์์ผ์ ๊ณต์ ํ ์ ์์๊น?
- ๐ [Socket.io] ํด๋ผ์ด์ธํธ์ ์ค์๊ฐ ์ฑํ ๊ตฌํ๊ธฐ
- ๐ฌ ์๋ฒ๋ฅผ docker swarm ์ผ๋ก ๊ด๋ฆฌํด๋ณด์
- ๐ฌ ์ปจํ ์ด๋๋ผ๋ฆฌ env ๊ณต์ ํ๊ธฐ
- ํ์ฅ์ฑ์ ๊ณ ๋ คํ ์๋ฒ ์ค๊ณ
- ncp ์๋ฒ ์ ํ
- ์ฑํ ์๋ฒ์ Redis ๋ฅผ ์ด ์ด์
- โ NestJS๋ฅผ ํตํ ์ผ๊ด์ ์ธ ์์คํ ์ค๊ณ
โ๏ธ ์ธ๋ถ์ ์ฌ์ฉ์๊ฐ Object Storage์ ์ ๊ทผํ์ง ๋ชปํ๋ ๊ถํ ์ ์ด- ๐ฆข nestjs์์ swagger ์ฌ์ฉํด๋ณด๊ธฐ
- ๐ NestJS Nginx Request Data Size ๋ฌธ์
- ๐ ๋ค์๋ณด๊ธฐ๋ฅผ ์ํ NodeโMediaโServer, FFMpeg ๋ถ์
- ๐ฆ ํจํค์ง ๋งค๋์ ๋ฐ ๋ชจ๋ ธ๋ ํฌ ์ ํ๊ธฐ
- ๐ฐ ์ปค์คํ ESLint ๋ง๋ค๊ธฐ
- ๐คบ ์ปค์คํ react ์ค๋ํซ ๋ง๋ค๊ธฐ
- ๐ธ ๋ฐ์ํ ๋น๋์ค ํ๋ ์ด์ด ๊ตฌํ: ํจ๋ฉ ํ ๊ธฐ๋ฒ
- ๋ฆฌ์กํธ ํ ํผ ๋ฅ๋ค์ด๋ธ