1. ๋ค์ด๊ฐ๋ฉฐ
๋ฐฑ์๋ ๊ฐ๋ฐ์์ ๊ฐ์ฅ ๊ณ ์ ์ ์ด๊ณ ๋๋ฆฌ ์ฐ์ด๋ ํต์ ํจํด์ ์์ฒญ(Request)-์๋ต(Response) ๋ชจ๋ธ์
๋๋ค.
HTTP, DNS, RPC, SQL, API ๋ฑ ๊ฑฐ์ ๋ชจ๋ ํ๋กํ ์ฝ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๊ฐ ์ด ํจํด์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
์ด๋ฒ ๊ธ์์๋ ์์ฒญยท์๋ต ํจํด์ ๊ตฌ์กฐยท๋์ ๊ณผ์ ยท๋น์ฉ ์์๋ฅผ ์ดํด๋ณด๊ณ , ์ค์๊ฐ์ฑ ์๊ตฌ๊ฐ ๋์ ๊ฒฝ์ฐ ํ์ฉ๋๋ ํธ์ ๋ชจ๋ธ๊น์ง ๋น๊ตํด ์ ๋ฆฌํฉ๋๋ค.
2. ์์ฒญ-์๋ต ํจํด์ด๋?
๊ธฐ๋ณธ ๊ฐ๋
- ํด๋ผ์ด์ธํธ(Client): ์์ฒญ(Request)์ ์ ์ก
- ์๋ฒ(Server): ์์ฒญ์ ํ์ฑํ๊ณ ์ฒ๋ฆฌ ํ, ์๋ต(Response) ๋ฐํ
- ํต์ฌ ํน์ง: ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํด์ผ ์๋ฒ๊ฐ ์๋ต โ Pull ๊ธฐ๋ฐ ๋ชจ๋ธ
[Client] -- ์์ฒญ --> [Server]
[Client] <-- ์๋ต -- [Server]
3. ์์ฒญยท์๋ต ๋์ ๊ณผ์
3.1 ์์ฒญ(Request)
- ์์ฑ
- ๋ฐ์ดํฐ ์ง๋ ฌํ(JSON, XML, ProtoBuf ๋ฑ)
- ๋คํธ์ํฌ ์ ์ก ์ค๋น
- ์ ์ก
- TCP/UDP ํจํท ๋จ์๋ก ๋ถํ
- ๋คํธ์ํฌ ๋ ์ดํด์(Latency) ๋ฐ์
- ํ์ฑ
- ์๋ฒ๊ฐ ์์ฒญ์ ์์ยท๋ ๊ฒฝ๊ณ๋ฅผ ํ์
- ์ง๋ ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ง๋ ฌํํด ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ก ๋ณํ
3.2 ์๋ต(Response)
- ์ฒ๋ฆฌ
- ์๋ฒ๊ฐ ์์ฒญ ๋ก์ง ์คํ (DB ์กฐํ, ์ฐ์ฐ ๋ฑ)
- ์๋ต ์์ฑ
- ์์
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ต์ ๊ฒฝ๊ณ ํ์
- ์ญ์ง๋ ฌํ ํ ํ๋ฉด ํ์ ๋๋ ํ์ ๋ก์ง ์คํ
4. ์์ฒญยท์๋ต์ ์ฑ๋ฅ ๋น์ฉ ์์
- ๋คํธ์ํฌ ์ ์ก ์๊ฐ (์์ฒญยท์๋ต ๋ชจ๋)
- ์ง๋ ฌํ/์ญ์ง๋ ฌํ ๋น์ฉ
- JSON > ProtoBuf (์๋ยท๋ฉ๋ชจ๋ฆฌ ํจ์จ ์ฐจ์ด)
- ํ์ฑ ์ค๋ฒํค๋
- ๋คํธ์ํฌ ํจํท ์ฌ์กฐํฉ ๋น์ฉ
- ์๋ต ์ฒ๋ฆฌ ์๊ฐ
๐ก ์์: curl --trace๋ก HTTP ์์ฒญ์ ๋ถ์ํ๋ฉด, DNS ์กฐํ โ TCP ์ฐ๊ฒฐ โ ์์ฒญ ์ ์ก โ ์๋ต ํค๋ ์์ โ ๋ฐ๋ ์์ ์์๊ฐ ๋ช
ํํ ๋ณด์.
5. ์์ฒญยท์๋ต์ ํ๊ณ
- ์ค์๊ฐ์ฑ ๋ถ์กฑ
- ์๋ฒ์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํด๋, ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํด์ผ๋ง ์ ์ ์์
- ํด๋ง(Polling) ๋ถํ
- "์ ์๋ฆผ ์๋์?"๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์์ฒญํ๋ฉด ๋คํธ์ํฌยท์๋ฒ ๋ฆฌ์์ค ๋ญ๋น
- ๊ธด ์ฒ๋ฆฌ ์๊ฐ ๋ฌธ์
- ์์ฒญ-์๋ต์ด ์ค๋ ๊ฑธ๋ฆฌ๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ์ ์ ์งํด์ผ ํจ
- ์ฐ๊ฒฐ ๋๊ธฐ๋ฉด ์ํ ๋๊ธฐํ ์ด๋ ค์
6. ํธ์(Push) ๋ชจ๋ธ
๊ฐ๋
- ์๋ฒ๊ฐ ์ด๋ฒคํธ ๋ฐ์ ์ ์ฆ์ ํด๋ผ์ด์ธํธ์ ๋ฐ์ดํฐ ์ ์ก
- ํด๋ผ์ด์ธํธ๊ฐ ์ง์์ ์ผ๋ก ์์ฒญํ ํ์ ์์
- ์ค์๊ฐ์ฑ์ด ํ์ํ ์๋น์ค์ ์ ํฉ
[Server] -- ์ด๋ฒคํธ ๋ฐ์ --> ์ฆ์ [Client]์ ์ ๋ฌ
6.1 ์๋ ๋ฐฉ์
- ์ฐ๊ฒฐ ์ค์
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ง์ ์ฐ๊ฒฐ(WebSocket, TCP ๋ฑ) ์์ฑ
- ์ด๋ฒคํธ ๋ฐ์
- ์๋ฒ๊ฐ ํด๋น ์ฐ๊ฒฐ์ ํตํด ์ฆ์ ๋ฐ์ดํฐ ์ ์ก
- ์์ ์ฒ๋ฆฌ
- ํด๋ผ์ด์ธํธ๋ ์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ก ๋ฐ์ดํฐ ์ฒ๋ฆฌ
6.2 ์ฅ์
- ์ค์๊ฐ ์๋ฆผ ๊ฐ๋ฅ
- ๋ถํ์ํ ์์ฒญ ๊ฐ์ (ํด๋ง ๋๋น ํจ์จ์ )
6.3 ๋จ์
- ํญ์ ์ฐ๊ฒฐ ํ์
- ์คํ๋ผ์ธ ํด๋ผ์ด์ธํธ์๋ ํธ์ ๋ถ๊ฐ (์ฌ์ฐ๊ฒฐ ํ ๋๊ธฐํ ํ์)
- ๋ถํ ์กฐ์ ์ด๋ ค์
- ์๋ฒ๊ฐ ๋ฌด์กฐ๊ฑด ์ ์ก โ ํด๋ผ์ด์ธํธ ์ฒ๋ฆฌ ์๋ ์ด๊ณผ ๊ฐ๋ฅ
- ๊ท๋ชจ ํ์ฅ ๋ณต์ก
- ์๋ง์ ํด๋ผ์ด์ธํธ ๋์ ์ฐ๊ฒฐ ์ ๋ถํ ์ฆ๊ฐ
7. ํธ์ ๋ชจ๋ธ ์ค์ ์์ โ Node.js WebSocket ์ฑํ
์๋ฒ ์์ ์ฝ๋
const http = require('http');
const WebSocket = require('ws');
const server = http.createServer();
const wss = new WebSocket.Server({ server });
let clients = [];
wss.on('connection', (ws) => {
clients.push(ws);
ws.on('message', (msg) => {
clients.forEach(client => {
if (client.readyState === WebSocket.OPEN) {
client.send(msg);
}
});
});
ws.on('close', () => {
clients = clients.filter(c => c !== ws);
});
});
server.listen(8080, () => console.log('Server started on 8080'));
๋์ ํ๋ฆ
- ์ฌ์ฉ์ ์ฐ๊ฒฐ โ
connection ์ด๋ฒคํธ ๋ฐ์
- ๋ฉ์์ง ์ ์ก โ ์๋ฒ๊ฐ ์ฐ๊ฒฐ๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ์ ํธ์
- ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ ์ข
๋ฃ โ ๋ฐฐ์ด์์ ์ ๊ฑฐ
์ฌ์ฉ ์์ (๋ธ๋ผ์ฐ์ ์ฝ์)
const ws = new WebSocket('ws://localhost:8080');
ws.onmessage = (e) => console.log('๋ฐ์:', e.data);
ws.send('์๋
ํ์ธ์!');
8. ์์ฒญ-์๋ต vs ํธ์ ๋น๊ต
| ๊ตฌ๋ถ | ์์ฒญ-์๋ต | ํธ์ |
|---|
| ๋ฐฉํฅ์ฑ | ํด๋ผ์ด์ธํธ ์์ฒญ ํ ์๋ฒ ์๋ต | ์๋ฒ โ ํด๋ผ์ด์ธํธ ์ด๋ฒคํธ ์ ์ก |
| ์ค์๊ฐ์ฑ | ๋ฎ์ | ๋์ |
| ์ฐ๊ฒฐ ์ ์ง | ์์ฒญ ์๋ง ์ฐ๊ฒฐ | ์ง์ ์ฐ๊ฒฐ ํ์ |
| ๋ถํ ๊ด๋ฆฌ | ์์ฒญ ๋น๋๋ก ์ ์ด | ์๋ฒ์์ ์ ์ด ์ด๋ ค์ |
| ํ์ฉ ์์ | API ํธ์ถ, DB ์ฟผ๋ฆฌ | ์ฑํ
, ์ค์๊ฐ ์๋ฆผ, ์คํธ๋ฆฌ๋ฐ |
9. ๋ง์น๋ฉฐ
- ์์ฒญ-์๋ต์ ๋ฒ์ฉ์ ์ด๊ณ ๋จ์ํ์ง๋ง, ์ค์๊ฐ์ฑ์ด ํ์ํ ์๋น์ค์ ํ๊ณ๊ฐ ์์
- ํธ์ ๋ชจ๋ธ์ ์ค์๊ฐ์ฑ์ ๊ฐํ์ง๋ง, ์ฐ๊ฒฐ ์ ์งยท๋ถํ ์กฐ์ ยทํ์ฅ์ฑ์ ์ฃผ์ํด์ผ ํจ
- ์ค์ ์๋น์ค๋ ๋ ๋ชจ๋ธ์ ํผํฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์
- ์: ์ผ๋ฐ ๋ฐ์ดํฐ๋ ์์ฒญ-์๋ต, ์ค์๊ฐ ์ด๋ฒคํธ๋ ํธ์(WebSocket, SSE)
๐ ๋ค์ ๊ธ์์๋ ํธ์ ๋ชจ๋ธ์ ๋ณํ ํํ์ธ ๋กฑ ํด๋ง(Long Polling)๊ณผ Pub/Sub ๊ตฌ์กฐ๋ฅผ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.