๐Ÿ“ก Server-Sent Events (SSE)๋ž€?

  • ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์ด๋ฒคํŠธ๋ฅผ ์ „์†กํ•˜๋Š” ์›น ๊ธฐ์ˆ ๋กœ, ์„œ๋ฒ„์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—…๋ฐ์ดํŠธ๋‚˜ ์•Œ๋ฆผ ๋“ฑ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๋Š” HTTP ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด SSE ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ณ , ์„œ๋ฒ„๋Š” HTTP ์‘๋‹ต์„ ์œ ์ง€ํ•œ ์ƒํƒœ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค.
  • ์žฌ์—ฐ๊ฒฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ๊ฒฐ์ด ๋Š์–ด์กŒ์„ ๋•Œ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•œ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๊ณ , ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์—๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

SSE vs. WebSocket

WebSocket๊ณผ์˜ ์ฐจ์ด์ 

  • ๋ฐ์ดํ„ฐ ํ๋ฆ„

    • SSE์™€ WebSocket์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์ด๋‹ค.
    • SSE๋Š” ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹  ๋ฐฉ์‹์ด๋‹ค.
    • WebSocket์€ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ์ง€์›ํ•˜์—ฌ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋กœ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ, SSE๋Š” ์ฃผ๋กœ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์ผ๋ฐฉ์ ์ธ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ํ•„์š”ํ•œ ์ฃผ๊ฐ€ ์—…๋ฐ์ดํŠธ๋‚˜ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€์— ์ ํ•ฉํ•˜๊ณ , WebSocket์€ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์ด ํ•„์š”ํ•œ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๋“ฑ์— ์‚ฌ์šฉ๋œ๋‹ค.
  • ํ”„๋กœํ† ์ฝœ

    • SSE๋Š” ์›น ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์— HTTP ํ”„๋กœํ† ์ฝœ ์œ„์—์„œ ๋™์ž‘ํ•œ๋‹ค.
    • ๋˜ํ•œ, HTTP ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•œ ์ƒํƒœ์—์„œ ์žฌ์—ฐ๊ฒฐ์ด๋‚˜ ์ถ”๊ฐ€ ์„ค์ • ์—†์ด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ง€์†์ ์ธ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฐ˜๋ฉด, WebSocket์€ ๋…๋ฆฝ์ ์ธ ํ”„๋กœํ† ์ฝœ(ws://, wss://) ์„ ์‚ฌ์šฉํ•˜๊ณ , HTTP์™€๋Š” ๋ณ„๋„์˜ ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค.
  • ๊ธฐํƒ€

    • SSE๋Š” CORS(Cross-Origin Resource Sharing) ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • WebSocket๋„ ๋™์ผํ•œ ๋„๋ฉ”์ธ ๊ฐ„ ํ†ต์‹ ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ์ถ”๊ฐ€ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ตฌ๋ถ„Server-Sent Events (SSE)WebSocket
ํ†ต์‹  ๋ฐฉํ–ฅ๋‹จ๋ฐฉํ–ฅ (์„œ๋ฒ„ โ†’ ํด๋ผ์ด์–ธํŠธ)์–‘๋ฐฉํ–ฅ (์„œ๋ฒ„ โ†” ํด๋ผ์ด์–ธํŠธ)
ํ”„๋กœํ† ์ฝœHTTP/HTTPSWS/WSS (๋…๋ฆฝ ํ”„๋กœํ† ์ฝœ)
์ž๋™ ์žฌ์—ฐ๊ฒฐ๋‚ด์žฅ ๊ธฐ๋Šฅ์œผ๋กœ ์ง€์›์ง์ ‘ ๊ตฌํ˜„ ํ•„์š”
์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ, ์ฃผ๊ฐ€/๋‚ ์”จ ์—…๋ฐ์ดํŠธ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…, ์˜จ๋ผ์ธ ๊ฒŒ์ž„

๐Ÿ” ํ†ต์‹  ํ”„๋กœ์„ธ์Šค ์„ค๋ช…

  1. ํด๋ผ์ด์–ธํŠธ ์ดˆ๊ธฐํ™”: ํด๋ผ์ด์–ธํŠธ๊ฐ€ EventSource ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์„œ๋ฒ„์˜ SSE ์—”๋“œํฌ์ธํŠธ(/api/events)์— ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  2. ์„œ๋ฒ„ ์„ค์ •: ์„œ๋ฒ„๋Š” Content-Type์„ text/event-stream์œผ๋กœ ์„ค์ •ํ•˜๊ณ , ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Cache-Control๊ณผ Connection ํ—ค๋”๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ฐ์ดํ„ฐ ์ „์†ก: ์„œ๋ฒ„๋Š” ์ผ์ • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” 1์ดˆ๋งˆ๋‹ค ํ˜„์žฌ ์‹œ๊ฐ„์„ JSON ํ˜•์‹์œผ๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  4. ์ด๋ฒคํŠธ ์ˆ˜์‹ : ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ , onmessage ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ˆ˜์‹ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  5. ์—ฐ๊ฒฐ ์ข…๋ฃŒ: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋– ๋‚˜๊ฑฐ๋‚˜ ์—ฐ๊ฒฐ์ด ์ข…๋ฃŒ๋˜๋ฉด EventSource ๊ฐ์ฒด๋Š” close ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.