[Python] FastAPI ํ๋ ์์ํฌ๋ฅผ ์ด์ฉํ ๋น๋๊ธฐ REST API ๊ฐ๋ฐ
Python ์ธ์ด๋ฅผ ์ด์ฉํ์ฌ REST API ์๋ฒ๋ฅผ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๊ตญ๋ด ํน์ ๋ง์ ๊ฐ๋ฐ์๋ค์ ์ฌ๋์ ๋ฐ๊ณ ์๋ Django, ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฒผ์ด ํ๋ ์์ํฌ๋ก์จ ๋ง์ด ์ฌ์ฉํ๊ณ ์๋ Flask ๋ฑ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ์.
์ด๋ฒ ๊ธ์์๋ Jetbrains์ IDE ๋๊ตฌ์ธ PyCharm๊ณผ FastAPI ํ๋ ์์ํฌ๋ฅผ ์ด์ฉํด์ REST API ์๋ฒ๋ฅผ ๊ฐ๋ฐํ๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
What is FastAPI?
Python์์๋ ์น ์๋ฒ์ ์ฐ๋ํ๊ธฐ ์ํด WSGI๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ WSGI๋ ๋๊ธฐ ๋ฐฉ์์ผ๋ก ํ๋ก๊ทธ๋จ์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ฏธ๋ฆฌ ๋ค์ด์จ ์์ฒญ์ ์ฒ๋ฆฌํ ๋๊น์ง ๋ค์ ์ฌ๋์ด ๊ณ์ ๊ธฐ๋ค๋ ค์ผ ํ๋ ๋จ์ ์ ๊ฐ์ํด์ผ ํฉ๋๋ค.
FastAPI๋ Starlette์ด๋ผ๋ ๋น๋๊ธฐ ํ๋ ์์ํฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ก๊ณ , ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ก uvloop์ด๋ผ๋ Cython์ผ๋ก ๋ง๋ค์ด์ง libuv ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์์ C ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง๋ค๋ฉด ๋์ฑ ์ข์๊ฒ ์ง๋ง Cython์ผ๋ก ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ libuv๊ฐ ๊ฐ์ง๊ณ ์๋ ์ฑ๋ฅ์ ์ธ ์ฅ์ ์ ์ ๋ถ ์ด์ฉํ ์๋ ์์ด๋ Python์์ ๋งํผ์ ๋น ๋ฅธ ํผํฌ๋จผ์ค๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค.
FastAPI์ ๋ํด์ ๋ ์์๋ณด๊ณ ์ถ์ผ์ ๋ถ๋ค์ ์ ๋งํฌ๋ฅผ ํ ๋ฒ ๋ณด์๋ ๊ฑธ ์ถ์ฒ๋๋ฆฝ๋๋ค.
Recommended Developer
FastAPI๋ Flask๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์์๊ฒ ์ถ์ฒ๋๋ฆฌ๋ ํ๋ ์์ํฌ์ ๋๋ค. ๋ฌด์๋ณด๋ค๋ Flask์์ ๊ฐ๋ฐ ๋ฌธ์๋ฅผ ์๋ํ ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํ๋ ์์ํฌ๋ก Flask Rest Plus๊ฐ ์์๊ณ , ์ด ํ๋ ์์ํฌ๋ ๋ณ๋์ Swagger ๋ฑ์ ์ฌ์ฉํ์ง ์์๋ ์๋์ผ๋ก API ๋ฌธ์๋ฅผ ๋ง๋ค์ด์ฃผ๋ ์ฅ์ ์ ๊ฐ์ง๊ณ ์๋๋ฐ์.
FastAPI๋ ๋ค์๊ณผ ๊ฐ์ Flask-likeํ ํน์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- Decorator์ ํจ์ ์กฐํฉ์ API ๊ฐ๋ฐ
Flask์ ๋์ผํ๊ฒ Decorator๋ฅผ ๊ธฐ๋ฐ์ผ๋ก API๋ฅผ ๊ฐ๋ฐํฉ๋๋ค. - ๊ฐ๋ฐ ๋ฌธ์ ์๋ํ
Flask์์ ๊ฐ๋ฐ ๋ฌธ์๋ฅผ ์๋ํ ํ๊ธฐ ์ํด Flask Rest Plus ๋ํ๋์๋ฅผ ๋ณ๋๋ก ์ค์นํ๋ ๊ฒ์ฒ๋ผ FastAPI์์๋ ์ฝ๊ฒ ๊ฐ๋ฐ ๋ฌธ์๋ฅผ ๋ง๋ค ์ ์๋ ์๋ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. - ์ปจํ
์คํธ ์๋ช
์ฃผ๊ธฐ ์ ๊ณต
Flask์ ๋ง์ฐฌ๊ฐ์ง๋ก Application ์๋ช ์ฃผ๊ธฐ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด๋ฌํ Flask์ ํน์ง๋ค์ ๋ด์ ์ํ๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ Flask์์ ๋น๋๊ธฐ ๊ตฌํ์ ๋ง์ค์ด๊ณ ๊ณ์ ๋ถ๋ค์๊ฒ๋ ์ต๊ณ ์ ์ ํ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
Start in PyCharm
๊ทธ๋ฌ๋ฉด PyCharm์ ์ด์ฉํด์ ๊ฐ๋จํ๊ฒ API๋ฅผ ๋ง๋ค์ด๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
[tool.poetry]
name = "starletteexample"
version = "0.1.0"
description = ""
authors = ["Neon K.I.D <contact@neonkid.xyz>"]
[tool.poetry.dependencies]
python = "^3.8.5"
uvicorn = "^0.13.2"
fastapi = "^0.63.0"
[tool.poetry.dev-dependencies]
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
Poetry๋ฅผ ์ด์ฉํ์ฌ ํ๋ก์ ํธ ํ๊ฒฝ์ ๊ตฌ์ฑํด์ค๋๋ค. ์ ๋ชจ๋ฅด์๊ฒ ๋ค๋ฉด ์๋์ ๋งํฌ๋ฅผ ์ฌ์ฉํ์ฌ Poetry ํ๊ฒฝ์ ๊ตฌ์ฑํด์ฃผ์ธ์.
๊ธฐ๋ณธ์ ์ผ๋ก FastAPI๋ Python 3.6 ์ด์์ด ํ์ํ๋ฉฐ ์๋ฒ ์คํ์ ์ํด uvicorn ์น ์๋ฒ์ FastAPI ํ๋ ์์ํฌ๋ฅผ ์ค์นํด์ค๋๋ค.
import uvicorn
from fastapi import FastAPI
from fastapi.requests import Request
from starlette.responses import JSONResponse
app = FastAPI()
@app.route('/')
async def homepage(req: Request):
return JSONResponse({
'hello': 'world'
})
if __name__ == '__main__':
uvicorn.run(app, port=8000)
app.py ํ์ผ์ ์์ ์ฝ๋๋ฅผ ์ ๋ ฅํด์ฃผ๊ณ , ์๋ฒ๋ฅผ ์คํํฉ๋๋ค.
Test
์์์ ๋ง๋ API๋ฅผ ๊ฐ๋จํ ํ ์คํธ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์๋ฒ์์ ๋์จ ๋ฉ์์ง๋๋ก http://127.0.0.1:8000 ์ฃผ์์ ์ ์ํฉ๋๋ค.
Chrome ์ฐฝ์ด ๋์ค๋ฉด์ ์ฝ๋์์ ์ฃผ์ด์ง๋๋ก hello world๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์์์ ์ค๋ช ๋๋ฆฐ ๊ฒ์ฒ๋ผ ๊ธฐ๋ณธ์ ์ผ๋ก FastAPI๋ ๋ฌธ์ ์๋ํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฌธ์ ์ข ๋ฅ๋ 2๊ฐ์ง์ ์น ์ข ๋ฅ์ OpenAPI JSON ํ์ผ์ ์ ๊ณตํ๋ฉฐ ์น ์ข ๋ฅ๋ Swagger UI์ Redoc์ ์ ๊ณตํฉ๋๋ค. ๋ณด์๋ค์ํผ docs URI๋ก ์ ์ํ๋ฉด Swagger UI๊ฐ ์ ๊ณต๋ฉ๋๋ค.
redoc์ ๊ฒฝ์ฐ๋ redoc URI๋ก ์ ์ํ์๋ฉด ๋ฉ๋๋ค. ์ง๊ธ์ ๋ณด๋ค์ํผ ๋ง๋ API๊ฐ ๋ง์ง ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์์์ ์๋ฌด๋ฐ ๋ด์ฉ์ด ๋์ค์ง ์์ต๋๋ค. ์ฐจํ ๋ค๋ฅธ ๊ธ์์ FastAPI๋ฅผ ๊ฐ์ง๊ณ ์ด๋ป๊ฒ ๋ฌธ์๋ฅผ ์๋ํ ํ ์ ์๋์ง ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ง์น๋ฉฐ..
FastAPI์ ๋ํด์ ๊ฐ๋จํ๊ฒ ์์๋ดค์ต๋๋ค. Python์ ๋ค์ ํผํฌ๋จผ์ค๊ฐ ๋ฎ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ๋๊ฒ ์๊ตฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํด์๋ ๋ง์ ๊ณ ๋ฏผ์ด ํ์ํฉ๋๋ค. ๊ทธ ๋์์ Python ๊ณ์ด์์ ์น ๊ฐ๋ฐ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ๋งค์ฐ ์ด๋ ค์ด ์์์์ง๋ง ์ด๋ฌํ ์ข์ ํ๋ ์์ํฌ๊ฐ ๋์ด์ผ๋ก ์ธํด์ ํ๊ฒฐ ๊ณ ๋ฏผ์ ๋์ด์ค ๊ฒ ๊ฐ๋ค์.
FastAPI๋ ์์์ ์ธ๊ธํ๋๋ก Flask์ ๊ฑฐ์ ๋น์ทํ ์คํ์ผ์ ํ๋ก๊ทธ๋๋ฐ ๋ฌธ๋ฒ์ ๊ฐ์ง๊ณ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ Flask๋ฅผ ํ ๋ฒ ์ฏค ์ฌ์ฉํด๋ณด์ ๋ถ์ด๋ผ๋ฉด ์ฝ๊ฒ ๋ฐฐ์๋ณด์ค ์ ์์ต๋๋ค. ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ํด ํ ๋ฒ ์ฏค ๊ณ ๋ฏผํ๊ณ ๊ณ์ จ๊ฑฐ๋ Java์ Spring์ฒ๋ผ ์๋น์ค ๋ ์ด์ด ๊ตฌํ ํํ๋ก ์น์ ๊ตฌํํด๋ณด์๋ ๋ถ๋ค์๊ฒ ์ถ์ฒ ๋๋ ค๋ด ๋๋ค.