๐Ÿ“Œ ๋ฐฑ์—”๋“œ ํ†ต์‹  ๋””์ž์ธ ํŒจํ„ด โ€” ์š”์ฒญยท์‘๋‹ต๊ณผ ํ‘ธ์‹œ ๋ชจ๋ธ ์™„์ „ ์ •๋ฆฌ

okorionยท2025๋…„ 8์›” 14์ผ

1. ๋“ค์–ด๊ฐ€๋ฉฐ

๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ ๊ฐ€์žฅ ๊ณ ์ „์ ์ด๊ณ  ๋„๋ฆฌ ์“ฐ์ด๋Š” ํ†ต์‹  ํŒจํ„ด์€ ์š”์ฒญ(Request)-์‘๋‹ต(Response) ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.
HTTP, DNS, RPC, SQL, API ๋“ฑ ๊ฑฐ์˜ ๋ชจ๋“  ํ”„๋กœํ† ์ฝœ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๊ฐ€ ์ด ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์š”์ฒญยท์‘๋‹ต ํŒจํ„ด์˜ ๊ตฌ์กฐยท๋™์ž‘ ๊ณผ์ •ยท๋น„์šฉ ์š”์†Œ๋ฅผ ์‚ดํŽด๋ณด๊ณ , ์‹ค์‹œ๊ฐ„์„ฑ ์š”๊ตฌ๊ฐ€ ๋†’์€ ๊ฒฝ์šฐ ํ™œ์šฉ๋˜๋Š” ํ‘ธ์‹œ ๋ชจ๋ธ๊นŒ์ง€ ๋น„๊ตํ•ด ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


2. ์š”์ฒญ-์‘๋‹ต ํŒจํ„ด์ด๋ž€?

๊ธฐ๋ณธ ๊ฐœ๋…

  • ํด๋ผ์ด์–ธํŠธ(Client): ์š”์ฒญ(Request)์„ ์ „์†ก
  • ์„œ๋ฒ„(Server): ์š”์ฒญ์„ ํŒŒ์‹ฑํ•˜๊ณ  ์ฒ˜๋ฆฌ ํ›„, ์‘๋‹ต(Response) ๋ฐ˜ํ™˜
  • ํ•ต์‹ฌ ํŠน์ง•: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•ด์•ผ ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต โ†’ Pull ๊ธฐ๋ฐ˜ ๋ชจ๋ธ
[Client] -- ์š”์ฒญ --> [Server]
[Client] <-- ์‘๋‹ต -- [Server]

3. ์š”์ฒญยท์‘๋‹ต ๋™์ž‘ ๊ณผ์ •

3.1 ์š”์ฒญ(Request)

  1. ์ž‘์„ฑ
    • ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™”(JSON, XML, ProtoBuf ๋“ฑ)
    • ๋„คํŠธ์›Œํฌ ์ „์†ก ์ค€๋น„
  2. ์ „์†ก
    • TCP/UDP ํŒจํ‚ท ๋‹จ์œ„๋กœ ๋ถ„ํ• 
    • ๋„คํŠธ์›Œํฌ ๋ ˆ์ดํ„ด์‹œ(Latency) ๋ฐœ์ƒ
  3. ํŒŒ์‹ฑ
    • ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์˜ ์‹œ์ž‘ยท๋ ๊ฒฝ๊ณ„๋ฅผ ํŒŒ์•…
    • ์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์—ญ์ง๋ ฌํ™”ํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜

3.2 ์‘๋‹ต(Response)

  1. ์ฒ˜๋ฆฌ
    • ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ ๋กœ์ง ์‹คํ–‰ (DB ์กฐํšŒ, ์—ฐ์‚ฐ ๋“ฑ)
  2. ์‘๋‹ต ์ž‘์„ฑ
    • ์ง๋ ฌํ™” ํ›„ ์ „์†ก
  3. ์ˆ˜์‹ 
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‘๋‹ต์˜ ๊ฒฝ๊ณ„ ํŒŒ์•…
    • ์—ญ์ง๋ ฌํ™” ํ›„ ํ™”๋ฉด ํ‘œ์‹œ ๋˜๋Š” ํ›„์† ๋กœ์ง ์‹คํ–‰

