SSE๋?
Server-Sent Events๋ ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ๋จ๋ฐฉํฅ ์ค์๊ฐ ํต์ ์ ์ ๊ณตํ๋ ๊ธฐ์ ์ ๋๋ค.HTTP vs SSE vs WebSocket
๋น๊ตํ
| ํน์ง | HTTP | SSE | WebSocket |
|---|---|---|---|
| ๋ฐฉํฅ | ์์ฒญโ์๋ต | ์๋ฒโํด๋ผ์ด์ธํธ | ์๋ฐฉํฅ |
| ํ๋กํ ์ฝ | HTTP | HTTP | WebSocket |
| ์ฌ์ฐ๊ฒฐ | X | ์๋ | ์๋ |
| ๋ณต์ก๋ | ๋ฎ์ | ์ค๊ฐ | ๋์ |
| ์ฉ๋ | ์ผ๋ฐ API | ์ค์๊ฐ ํธ์ | ์ค์๊ฐ ์ฑํ |
SSE ์ฌ์ฉ ์ฌ๋ก
์ค์๊ฐ ์๋ฆผ
์ ๋ฉ์์ง, ์ข์์, ๋๊ธ ๋ฑ
์งํ ์ํฉ
ํ์ผ ์
๋ก๋, ์์
์ฒ๋ฆฌ ์งํ๋ฅ
๋ผ์ด๋ธ ํผ๋
๋ด์ค ํผ๋, ์์
๋ฏธ๋์ด ์
๋ฐ์ดํธ
๋ชจ๋ํฐ๋ง
์๋ฒ ์ํ, ๋ก๊ทธ ์คํธ๋ฆฌ๋ฐ
๊ธฐ๋ณธ ์ค์
sonamu.config.ts
- SSE ์๋ํฌ์ธํธ ์๋ ๋ฑ๋ก
- ์๋ ์ฌ์ฐ๊ฒฐ ์ง์
- Keep-alive ์๋ ์ ์ก
SSE ํ๋ฌ๊ทธ์ธ ์ต์
- boolean
- SsePluginOptions
๊ฐ๋จํ ํ์ฑํ/๋นํ์ฑํ
SSE ์๋ ๋ฐฉ์
์ฐ๊ฒฐ ํ๋ฆ
HTTP ํค๋
SSE๋ ํน์ํ HTTP ํค๋๋ฅผ ์ฌ์ฉํฉ๋๋ค:text/event-stream: SSE ์ ์ฉ Content-Typeno-cache: ์บ์ฑ ๋ฐฉ์งkeep-alive: ์ฐ๊ฒฐ ์ ์ง
์ค์ ์ค์ ์์
1. ๊ธฐ๋ณธ ์ค์ (๊ถ์ฅ)
2. ๊ฐ๋ฐ/ํ๋ก๋์ ๋ถ๋ฆฌ
3. ์กฐ๊ฑด๋ถ ํ์ฑํ
์์ถ ๋นํ์ฑํ
SSE๋ ์คํธ๋ฆฌ๋ฐ ์๋ต์ด๋ฏ๋ก ์์ถ์ ๋นํ์ฑํํด์ผ ํฉ๋๋ค.CORS ์ค์
SSE๋ฅผ ๋ค๋ฅธ ๋๋ฉ์ธ์์ ์ฌ์ฉํ๋ ค๋ฉด CORS ์ค์ ์ด ํ์ํฉ๋๋ค.credentials: true ์ค์ ํ์
ํ๊ฒฝ๋ณ ์ ๋ต
๊ฐ๋ฐ ํ๊ฒฝ
ํ๋ก๋์ ํ๊ฒฝ
ํ์์์ ์ค์
SSE ์ฐ๊ฒฐ์ ์ฅ์๊ฐ ์ ์ง๋๋ฏ๋ก ํ์์์ ์ค์ ์ด ์ค์ํฉ๋๋ค.connectionTimeout: 0: ์ฐ๊ฒฐ ํ์์์ ๋นํ์ฑํ (SSE๋ ์ฅ์๊ฐ ์ ์ง)keepAliveTimeout: Keep-alive ๊ฐ๊ฒฉ (๊ธฐ๋ณธ๊ฐ: 5์ด)
ํ๋ก์ ์ค์ (Nginx)
Nginx๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ SSE๋ฅผ ์ํ ์ค์ ์ด ํ์ํฉ๋๋ค.proxy_buffering off: ๋ฒํผ๋ง ๋นํ์ฑํ (์ฆ์ ์ ์ก)proxy_cache off: ์บ์ฑ ๋นํ์ฑํproxy_read_timeout 24h: ์ฝ๊ธฐ ํ์์์ (์ฅ์๊ฐ)
๋๋ฒ๊น
๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ
curl ํ ์คํธ
-N: ๋ฒํผ๋ง ๋นํ์ฑํ (์ฆ์ ์ถ๋ ฅ)
์ฃผ์์ฌํญ
๋ธ๋ผ์ฐ์ ์ง์
SSE๋ ๋ชจ๋ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ์ง์๋ฉ๋๋ค:| ๋ธ๋ผ์ฐ์ | ์ง์ |
|---|---|
| Chrome | โ |
| Firefox | โ |
| Safari | โ |
| Edge | โ |
| IE 11 | โ (polyfill ํ์) |