๐ [Project] AI ๋ด ์ง์ ๋ง๋ค๊ธฐ: Django์ FastAPI์ ํ์ด๋ธ๋ฆฌ๋ ๋๊ฑฐ
๐๏ธ ์ 'Django + FastAPI' ํ์ด๋ธ๋ฆฌ๋์ธ๊ฐ?
TradeNPU๋ ์ด๋ฏธ 15๊ฐ๊ฐ ๋๋ ์ฑ์ด ๋์๊ฐ๋ ๊ฑฐ๋ํ Django ์ฑ๊ณฝ์ ๋๋ค. ์ฌ๊ธฐ์ ์ค์๊ฐ LLM ํต์ ์ด ๋น๋ฒํ AI ์ง์(MCP ์๋ฒ) ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ์น๊ธฐ์๋ ๋ช ๊ฐ์ง ์ฐ๋ ค๊ฐ ์์์ต๋๋ค.
-
๋๊ธฐ(Sync) vs ๋น๋๊ธฐ(Async): Django๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋๊ธฐ ๋ฐฉ์์ ๋๋ค. ๊ด๋ฆฌ์ ์ ์ฉ API๋ผ๋ฉด ๋ฌธ์ ๊ฐ ์์ง๋ง, ๋ค์์ ์ฌ์ฉ์๊ฐ ๋์์ AI๋ฅผ ํธ์ถํ๋ฉด I/O ๋ณ๋ชฉํ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
-
์๋ฒ ํน์ฌ ๋ฐฉ์ง: ๋ฌด๊ฑฐ์ด Django ์๋ฒ๊ฐ LLM์ ๊ธด ์๋ต ์๊ฐ์ ๊ธฐ๋ค๋ฆฌ๋๋ผ ๋ฆฌ์์ค๋ฅผ ์ ์ ํ๊ฒ ๋๋ ๊ฒ๋ณด๋ค, ๋น๋๊ธฐ์ ์ต์ ํ๋ FastAPI์๊ฒ ์ด ์ญํ ์ ๋งก๊ธฐ๋ ๊ฒ์ด ํจ์ฌ ๊ฒฝ์ ์ ์ ๋๋ค.
์ฒ์์๋ ์๋ก์ด ํ๋ ์์ํฌ๊ฐ ๋ฏ์ค์์ง๋ง, "Django๋ฅผ ์๋ค๋ฉด FastAPI๋ ์์ ์ฃฝ ๋จน๊ธฐ"๋ผ๋ ์กฐ์ธ๋๋ก ๋จ 30๋ถ ๋ง์ ๊ธฐ๋ณธ ์ธํ ์ ๋ง์น ์ ์์์ต๋๋ค. ํ์ด์ฌ ์ํ๊ณ์ ์ ์ฌ์ฑ ๋๋ถ์ ๋น๋๊ธฐ ์๋ฒ์ ์ธ๊ณ๋ก ๋น ๋ฅด๊ฒ ๋ฐ์ ๋ค์์ฃ .
๐ ๏ธ ํธ๋ฌ๋ธ์ํ : Django์ ์ ์ฐ์ FastAPI๋ก ๊ฐ์ ธ์ค๊ธฐ
FastAPI์์ ๊ธฐ์กด Django์ ๋ชจ๋ธ(DB)์ ๊ทธ๋๋ก ์ฐ๋ ค๋ ์์์น ๋ชปํ ์๋ฌ๋ค์ด ํฐ์ ธ ๋์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ์ฉํ ๋ ๊ฐ์ง ํต์ฌ ํ์ ๊ณต์ ํฉ๋๋ค.
-
์ ์ฉ
settings_fastapi.py์์ฑ: FastAPI๊ฐ Django์settings.py๋ฅผ ํต์งธ๋ก ๋ก๋ํ๋ฉด ๋ถํ์ํ ์ฑ๊ณผ ๋ฏธ๋ค์จ์ด๊น์ง ๋ชจ๋ ๋ถ๋ฌ์ค๋ ค๋ค ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ํ์ํ ์ฑ(INSTALLED_APPS)๋ง ๋จ๊ธด ๊ฒฝ๋ํ๋ ์ค์ ํ์ผ์ ๋ณ๋๋ก ๋ง๋ค์ด ์ฐ๊ฒฐํ๋ ๊ฒ์ด ํฌ์ธํธ์ ๋๋ค. -
์ ํํ ๊ฒฝ๋ก ์ง์ : FastAPI๊ฐ Django ๋ชจ๋ธ์ ์ ๊ทผํ ์ ์๋๋ก
apps.py์name์ ํ๋ก์ ํธ๋ช ๊น์ง ํฌํจํ ์ ์ฒด ๊ฒฝ๋ก(์:MyProject.CS)๋ก ์์ ํด์ผ ๋ชจ๋ ์ธ์ ์ค๋ฅ๋ฅผ ํผํ ์ ์์ต๋๋ค.
โ ๏ธ ํ์ค์ ์ธ ๋ฒฝ: ASGI ๋ฐฐํฌ์ WSGI์ ์์กด ์ ๋ต
๊ฐ๋ฐ ์๋ฒ์์๋ ์๋ฒฝํ๋ ๋น๋๊ธฐ ํ๊ฒฝ์ด ๋ผ์ด๋ธ ์๋ฒ ๋ฐฐํฌ ๋จ๊ณ์์ ์ ๋์ด ๊ฑธ๋ ธ์ต๋๋ค. ํ์ฌ ํธ์คํ ์ฌ๊ฐ ASGI๋ฅผ '์คํ์ '์ผ๋ก๋ง ์ง์ํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํธ๋ํฝ ์ ๊ธฐ๋ก์ ๊ฒฝ์ ์ค์ธ TradeNPU์๊ฒ ์๋ฒ ์ ง๋ค์ด์ ์์ ์ ์๋ ์ผ์ด์์ฃ .
์ฌ๊ธฐ์ ์ฐพ์ ์ฐํ ์ ๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-
WSGI์์ ์คํธ๋ฆฌ๋ฐ ๊ตฌํ: Django์
StreamingHttpResponse๋ฅผ ํ์ฉํ๋, ์๋ฒ ์ธก ๋ฒํผ๋ง ์ค์ ์ ์ฝ๋ ๋จ์์ ์ ์ดํ์ฌ ๋น๋๊ธฐ์ ํํ(Streaming)์ ์ฑ๊ณต์์ผฐ์ต๋๋ค. -
DRF๋ฅผ ์ด์ฉํ ๋ฐ์ดํฐ ๊ฐ๊ต: FastAPI ์๋ฒ๊ฐ ์ธ๋ถ ํธ์คํ ์ ์์นํ ๊ฒฝ์ฐ DB ์ง์ ์ฐ๊ฒฐ์ ๋ณด์ ๋ฐ ์คํค๋ง ๊ด๋ฆฌ์ ๋ฆฌ์คํฌ๊ฐ ์์ต๋๋ค. ๋์ Django ์ชฝ์์ DRF(Django REST Framework)๋ก CRUD API๋ฅผ ์ด์ด์ฃผ๊ณ , FastAPI(MCP ์๋ฒ)๊ฐ ์ด๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ ์ ํํ์ต๋๋ค.
๐งญ ๋ง์น๋ฉฐ: ๋ค์ MCP์ ๊ถค๋๋ก
์ํคํ ์ฒ ๊ณ ๋ฏผ ๋๋ฌธ์ ์ ์ ์๊ธธ๋ก ์์ง๋ง, ๊ฒฐ๊ณผ์ ์ผ๋ก '์์ ํ ๋ฐ์ดํฐ ์ ๊ทผ(DRF)'๊ณผ '์ ์ฐํ ๋น๋๊ธฐ ์ฒ๋ฆฌ(FastAPI)'๋ผ๋ ๋ ๋ง๋ฆฌ ํ ๋ผ๋ฅผ ์ก์ ์ค๋น๋ฅผ ๋ง์ณค์ต๋๋ค.
์ด์ ์ธํ๋ผ ๊ณ ๋ฏผ์ ๋ค๋กํ๊ณ , ๋ณธ๊ฒฉ์ ์ผ๋ก AI ์ง์์๊ฒ ์ผ์ ์ํค๊ธฐ ์ํ MCP ์ฝ๋ฉ์ ๋ค์ด๊ฐ๋๋ค. ๊ณผ์ฐ ์ด ํ์ด๋ธ๋ฆฌ๋ ๊ตฌ์กฐ ์์์ AI ์ง์์ด ์ผ๋ง๋ ๊ธฐ๋ฏผํ๊ฒ ์์ง์ฌ์ค์ง, ๋ค์ ๊ธฐ๋ก์์ ๊ณ์ํ๊ฒ ์ต๋๋ค.
๐ก ์๋ด: ์ด ํฌ์คํ ์ ๊ธฐ์กด ๋ค์ด๋ฒ ๋ธ๋ก๊ทธ์ 5, 6ํ์ฐจ ์ฐ์ฌ๋ถ์ ํตํฉํ์ฌ ์ฌ๊ตฌ์ฑํ์ต๋๋ค. ๊ฑฐ๋ํด์ง ๋ ๊ฑฐ์ ์๋ฒ(Django)์ ์ ์ฐํ ๋น๋๊ธฐ ์๋ฒ(FastAPI)๋ฅผ ์ด๋ป๊ฒ ์ฐ๊ฒฐํ๊ณ , ๋ฐฐํฌ ํ๊ฒฝ์ ์ ์ฝ์ ์ด๋ป๊ฒ ๊ทน๋ณตํ๋์ง์ ๋ํ ๊ธฐ๋ก์ ๋๋ค.