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๊ฐ์ฒด) ํ์์ ์ฌ์ฉํ์ธ์.
๊ด๋ จ ๋ฌธ์
- SSE API ๋ง๋ค๊ธฐ - ๋ฐฑ์๋ ๊ตฌํ
- Service ์ฌ์ฉํ๊ธฐ - API ํธ์ถ