1. Server-Sent Events
SSE(Server-Sent Events) ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ฐ๊ฒฐ์ ์ ์งํ ์ฑ, ์๋ฒ์์ ๋ฐ์ํ๋ ์ค์๊ฐ ์ด๋ฒคํธ๋ฅผ ์ง์์ ์ผ๋ก ์ ๋ฌ๋ฐ๋ ๋ฐฉ์
๐ “์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ํ ๋ฒ ์ฐ๊ฒฐ๋ก ์ฌ๋ฌ ๋ฒ ์๋ต์ ๋ณด๋ผ ์ ์๋ HTTP ๊ธฐ๋ฐ ๊ธฐ์ ”
2. SSE ๊ตฌ์กฐ
- ํด๋ผ์ด์ธํธ๋ EventSource ๊ฐ์ฒด๋ฅผ ํตํด ์๋ฒ์ ์์ฒญ์ ๋ณด๋ ๋๋ค.
- ์๋ฒ๋ text/event-stream ํ์ ์ผ๋ก ์๋ต์ ๋ณด๋ด๊ณ ์ฐ๊ฒฐ์ ์ ์งํ ์ฑ ์ฌ๋ฌ ๋ฉ์์ง๋ฅผ ์ ์กํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๊ฐ ๋ฉ์์ง๋ฅผ ์ค์๊ฐ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
# Client
GET /stream HTTP/1.1
Accept: text/event-stream
# Response
event: data
data: Hello, world!
event: final
data: Done!
3. SSE์ WebSocket
๋ฐฉ์ | ์ฐ๊ฒฐ ๋ฐฉํฅ | ์๋ฐฉํฅ | ํน์ง |
SSE | ์๋ฒ → ํด๋ผ์ด์ธํธ | โ | ๊ตฌํ์ด ๊ฐ๋จํ๊ณ ์์ ์ , ๋ธ๋ผ์ฐ์ ์ง์ ์ข์ |
WebSocket | ์๋ฐฉํฅ | โ | ์ค์๊ฐ ์ฑํ , ๊ฒ์ ๋ฑ ์์ ํ ์ค์๊ฐ ํต์ |
4. SSE์ ์ฅ์
1. HTTP ๊ธฐ๋ฐ์ด๋ผ ์ค์ ์ด ์ฌ์
- SSE๋ ๊ธฐ์กด์ ์ฐ๋ HTTP ์์ฒญ/์๋ต ๋ฐฉ์ ๊ทธ๋๋ก ์ฌ์ฉ ๊ฐ๋ฅ
- WebSocket์ฒ๋ผ ๋ณ๋๋ก ๋ณต์กํ ์ฐ๊ฒฐ ์ค์ ์์ด, GET ์์ฒญ ๋ณด๋ด๊ณ ์๋ฒ๊ฐ text/event-stream ํ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ณ์ ๋ณด๋
2.์๋ ์ฌ์ฐ๊ฒฐ ๊ธฐ๋ฅ
- ๋ธ๋ผ์ฐ์ ์์ SSE๋ฅผ ์ฌ์ฉํ ๋, ์๋ฒ์์ ์ฐ๊ฒฐ์ด ๋๊ธฐ๋ฉด ์๋์ผ๋ก ๋ค์ ์ฐ๊ฒฐ
- ๊ฐ๋ฐ์๊ฐ ํน๋ณํ ์ ๊ฒฝ ์ ์จ๋ ๋๋๊น ํธํจ.
3. HTTP/2๋ ์ง์
- HTTP/2๋ ์ต์ ๋ธ๋ผ์ฐ์ ์ ์๋ฒ์์ ์ฌ์ฉํ๋ ๋ ๋น ๋ฅธ HTTP ํ๋กํ ์ฝ์ธ๋ฐ,
- SSE๋ ์ด ํ๊ฒฝ์์๋ ๋ฌธ์ ์์ด ๋์ํจ.
4. ํ๋ก์/NAT ํ๊ฒฝ์์๋ ์ ๋์ํจ
- WebSocket์ ํ๋ก์๋ ๋ฐฉํ๋ฒฝ, ํ์ฌ ๋ด๋ถ๋ง์์ ๋งํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์.
- ๋ฐ๋ฉด SSE๋ ์ผ๋ฐ HTTP ํธ๋ํฝ์ด๋ ๋๊ฐ์ด ์๊ฒผ๊ธฐ ๋๋ฌธ์, ํฌํธ 80(HTTP)์ด๋ 443(HTTPS)์ผ๋ก ๋ฌด๋ฆฌ ์์ด ์ ๋ฌ ๊ฐ๋ฅ.
- ๋ฐฉํ๋ฒฝ์ด๋ ํ์ฌ ๋คํธ์ํฌ ์์์๋ ์ ์๋
5. SSE์ ํ๊ณ
1. ์๋ฒ → ํด๋ผ์ด์ธํธ ๋จ๋ฐฉํฅ๋ง ๊ฐ๋ฅ
- SSE๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธํํ ์ผ๋ฐฉ์ ์ผ๋ก ๋ฐ์ดํฐ๋ง ๋ณด๋ผ ์ ์์.
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ๋ฌด์ธ๊ฐ ์ ์กํ๊ณ ์ถ์ผ๋ฉด ๋ณ๋์ POST๋ WebSocket ๋ฑ์ ๋ฐฉ์์ด ํ์
- ์๋ฐฉํฅ ๋ํ(์ฑํ , ๊ฒ์ ๋ฑ)๋ฅผ ์ํ๋ค๋ฉด WebSocket์ด ๋ ์ ํฉ.
2. ์ค๋๋ ๋ธ๋ผ์ฐ์ ์์๋ ๋์ํ์ง ์์ ์๋ ์์
- ํ๋ ๋ธ๋ผ์ฐ์ (Chrome, Edge, Safari ๋ฑ)๋ SSE๋ฅผ ์ ์ง์ํ์ง๋ง, ์์ฃผ ์ค๋๋ ๋ฒ์ ์ด๋ Internet Explorer์์ ๋์ํ์ง ์์ ์ ์์
3. ๋ธ๋ผ์ฐ์ ํญ์ด ๋ง์ผ๋ฉด ์ฐ๊ฒฐ ์ ์ด๊ณผ ๊ฐ๋ฅ
- ๋ธ๋ผ์ฐ์ ๋ ํ ๋๋ฉ์ธ ๋น ์ ์ง ๊ฐ๋ฅํ ์ฐ๊ฒฐ ์์ ์ ํ ์์
- ์๋ฅผ ๋ค์ด, ํญ 10๊ฐ์์ ๋ชจ๋ SSE ์ฐ๊ฒฐ์ ์ ์งํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ๋ ์ด์ ์ ์ฐ๊ฒฐ์ ๋ชป ๋ง๋ค ์ ์์.
- ๊ทธ๋์ ํญ๋ง๋ค SSE๋ฅผ ์ฐ๋ ๊ฑด ์ฑ๋ฅ์ด๋ ์์ ๊ด๋ฆฌ ์ธก๋ฉด์์ ์ ์
6. FastAPI ์์
from fastapi import FastAPI
from sse_starlette.sse import EventSourceResponse, ServerSentEvent
import asyncio
app = FastAPI()
@app.get("/sse")
async def stream():
async def event_generator():
for i in range(5):
yield ServerSentEvent(
event="progress",
data=f"ํ์ฌ ๋จ๊ณ: {i}",
)
await asyncio.sleep(1)
yield ServerSentEvent(
event="complete",
data="โ
์์
์ด ์๋ฃ๋์์ต๋๋ค!"
)
return EventSourceResponse(event_generator())
'๐ Backend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift + Supabase] OAuth - Sign in with Apple (0) | 2025.04.28 |
---|---|
[FastAPI] Middleware ๋ฏธ๋ค์จ์ด (CORS, Logging) (0) | 2025.04.20 |
[FastAPI] SQLModel (0) | 2025.03.14 |
[FastAPI] Best Practices - Project Structure (0) | 2025.02.14 |
[SQL] SELECT ๊ด๋ จ ํจ์ (0) | 2025.02.05 |