Skip to main content
useSSEStream์€ Server-Sent Events(SSE)๋ฅผ ํ†ตํ•œ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ๊ด€๋ฆฌํ•˜๋Š” ํ›…์ž…๋‹ˆ๋‹ค. ์ž๋™ ์žฌ์—ฐ๊ฒฐ, ํƒ€์ž… ์•ˆ์ „ํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ, ์—ฐ๊ฒฐ ์ƒํƒœ ์ถ”์  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๊ธฐ๋Šฅ

์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ

์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ๋‹จ๋ฐฉํ–ฅ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ

์ž๋™ ์žฌ์—ฐ๊ฒฐ

์—ฐ๊ฒฐ ์‹คํŒจ ์‹œ ์ž๋™ ์žฌ์‹œ๋„์„ค์ • ๊ฐ€๋Šฅํ•œ ํšŸ์ˆ˜/๊ฐ„๊ฒฉ

ํƒ€์ž… ์•ˆ์ „

์ด๋ฒคํŠธ๋ณ„ ํƒ€์ž… ์ง€์ •์ œ๋„ค๋ฆญ ๊ธฐ๋ฐ˜

์—ฐ๊ฒฐ ์ƒํƒœ

isConnected, error ์ถ”์ UI ํ”ผ๋“œ๋ฐฑ ๊ฐ€๋Šฅ

SSE๋ž€?

Server-Sent Events๋Š” ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ์ „์†กํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

WebSocket vs SSE

SSE๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  • ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ
  • AI ์‘๋‹ต ์ŠคํŠธ๋ฆฌ๋ฐ (ChatGPT ์Šคํƒ€์ผ)
  • ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ๋ชจ๋‹ˆํ„ฐ๋ง
  • ํŒŒ์ผ ์—…๋กœ๋“œ/์ฒ˜๋ฆฌ ์ง„ํ–‰ ์ƒํ™ฉ
  • ์„œ๋ฒ„ ์ด๋ฒคํŠธ ์•Œ๋ฆผ

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

Import

useSSEStream์€ ํ”„๋กœ์ ํŠธ ์Šค์บํด๋”ฉ ์‹œ ์ƒ์„ฑ๋˜๋Š” sonamu.shared.ts์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. services.generated.ts์—์„œ๋Š” ๊ฐ @stream API์— ๋Œ€ํ•œ ๋ž˜ํผ ํ•จ์ˆ˜๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜๋ฉฐ, ๋‚ด๋ถ€์ ์œผ๋กœ useSSEStream์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํƒ€์ž… ์ •์˜

๊ธฐ๋ณธ ์‚ฌ์šฉ

API ๋ ˆํผ๋Ÿฐ์Šค

useSSEStream

ํŒŒ๋ผ๋ฏธํ„ฐ

url

SSE ์—”๋“œํฌ์ธํŠธ URL์ž…๋‹ˆ๋‹ค.

params

URL ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋  ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

handlers

์ด๋ฒคํŠธ๋ณ„ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
ํŠน์ˆ˜ ์ด๋ฒคํŠธ:
  • end: ์„œ๋ฒ„๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ŠคํŠธ๋ฆผ ์ข…๋ฃŒ๋ฅผ ์•Œ๋ฆด ๋•Œ
  • message: ์ด๋ฒคํŠธ ํƒ€์ž…์ด ์ง€์ •๋˜์ง€ ์•Š์€ ๊ธฐ๋ณธ ๋ฉ”์‹œ์ง€

options

๋ฐ˜ํ™˜๊ฐ’ (SSEStreamState)

์‹ค์ „ ์˜ˆ์ œ

AI ์‘๋‹ต ์ŠคํŠธ๋ฆฌ๋ฐ

ํŒŒ์ผ ์—…๋กœ๋“œ ์ง„ํ–‰ ์ƒํ™ฉ

์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ๋ชจ๋‹ˆํ„ฐ๋ง

๋ฐฑ์—”๋“œ ๊ตฌํ˜„

SSE ์—”๋“œํฌ์ธํŠธ๋Š” @stream ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ ctx.createSSE()๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ SSE API

publish ํ˜•์‹

์˜ˆ์‹œ:
SSE ์—”๋“œํฌ์ธํŠธ ๊ตฌํ˜„์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ SSE ์—”๋“œํฌ์ธํŠธ ๋งŒ๋“ค๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๊ณ ๊ธ‰ ๊ธฐ๋Šฅ

์กฐ๊ฑด๋ถ€ ์—ฐ๊ฒฐ

๋™์  ํŒŒ๋ผ๋ฏธํ„ฐ

์ˆ˜๋™ ์žฌ์—ฐ๊ฒฐ

์—ฌ๋Ÿฌ ์ŠคํŠธ๋ฆผ ๋™์‹œ ์‚ฌ์šฉ

์ฃผ์˜์‚ฌํ•ญ

1. EventSource ์ œํ•œ

  • HTTP/2์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €๋‹น ์ตœ๋Œ€ 6๊ฐœ ์—ฐ๊ฒฐ ์ œํ•œ
  • ๋„ˆ๋ฌด ๋งŽ์€ SSE ์—ฐ๊ฒฐ์„ ๋™์‹œ์— ์—ด์ง€ ๋งˆ์„ธ์š”

2. ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌดํ•œ์ • ๋ˆ„์ ํ•˜์ง€ ๋งˆ์„ธ์š”.

3. ์—๋Ÿฌ ์ฒ˜๋ฆฌ

4. ์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋˜๋ฉด ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐ์ด ๋‹ซํž™๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ

SSE๊ฐ€ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์Œ

์›์ธ: CORS ์„ค์ • ๋˜๋Š” ์—”๋“œํฌ์ธํŠธ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ:

์žฌ์—ฐ๊ฒฐ์ด ๊ณ„์† ์‹คํŒจํ•จ

์›์ธ: ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋˜์—ˆ๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ํ•ด๊ฒฐ: retry์™€ retryInterval์„ ์กฐ์ •ํ•˜๊ฑฐ๋‚˜, ์—๋Ÿฌ UI๋ฅผ ํ‘œ์‹œํ•˜์„ธ์š”.

๋ฐ์ดํ„ฐ๊ฐ€ ํŒŒ์‹ฑ๋˜์ง€ ์•Š์Œ

์›์ธ: ์„œ๋ฒ„์—์„œ JSON์ด ์•„๋‹Œ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก ํ•ด๊ฒฐ: ๋ฐฑ์—”๋“œ์—์„œ sse.publish('์ด๋ฒคํŠธ๋ช…', JSON๊ฐ์ฒด) ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

๊ด€๋ จ ๋ฌธ์„œ