🧠 μ‹€μ‹œκ°„ ν†΅μ‹ μ˜ 두 κ°€μ§€ 방식: Polling vs WebSocket 정리

HMJΒ·2025λ…„ 5μ›” 23일

κ°œλ…μ •λ¦¬

λͺ©λ‘ 보기
7/8

μ‹€μ‹œκ°„ κΈ°λŠ₯이 ν•„μš”ν•œ μ±„νŒ…, μ•Œλ¦Ό, 라이브 데이터 등에선
데이터λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ μ£Όκ³ λ°›λŠ” 방식이 맀우 μ€‘μš”ν•©λ‹ˆλ‹€.
λŒ€ν‘œμ μœΌλ‘œ μ‚¬μš©λ˜λŠ” 방식은 두 κ°€μ§€μž…λ‹ˆλ‹€:

  • πŸ•“ Polling (폴링)
  • πŸ”Œ WebSocket (μ›Ήμ†ŒμΌ“)

이번 글에선 이 두 κ°€μ§€ 방식을 λΉ„κ΅ν•˜κ³ ,
μ–΄λ–€ μƒν™©μ—μ„œ μ–΄λ–€ 방식을 μ‚¬μš©ν•˜λŠ” 게 쒋은지 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.


βœ… 1. 폴링(Polling)μ΄λž€?

μΌμ •ν•œ μ‹œκ°„ κ°„κ²©μœΌλ‘œ μ„œλ²„μ— β€œμƒˆ μ†Œμ‹ μžˆμ–΄μš”?”라고 계속 λ¬Όμ–΄λ³΄λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

폴링은 ν΄λΌμ΄μ–ΈνŠΈκ°€ μ •ν•΄μ§„ μ‹œκ°„λ§ˆλ‹€ μ„œλ²„μ— μš”μ²­μ„ 보내,
μƒˆλ‘œμš΄ 데이터가 μƒκ²ΌλŠ”μ§€ ν™•μΈν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

[ν΄λΌμ΄μ–ΈνŠΈ] β†’ 3μ΄ˆλ§ˆλ‹€ β†’ [μ„œλ²„] "μƒˆ λ©”μ‹œμ§€ μžˆμ–΄?"
[μ„œλ²„] β†’ "μžˆμ–΄!" λ˜λŠ” "μ—†μ–΄~"

πŸ”Ή νŠΉμ§•

  • μ‹€μ‹œκ°„μ²˜λŸΌ λ³΄μ΄μ§€λ§Œ, μ‹€μ œλ‘œλŠ” 주기적으둜 확인

  • κ΅¬ν˜„μ΄ 맀우 간단함 (setInterval만 μ‚¬μš©ν•΄λ„ κ°€λŠ₯)

  • μƒˆλ‘œμš΄ 데이터가 없어도 계속 μš”μ²­ν•˜κ²Œ λ˜μ–΄ μ„œλ²„μ— 뢀담이 될 수 있음


βœ… 2. μ›Ήμ†ŒμΌ“(WebSocket)μ΄λž€?

ν•œ 번 μ—°κ²°ν•˜λ©΄ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ‹€μ‹œκ°„μœΌλ‘œ λ©”μ‹œμ§€λ₯Ό μ£Όκ³ λ°›λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

μ›Ήμ†ŒμΌ“μ€ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•œ 번 μ—°κ²°ν•œ λ’€,
지속적인 연결을 μœ μ§€ν•˜λ©΄μ„œ μ–‘λ°©ν–₯ 톡신이 κ°€λŠ₯ν•œ λ°©μ‹μž…λ‹ˆλ‹€.

[ν΄λΌμ΄μ–ΈνŠΈ] πŸ”— [μ„œλ²„] ←→ μ‹€μ‹œκ°„ λŒ€ν™”

πŸ”Ή νŠΉμ§•

  • μ‹€μ‹œκ°„μ„±μ΄ 맀우 뛰어남 (μ±„νŒ…, μ•Œλ¦Ό λ“± μ¦‰μ‹œ 반영이 ν•„μš”ν•œ κΈ°λŠ₯에 적합)

  • 연결을 μœ μ§€ν•˜κΈ° λ•Œλ¬Έμ— λΆˆν•„μš”ν•œ 반볡 μš”μ²­μ΄ μ—†μŒ

  • 섀정이 λ‹€μ†Œ λ³΅μž‘ν•˜μ§€λ§Œ, 효율적이고 빠름