4. ์š”์ฒญยท์‘๋‹ต์˜ ์„ฑ๋Šฅ ๋น„์šฉ ์š”์†Œ

  • ๋„คํŠธ์›Œํฌ ์ „์†ก ์‹œ๊ฐ„ (์š”์ฒญยท์‘๋‹ต ๋ชจ๋‘)
  • ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ๋น„์šฉ
    • JSON > ProtoBuf (์†๋„ยท๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ ์ฐจ์ด)
  • ํŒŒ์‹ฑ ์˜ค๋ฒ„ํ—ค๋“œ
  • ๋„คํŠธ์›Œํฌ ํŒจํ‚ท ์žฌ์กฐํ•ฉ ๋น„์šฉ
  • ์‘๋‹ต ์ฒ˜๋ฆฌ ์‹œ๊ฐ„

๐Ÿ’ก ์˜ˆ์‹œ: curl --trace๋กœ HTTP ์š”์ฒญ์„ ๋ถ„์„ํ•˜๋ฉด, DNS ์กฐํšŒ โ†’ TCP ์—ฐ๊ฒฐ โ†’ ์š”์ฒญ ์ „์†ก โ†’ ์‘๋‹ต ํ—ค๋” ์ˆ˜์‹  โ†’ ๋ฐ”๋”” ์ˆ˜์‹  ์ˆœ์„œ๊ฐ€ ๋ช…ํ™•ํžˆ ๋ณด์ž„.


5. ์š”์ฒญยท์‘๋‹ต์˜ ํ•œ๊ณ„

  1. ์‹ค์‹œ๊ฐ„์„ฑ ๋ถ€์กฑ
    • ์„œ๋ฒ„์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ด๋„, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•ด์•ผ๋งŒ ์•Œ ์ˆ˜ ์žˆ์Œ
  2. ํด๋ง(Polling) ๋ถ€ํ•˜
    • "์ƒˆ ์•Œ๋ฆผ ์žˆ๋‚˜์š”?"๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์š”์ฒญํ•˜๋ฉด ๋„คํŠธ์›Œํฌยท์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„
  3. ๊ธด ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ ๋ฌธ์ œ
    • ์š”์ฒญ-์‘๋‹ต์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•ด์•ผ ํ•จ
    • ์—ฐ๊ฒฐ ๋Š๊ธฐ๋ฉด ์ƒํƒœ ๋™๊ธฐํ™” ์–ด๋ ค์›€

6. ํ‘ธ์‹œ(Push) ๋ชจ๋ธ

๊ฐœ๋…

  • ์„œ๋ฒ„๊ฐ€ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์ฆ‰์‹œ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ์ดํ„ฐ ์ „์†ก
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง€์†์ ์œผ๋กœ ์š”์ฒญํ•  ํ•„์š” ์—†์Œ
  • ์‹ค์‹œ๊ฐ„์„ฑ์ด ํ•„์š”ํ•œ ์„œ๋น„์Šค์— ์ ํ•ฉ
[Server] -- ์ด๋ฒคํŠธ ๋ฐœ์ƒ --> ์ฆ‰์‹œ [Client]์— ์ „๋‹ฌ

6.1 ์ž‘๋™ ๋ฐฉ์‹

  1. ์—ฐ๊ฒฐ ์„ค์ •
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์™€ ์ง€์† ์—ฐ๊ฒฐ(WebSocket, TCP ๋“ฑ) ์ƒ์„ฑ
  2. ์ด๋ฒคํŠธ ๋ฐœ์ƒ
    • ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์ฆ‰์‹œ ๋ฐ์ดํ„ฐ ์ „์†ก
  3. ์ˆ˜์‹  ์ฒ˜๋ฆฌ
    • ํด๋ผ์ด์–ธํŠธ๋Š” ์ˆ˜์‹  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

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'));

๋™์ž‘ ํ๋ฆ„

  1. ์‚ฌ์šฉ์ž ์—ฐ๊ฒฐ โ†’ connection ์ด๋ฒคํŠธ ๋ฐœ์ƒ
  2. ๋ฉ”์‹œ์ง€ ์ „์†ก โ†’ ์„œ๋ฒ„๊ฐ€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์— ํ‘ธ์‹œ
  3. ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ์ข…๋ฃŒ โ†’ ๋ฐฐ์—ด์—์„œ ์ œ๊ฑฐ

์‚ฌ์šฉ ์˜ˆ์‹œ (๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”)

// ์—ฐ๊ฒฐ
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 ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค.

profile
okorion's Tech Study Blog.

0๊ฐœ์˜ ๋Œ“๊ธ€