<aside>
</aside>
์๋ ํ์ธ์! 7๋ถ '๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐ ์ฑ๋ฅ ์ต์ ํ'์ ๋ค ๋ฒ์งธ ์๊ฐ, 35๊ฐ์ ๋๋ค! ๐ฌ
์ง๋ 34๊ฐ์์๋ BackgroundTasks
๋ฅผ ์ฌ์ฉํ์ฌ ์๋ต ์๋๋ฅผ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ์ต๋๋ค. ์์ฒญ ์ฒ๋ฆฌ๊ฐ ๋๋ ํ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ถ๊ฐ ์์
์ ์ํํ์ฃ .
์ด๋ฒ ์๊ฐ์๋ API ํต์ ๋ฐฉ์ ์์ฒด์ ๋ํ ์๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ด์ด๋ด ๋๋ค! ์ง๊ธ๊น์ง ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ HTTP ์์ฒญ-์๋ต ๋ชจ๋ธ์ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ๊ณ ์๋ฒ๊ฐ ์๋ตํ๋ ๋จ๋ฐฉํฅ์ ์ธ ๊ตฌ์กฐ์์ต๋๋ค. ๋ง์ฝ ์ฑํ ์ ํ๋ฆฌ์ผ์ด์ ์ฒ๋ผ ์๋ฒ๊ฐ ๋จผ์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ฑฐ๋, ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ณ์ ์ฃผ๊ณ ๋ฐ์์ผ ํ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ๐ค
์ด๋ฐ ์ค์๊ฐ ์๋ฐฉํฅ ํต์ ์ ์ํด ๋ฑ์ฅํ ๊ธฐ์ ์ด ๋ฐ๋ก WebSocket์
๋๋ค! ์ด๋ฒ ์๊ฐ์๋ WebSocket ํ๋กํ ์ฝ์ ๊ธฐ๋ณธ ๊ฐ๋
์ ์ดํดํ๊ณ , FastAPI์์ @app.websocket
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ WebSocket ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ๊ณ ํด๋ผ์ด์ธํธ์ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ฒ ์ต๋๋ค. ์ค์๊ฐ ๊ธฐ๋ฅ ๊ตฌํ์ ์ฒซ๊ฑธ์์ ํจ๊ป ๋ด๋์ด ๋ด
์๋ค! โ๏ธโจ
๊ธฐ์กด HTTP ์์ฒญ-์๋ต ๋ชจ๋ธ์ ํ๊ณ๋ฅผ ๋์ด, ํด๋ผ์ด์ธํธ-์๋ฒ ๊ฐ ์ค์๊ฐ ์๋ฐฉํฅ(Full-duplex) ํต์ ์ ๊ฐ๋ฅ์ผ ํ๋ WebSocket ํ๋กํ ์ฝ์ FastAPI ํ์ฉ๋ฒ ํ์ต.
๋จผ์ , ์ค์๊ฐ ์ ๋ฐ์ดํธ ์๋๋ฆฌ์ค์์ HTTP ์์ฒญ-์๋ต ๋ฐฉ์(ํด๋ง ๋ฑ)์ ๋นํจ์จ์ฑ ํ์ . WebSocket์ **์ง์์ ์ธ ์ฐ๊ฒฐ(Persistent Connection)**์ ํตํ ๋ฌธ์ ํด๊ฒฐ ์๋ฆฌ ์ดํด.
๋ค์์ผ๋ก, FastAPI @app.websocket()
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ด์ฉํ WebSocket ์๋ํฌ์ธํธ ์ ์ ๋ฐฉ๋ฒ ํ์ต. WebSocket
๊ฐ์ฒด๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์ฐ๊ฒฐ ์๋ฝ(accept
) ๋ฐ ํ
์คํธ/JSON ๋ฐ์ดํฐ ๋น๋๊ธฐ ์ก์์ ์ค์ต.
๋ํ, WebSocketDisconnect
์์ธ ์ฒ๋ฆฌ๋ฅผ ํตํ ์ ์์ ์ธ ์ฐ๊ฒฐ ์ข
๋ฃ ๊ด๋ฆฌ๋ฒ ํ์ต. ๊ฐ๋จํ ์์ฝ(Echo) ์๋ฒ ์์ ๋ก ๊ธฐ๋ณธ ํต์ ํ๋ฆ ๊ตฌํ ๋ฐ ํ
์คํธ. ๋ง์ง๋ง์ผ๋ก ๋ค์ค ํด๋ผ์ด์ธํธ ๊ด๋ฆฌ ๋ฐ ๋ธ๋ก๋์บ์คํธ(Broadcast) ๊ฐ๋
๊ฐ๋ต ์๊ฐ.
์ด ๊ฐ์๋ฅผ ๋ง์น๋ฉด ์ฌ๋ฌ๋ถ์ ๋ค์์ ํ ์ ์๊ฒ ๋ฉ๋๋ค:
@app.websocket()
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ WebSocket ์๋ํฌ์ธํธ ์ ์.WebSocket
๊ฐ์ฒด์ accept()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ ์๋ฝ.WebSocket
๊ฐ์ฒด์ send_text()
, receive_text()
, send_json()
, receive_json()
๋ฑ ๋ฉ์๋๋ฅผ ์ด์ฉํ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์ก์์ .WebSocketDisconnect
์์ธ ์ฒ๋ฆฌ๋ฅผ ํตํ ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ ์ข
๋ฃ ๊ด๋ฆฌ.