πŸ” Polling vs WebSocket – 간단 λΉ„κ΅ν‘œ

항볡PollingWebSocket
μž‘λ™ 방식일정 κ°€κ²©λ§ˆλ‹€ μš”μ²­ν•œ 번 μ—°κ²° ν›„ 계속 톡신
μ‹€μ‹œκ°„μ„±λŠλ¦Ό (3~5초 간격)맀우 빠름 (μ¦‰μ‹œ 전솑)
μ„œλ²„ λΆ€λ‹΄μš”μ²­ 많으면 κ³ΌλΆ€ν•˜μ μŒ (지속 μ—°κ²° μœ μ§€)
κ΅¬ν˜„ λ‚œμ΄λ„μ‰½λ‹€ (λ‹¨μˆœν•œ μš”μ²­ 반볡)쀑간 이상 (μ„œλ²„/ν΄λΌμ΄μ–ΈνŠΈ μ„€μ • ν•„μš”)
λΈŒλΌμš°μ € ν˜Έν™˜μ„±λ§€μš° μ’‹μŒμ΅œμ‹  λΈŒλΌμš°μ € λŒ€λΆ€λΆ„ OK
μ‚¬μš© μ˜ˆλ‰΄μŠ€ ν”Όλ“œ, ν…ŒμŠ€νŠΈ μ±„νŒ…μ‹€μ‹œκ°„ μ±„νŒ…, μ•Œλ¦Ό, 주식, κ²Œμž„

πŸ’¬ MEETTY ν”„λ‘œμ νŠΈμ—μ„œμ˜ ν™œμš©

우리 ν”„λ‘œμ νŠΈμΈ MEETTYμ—μ„œλŠ” λ‹€μŒκ³Ό 같은 λ°©μ‹μœΌλ‘œ ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

κΈ°λŠ₯μΆ”μ²œ λ°©μ‹μ΄μœ 
μ±„νŒ…λ°© ν…ŒμŠ€νŠΈPollingλΉ λ₯΄κ³  κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ κ°€λŠ₯
μ‹€μ œ μ±„νŒ…/ν™”μƒμ±„νŒ…WebSocketμ‹€μ‹œκ°„ λ°˜μ‘μ΄ μ€‘μš”ν•¨
읽지 μ•Šμ€ λ©”μ‹œμ§€ 수 확인Polling주기적으둜 ν™•μΈν•˜λ©΄ μΆ©λΆ„
μ°Έμ—¬μž 수 μ‹€μ‹œκ°„ ν‘œμ‹œWebSocketλ³€ν™”κ°€ 생기면 μ¦‰μ‹œ 반영 ν•„μš”

πŸ§ͺ Reactμ—μ„œ Polling κ΅¬ν˜„ μ˜ˆμ‹œ

import { useEffect, useState } from "react";
import axios from "axios";

const ChatPolling = () => {
  const [messages, setMessages] = useState([]);

  useEffect(() => {
    const interval = setInterval(() => {
      axios.get("/api/messages").then((res) => {
        setMessages(res.data);
      });
    }, 3000); // 3μ΄ˆλ§ˆλ‹€ μ„œλ²„μ— μƒˆ λ©”μ‹œμ§€ μš”μ²­
    return () => clearInterval(interval);
  }, []);

  return (
    <div>
      <h2>μ±„νŒ…μ°½</h2>
      {messages.map((msg, idx) => (
        <div key={idx}>{msg.content}</div>
      ))}
    </div>
  );
};

export default ChatPolling;

🐾 마무리 ν•œ λ§ˆλ””

μ •λ¦¬ν•΄λ³΄λ‹ˆ 폴링은 κ΅¬ν˜„μ΄ κ°„λ‹¨ν•΄μ„œ 초반 ν…ŒμŠ€νŠΈμ— μ’‹κ³ ,
μ›Ήμ†ŒμΌ“μ€ μ‹€μ‹œκ°„ λ°˜μ‘μ΄ ν•„μš”ν•œ κΈ°λŠ₯에 더 잘 μ–΄μšΈλ¦°λ‹€λŠ” κ±Έ μ•Œκ²Œ 됐닀.
MEETTY ν”„λ‘œμ νŠΈμ—μ„œλ„ 상황에 맞게 λ‘˜ 쀑 μ μ ˆν•œ 방식을 μ„ νƒν•˜λ©΄ 쒋을 것 κ°™λ‹€.

0개의 λŒ“κΈ€