[Python] REST API ๊ฐ๋ฐ๋ก ์์๋ณด๋ WSGI, ASGI
REST API ์๋ฒ๋ฅผ ๊ฐ๋ฐํ๊ธฐ ์ํด์๋ ์ด์ ํน์ ์ธ์ด๋ฅผ ๋ฐฐ์์ผ ํ ํ์ ์์ด ์ํ๋ ์ธ์ด๋ก ์์ ๋กญ๊ฒ ๊ฐ๋ฐํ ์ ์๋ ์ธ์์ด ์ค๊ฒ ๋์์ต๋๋ค.
Python ์ธ์ด ๋ํ ๋ค์ํ ํ๋ ์์ํฌ๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ REST API ์๋ฒ๋ฅผ ์ฝ๊ฒ ๊ฐ๋ฐํ ์ ์๋๋ฐ์. ์ด๋ฅผ ์ ๊ณตํ๋ ๋ค์ํ ํ๋ ์์ํฌ๊ฐ ๋ง์ด ์กด์ฌํ์ง๋ง ๊ทธ ์ค ๊ฐ์ฅ ๋ณดํธํ ๋์ด ์๋ ค์ง ํ๋ ์์ํฌ๋ ์๋์ ๋ ๊ฐ์ง ์ผ ๊ฒ์ ๋๋ค.
- Django
- Flask
Django๋ MTV ํจํด์ ์ ๊ณตํ์ฌ API ๋ฟ๋ง ์๋๋ผ ํ ํ๋ฆฟ์ ์ด์ฉํ์ฌ ์ ์ HTML ํ์ผ์ ์์ฑํด ๋ทฐ๋ฅผ ๋ง๋ค ์ ์๋๋ก ์ ๊ณตํ์ฌ ๋น ๋ฅธ ๊ฐ๋ฐ์ ํตํด ๋์ ์์ฐ์ฑ์ ์๋ํ๋ ํ๋ ์์ํฌ์ ๋๋ค. ๋ฐ๋ฉด Flask๋ ์ค์ง API๋ง์ ์ฝ๊ฒ ์ ๊ณตํ์ฌ ๋น ๋ฅธ API ์๋ฒ๋ง์ ๋ง๋ค ์ ์๋๋ก ์ ๊ณตํ๋ ๊ฒ์ด ํน์ง์ด์ฃ .
Spring ๊ณ์ด์์๋ ์ด๋ ๊ฒ ๋ง๋ค์ด์ง ์น ์๋น์ค๋ฅผ Tomcat ๋ฑ์ WAS๋ก ๋ฐฐํฌ๋ฅผ ํ๊ฒ ๋๋๋ฐ์. ๊ณต๊ต๋กญ๊ฒ๋ Python์์๋ ์ด๋ฌํ WAS๋ฅผ ์ ๊ณตํด์ฃผ์ง ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก ์น ์๋ฒ์ Python ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฐ๊ฒฐํ ์ ์์๊น์?
CGI์ FastCGI
์ธ๋ถ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์น ์๋ฒ(nginx, Apache ๋ฑ)์ ์ฐ๊ฒฐํ ๋ ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค๋ก ๋ณดํต CGI๋ฅผ ์ฌ์ฉํฉ๋๋ค CGI๋ Common Gateway Interface์ ์ฝ์๋ก ์น ์๋ฒ์ ์ธ๋ถ ํ๋ก๊ทธ๋จ์ ์ฐ๊ฒฐํด์ฃผ๋ ํ์คํ๋ ํ๋กํ ์ฝ์ ๋๋ค.
์ด๋ฌํ ๋ชจํ์ ์น ์๋น์ค์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ชจ์ต์ด์ง๋ง ๊ณผ๊ฑฐ์๋ ์ ์ HTML ํ์ผ ํ๋๋ฅผ ๊ฐ์ง๊ณ ์น ์๋น์ค๋ฅผ ํ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์์(CGI)๊ฐ ํ์ํ์ง ์์์ต๋๋ค. ์น ์๋ฒ๊ฐ ์ ์ ํ์ผ ๋ฑ์ ์ฌ์ฉ์์๊ฒ ๋ค์ด๋ก๋ ๋ฐฉ์์ผ๋ก ์ ๊ณตํ๋ ๊ฒ์ด ์ ๋ถ์ธ๋ฐ, ์น์ ๋ํ ์์๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ์ ์น ์๋ฒ๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ์ ๋ณด๊ฐ ์์ฒญ๋์์ ๊ฒฝ์ฐ ๊ทธ ์ฒ๋ฆฌ๋ฅผ ์ธ๋ถ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ ์ ์๋๋ก ํธ์ถํจ์ผ๋ก์จ ์ค๊ณ ์ญํ ์ ํด์ค๋๋ค.
๊ทธ๋ฌ๋ CGI๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ฐ์ํ ๋๋ง๋ค ํ๋ก์ธ์ค๋ฅผ ์ถ๊ฐ๋ก ์์ฑํ๊ณ ์ญ์ ํ๊ฒ ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ค์์ ์ฌ์ฉ์๊ฐ ๋์์ ์์ฒญํ ๊ฒฝ์ฐ ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๊ณ , ์ญ์ ํ๋ ๊ฒ์ด ๋น๋ฒํด์ง๋๋ฐ ์ด๋ ์ปค๋ ๋ฆฌ์์ค๋ฅผ ๊ณ์ ์์ฑ/์ญ์ ํ๊ธฐ ๋๋ฌธ์ ์ค๋ฒํค๋๊ฐ ์ฌํด์ง๊ณ , ์ฑ๋ฅ ์ ํ์ ์์ธ์ด ๋๊ธฐ๋ ํฉ๋๋ค.
ํ๋์ ์น ์๋น์ค์ฒ๋ผ ๋น๋ฒํ๊ฒ REST API๊ฐ ํธ์ถ ๋๊ณ , ์์ฒญ๊ณผ ์๋ต์ ์์๋ก ๋ฐ๋ณตํ์ฌ ์ฒ๋ฆฌํ๋ ๊ณณ์์ ์ด๋ฌํ ์ํคํ ์ฒ๋ ๋ง์ง ์์ต๋๋ค. ๊ทธ๋์ ์๊ธด ๊ฒ์ด ๋ฐ๋ก FastCGI ์ ๋๋ค.
FastCGI๋ ๋ช ๋ฒ์ ์์ฒญ์ด ๋ค์ด์๋ ํ๋์ ํ๋ก์ธ์ค๋ง์ ๊ฐ์ง๊ณ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค. ์ฆ ๋ฉ๋ชจ๋ฆฌ์ ๋จ ํ๋์ ํ๋ก๊ทธ๋จ๋ง์ ์ ์ฌํ์ฌ ๊ณ์ ์ฌํ์ฉํ๊ธฐ ๋๋ฌธ์ CGI์ ๋นํ์ฌ ์ค๋ฒํค๋๊ฐ ์๋ฑํ๊ฒ ๊ฐ์ํฉ๋๋ค.
Java์ Tomcat ๋ํ Web Server + FastCGI๋ฅผ ์ฑํํ ํํ๋ก ๋ค์์ ์ฌ์ฉ์ ์ ์์ ์ ๋ฆฌํฉ๋๋ค. ์ฐ๋ฆฌ๋ JVM ๊ณ์ด์ ์ธ์ด๋ก ์๋ฒ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ฉด JBoss, Tomcat ๋ฑ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋ณดํธ์ ์ด์ง๋ง ์ด ์ธ์๋ ์ฐ๋ฆฌ๊ฐ CGI๋ฅผ ์๋์ผ๋ก ๋ถ์ฌ์ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ๋ ์์์ต๋๋ค.
๊ทธ๋ฌ๋ Python์์๋ ์ด๋ฌํ WAS๊ฐ ๋ณ๋๋ก ์กด์ฌํ์ง ์์ผ๋ฉฐ ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๊ฐ CGI, FastCGI ๋ฑ์ ์ด์ฉํด์ ์ํ๋ WAS ํํ๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํด์ผ ํ๋๋ฐ, ์ค์ ๋ก Python์์๋ Python๋ง์ ๊ฒ์ดํธ์จ์ด ์ธํฐํ์ด์ค๊ฐ ์กด์ฌํฉ๋๋ค.
WSGI
Python ์ ํ๋ฆฌ์ผ์ด์ , ์คํฌ๋ฆฝํธ๊ฐ ์น ์๋ฒ์ ํต์ ํ๊ธฐ ์ํ ์ธํฐํ์ด์ค๋ก์จ CGI ๋์์ธ ํจํด์ ๋ชจํ๋ก ํ์ฌ ๋ง๋ค์ด์ง ๊ฒ์ด์ง๋ง ์ค์ CGI์๋ ๋ค์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
Python Web App์ MTV ํจํด๊ณผ ๊ฐ์ด ๋ทฐ๊ฐ ๋์์ ์ ์ฉ๋๋ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ์ ๋ ๋ชจ์ต์ ๊ฐ์ด ๊ทธ๋ ค๋ดค์ต๋๋ค. WSGI๋ CGI์ ๋์ผํ๊ฒ ์น ์๋ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ค๊ฐ์ ์์นํ๋๋ฐ, CGI์ ๋ค๋ฅธ ์ ์ CGI๋ ๋งค ์์ฒญ๋ง๋ค ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ค๋ ์ ์ด๊ณ , WSGI๋ ํ ํ๋ก์ธ์ค์์ ๋ชจ๋ ์์ฒญ์ ๋ฐ๋๋ค๋ ๊ฒ์ ๋๋ค. ์ข ๋ ๋ํ ์ผํ๊ฒ ์ค๋ช ์ ๋๋ฆฌ์๋ฉด CGI๋ ๋งค ์์ฒญ๋ง๋ค Fork ๋ฑ์ ํจ์๋ฅผ ํตํด ์ปค๋ ๋ฆฌ์์ค๋ฅผ ์ถ๊ฐ/๋ฐ๋ฉํ๊ณ , WSGI๋ ๋ง์ ์์ฒญ์ ์ฝ๋ฐฑ(callback)์ผ๋ก ๋ฐ์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
์ด๋ฌํ WSGI๋ก ๋ํ์ ์ธ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
- nginx, apache์์ ๋ด์ฅ ๋ชจ๋๋ก ์ ๊ณตํ๋ server-often high profile ๋ฐฉ์ (ex: mod-wsgi, mod-python ๋ฑ)
- Python ์ฝ๋๋ก ์์ฑ๋ Web App Server (ex: gunicorn, cherrypy ๋ฑ)
๊ฒฐ๊ตญ WSGI๋ ์น ์๋ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ด์ ๋ฏธ๋ค์จ์ด ์ญํ ์ ํ๋ฉฐ ๊ธฐ์ ์ ์ผ๋ก๋ ์น ์๋ฒ๋ WSGI์ ๋ํ ์๋ ์ฝ๋๊ฐ ํ์ํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ๋ํ WSGI์ ๋ํ ์๋ ์ฝ๋๊ฐ ํ์ํ Client-Server Model์ ์์ฉํ ๊ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค. ์ข ๋ ๊ฐ๋จํ ์ค๋ช ํด๋ณด์๋ฉด, ์น ์๋ฒ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋๋ฅผ ์ง์ ์ ์ผ๋ก ์ฝ์ ์ ์์ผ๋ฏ๋ก ์ค๊ฐ์ ๋ฏธ๋ค์จ์ด๊ฐ ํด๋น ์ฝ๋๋ฅผ ์ฝ์ด์ ๊ฒฐ๊ณผ๋ฅผ ๋์ ๋ฐํํด์ฃผ๋ ๋ ์์ด๋ผ๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
ASGI
WSGI๋ง์ผ๋ก๋ ์ฐ๋ฆฌ๋ ์ถฉ๋ถํ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์น ์๋ฒ๊ฐ ๋ฐ์ ๋ด ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ฌ ์ ์๋๋ก ๊ตฌ์ฑํ ์ ์์์ต๋๋ค. ํ์ง๋ง ๊ณต๊ต๋กญ๊ฒ๋ ์ด๊ฒ๋ง์ผ๋ก๋ ํ๋ ์น ์๋น์ค์ ๋์ฉ๋ ํธ๋ํฝ ์ฒ๋ฆฌ๋ฅผ ์ ์ฐํ๊ฒ ํ๊ธฐ ์ํ ๋ง์กฑ๋ ์กฐ๊ฑด์ ์ถฉ์กฑํ๊ธฐ ์ด๋ ค์ด ์ ์ด ์์ต๋๋ค.
Python์์๋ asyncio, coroutine๊ณผ ๊ฐ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ง์ํฉ๋๋ค. ๊ทธ๋ฌ๋ WSGI๋ ๋๊ธฐ ํจ์ ์ฒ๋ฆฌ๋ง์ ์ง์ํ์ฌ ์ฌ๋ฌ ์์ ์ ๋์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ํ๊ณ๊ฐ ์์ต๋๋ค. ๊ฐ๋ น ํ๋ ์น ์๋น์ค์์๋ ์น ์์ผ ๋ฑ์ ์ฌ์ฉํ ์ค์๊ฐ ์ฑํ ์๋น์ค ๋ฑ์ ํ ์๋ ์๋๋ฐ, WSGI๋ก๋ ์ด๋ฌํ ์๋น์ค๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ด๋ ค์์ด ์๋ ๊ฒ์ด์ฃ .
๋ฌผ๋ก ์๋๋ ๊ฒ์ ์๋๋๋ค. ๋น๋๊ธฐ ํ์ ๊ฐ์ Celery๋ฅผ ์๋ง ํ์ฉํ๋ค๋ฉด ๋์ฉ๋ ํธ๋ํฝ ์ฒ๋ฆฌ๋ฅผ ์๊ตฌํ๋ ์๋น์ค ๊ตฌํ์ด ๋ถ๊ฐ๋ฅํ ๊ฒ์ ์๋์ง๋ง ํธ๋ ์ด์ฑ ๋ฑ๊ณผ ๊ฐ์ ์ ์ง ๋ณด์, ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ์ด ์ฝ์ง ์๋ค๋ ์ ์ด ์์ต๋๋ค.
๋ฐ๋ผ์ ์ต๊ทผ์๋ Django 3.0 ๋ฟ๋ง ์๋๋ผ FastAPI ๋ฑ์ ํ๋ ์์ํฌ์์๋ ASGI ์ธํฐํ์ด์ค๋ฅผ ์ ์ฉํ์์ผ๋ฉฐ ๋ค๋ฐ๋ผ Falcon ํ๋ ์์ํฌ๋ 3.0๋ถํฐ ASGI ๊ฐ๋ฐ์ ๋ค์ด๊ฐ์ต๋๋ค.
์ด์ ์ํคํ ์ฒ๋ก ๋ดค์ ๋๋ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ WSGI์ ๋ค๋ฅด๊ฒ ASGI๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฒญ์ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌํ๋ค๋ ์ ์ด ํฝ๋๋ค. ๋ฐ๋ผ์ WSGI์์๋ ์ง์๋์ง ์๋ Websocket ํ๋กํ ์ฝ๊ณผ HTTP 2.0์ ์ง์ํฉ๋๋ค.
์ด๋ฌํ ๋ํ์ ์ธ ASGI Web App์๋ uvicorn์ด ์์ต๋๋ค. uvicorn์ ASGI ๊ธฐ๋ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ก์จ ๊ทธ ๋ด์ฅ ๋ชจ๋๋ก uvloop์ ์ฌ์ฉํฉ๋๋ค. ์๋ง ๋ค์ด๋ณด์ ๋ถ๋ค์ ์์ค ์๋ ์๊ฒ ์ง๋ง uvloop์์ uv๋ libuv ์ฆ, Javascript V8์์ ์ฌ์ฉ๋๋ ๋น๋๊ธฐ ๋ชจ๋์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค. ASGI๋ Cython ๊ธฐ๋ฐ์ผ๋ก C++ ์ธ์ด๋ก ์์ฑ๋์ด ๋งค์ฐ ๋น ๋ฅธ ์๋๋ฅผ ์ ๊ณตํ๋ค๋ ๊ฒ์ด ํน์ง์ธ๋ฐ๋ค๊ฐ libuv๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ๋ Node.js์ ๊ฐ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์๋๋ฅผ ์ด๋ ์ ๋ ๋๋ฆด ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๋ง์น๋ฉฐ...
Python์ ์ด์ฉํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ดค์ต๋๋ค.
Python์์๋ Java์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ํด ๊ด์ฌ์ ๋ณด์ด๊ณ ์์ผ๋ฉฐ ๊ทธ์ ๋์์ผ๋ก WSGI์ ์์์ธ ASGI๋ฅผ ๊ฐ๋ฐํ์๊ณ , ์ด๋ฏธ ๋ช๋ช ํ๋ ์์ํฌ์์ ์ง์์ ํ๊ณ ์์ต๋๋ค.
์ด์ฉ๋ค๋ณด๋ Python ์ง์์ ์์ ๋ฐฑ์๋ ์๋ฒ ๊ฐ๋ฐ์ ๋งก๊ฒ ๋์์ง๋ง Python๋ Java์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๋ฌ๊ฐ์ง ์ ๊ฒฝ์จ์ค์ผ ํ ๋ถ๋ถ๋ค์ด ๋ง์์ต๋๋ค. ๊ทธ๋ ๋ค๋ณด๋ ์ด๊ฒ์ ๊ฒ ๊ณต๋ถ๋ฅผ ํ๊ฒ ๋์๊ณ , ์ด๋ ๊ฒ ๊ธ์ ์ฐ๊ฒ ๋์๋๋ฐ์. ์ฐจํ Python ํฌ์คํธ๋ก REST API ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ฝ์ง๊ธฐ์ ๋ํด ์ฌ๋ฌ ๊ธ์ ์จ๋ณด๊ณ ์ ํฉ๋๋ค.