FastAPI
โข
FastAPI๋ ํ๋์ ์ธ ๊ณ ์ฑ๋ฅ ์น ํ๋ ์์ํฌ๋ก, Python์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค.
โข
FastAPI๋ ๋น ๋ฅธ ๊ฐ๋ฐ ์๋์ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ํนํ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ์ฌ ํจ์จ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์ ์ ๋ฆฌํ๋ค.
์ฃผ์ ํน์ง
1.
๊ณ ์ฑ๋ฅ
โข
FastAPI๋ ASGI(Asynchronous Server Gateway Interface) ํ์ค์ ๋ฐ๋ฅด๋ฉฐ, Uvicorn ๋๋ Hypercorn๊ณผ ๊ฐ์ ๊ณ ์ฑ๋ฅ ASGI ์๋ฒ์ ํจ๊ป ์ฌ์ฉ๋๋ค.
โข
๋น๋๊ธฐ I/O๋ฅผ ํ์ฉํ์ฌ ๋์ ์ฒ๋ฆฌ๋๊ณผ ๋ฎ์ ๋๊ธฐ ์๊ฐ์ ์ ๊ณตํ๋ค.
2.
์๋ํ๋ ๋ฐ์ดํฐ ๊ฒ์ฆ ๋ฐ ๋ฌธ์ํ
โข
FastAPI๋ Pydantic์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๊ฒ์ฆ์ ์๋ํํ๋ค.
โข
OpenAPI์ JSON Schema๋ฅผ ์๋์ผ๋ก ์์ฑํ์ฌ, API ๋ฌธ์๋ฅผ ์ฝ๊ฒ ์์ฑํ๊ณ ์ ์งํ ์ ์๋ค.
3.
๋น ๋ฅธ ๊ฐ๋ฐ ์๋
โข
๊ฐ๊ฒฐํ๊ณ ์ง๊ด์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ด ๊ฐ๋ฐ ์๋๊ฐ ๋น ๋ฅด๋ค.
โข
ํ์
ํํ
์ ์ฌ์ฉํ์ฌ IDE์ ์๋ ์์ฑ ๊ธฐ๋ฅ์ ์ต๋ํ ํ์ฉํ ์ ์๋ค.
4.
๋น๋๊ธฐ ์ง์
โข
Python์ ๋น๋๊ธฐ ๊ธฐ๋ฅ(Async/Await)์ ์๋ฒฝํ ์ง์ํ์ฌ, ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ํฉํ๋ค.
5.
๋ณด์
โข
OAuth2, JWT ๋ฑ์ ์ธ์ฆ ์์คํ
์ ์ฝ๊ฒ ํตํฉํ ์ ์๋ค.
โข
CORS, CSRF ๋ฑ์ ๋ณด์ ๊ธฐ๋ฅ๋ ์ฝ๊ฒ ์ค์ ํ ์ ์๋ค.
์ค์น ๋ฐ ๊ธฐ๋ณธ ์ฌ์ฉ ์์
โข
FastAPI๋ฅผ ์ค์นํ๋ ค๋ฉด pip๋ฅผ ์ฌ์ฉํ๋ค.
pip install fastapi uvicorn
Shell
๋ณต์ฌ
โข
FastAPI ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฑํ๋ ๊ธฐ๋ณธ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
Python
๋ณต์ฌ
โข
์ด ์ ํ๋ฆฌ์ผ์ด์
์ Uvicorn์ ์ฌ์ฉํ์ฌ ์คํํ๋ ค๋ฉด ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ค.
uvicorn main:app --reload
Shell
๋ณต์ฌ
โข
์ ๋ช
๋ น์ด๋ main.py ํ์ผ์ app ๊ฐ์ฒด๋ฅผ ์คํํ๊ณ , ์ฝ๋ ๋ณ๊ฒฝ ์ ์๋์ผ๋ก ์๋ฒ๋ฅผ ์ฌ์์ํ๋ค.
API ๋ฌธ์
โข
FastAPI๋ ์๋์ผ๋ก API ๋ฌธ์๋ฅผ ์์ฑํ๋ค.
โข
์๋ฒ๋ฅผ ์คํํ ํ ๋ธ๋ผ์ฐ์ ์์ ๋ค์ URL๋ก ์ ์ํ ์ ์๋ค:
โฆ
Swagger UI: http://127.0.0.1:8000/docs
โฆ
Redoc: http://127.0.0.1:8000/redoc
๊ณ ๊ธ ๊ธฐ๋ฅ
โข
FastAPI๋ ๋ค์๊ณผ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ ์ ๊ณตํ๋ค.
โฆ
๊ฒฝ๋ก ์์
(Path Operations): ๋ค์ํ HTTP ๋ฉ์๋(GET, POST, PUT, DELETE ๋ฑ)๋ฅผ ์ง์ํ๋ ๊ฒฝ๋ก ์์
์ ์ ์ํ ์ ์๋ค.
โฆ
์์กด์ฑ ์ฃผ์
: ์์กด์ฑ ์ฃผ์
์ ํตํด ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ํ
์คํธ ์ฉ์ด์ฑ์ ๋์ผ ์ ์๋ค.
โฆ
๋ฐฑ๊ทธ๋ผ์ด๋ ์์
: ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํํ ์์
์ ์ ์ํ๊ณ ๊ด๋ฆฌํ ์ ์๋ค.
โฆ
์น์์ผ: ์ค์๊ฐ ํต์ ์ ์ํ ์น์์ผ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
์์ฝ
โข
FastAPI๋ ํ๋์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ก, ๋์ ์ฑ๋ฅ๊ณผ ํธ๋ฆฌํ ๊ฐ๋ฐ ๊ฒฝํ์ ์ ๊ณตํ๋ค.
โข
ํนํ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์๋ํ๋ ๋ฐ์ดํฐ ๊ฒ์ฆ ๋ฐ ๋ฌธ์ํ ๊ธฐ๋ฅ์ด ๋ฐ์ด๋, ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๋ค.
Uvicorn
โข
Uvicorn์ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
1.
ASGI ์๋ฒ: Uvicorn์ ASGI(Asynchronous Server Gateway Interface)๋ฅผ ๊ตฌํํ ์๋ฒ๋ก, ๋น๋๊ธฐ Python ์น ํ๋ ์์ํฌ(์: FastAPI, Starlette)๋ฅผ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ASGI๋ WSGI์ ๋น๋๊ธฐ ๋ฒ์ ์ผ๋ก, ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ์ฌ ๋ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํ๋ค.
2.
๊ณ ์ฑ๋ฅ: Uvicorn์ Cython๊ณผ ํจ๊ป ๊ตฌํ๋์ด ๋งค์ฐ ๋น ๋ฅธ ์๋๋ฅผ ์๋ํ๋ค. ์ด๋ ๋์ ์ฒ๋ฆฌ๋๊ณผ ๋ฎ์ ๋๊ธฐ ์๊ฐ์ ์๊ตฌํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ํฉํ๋ค.
3.
๊ฐํธํ ์ฌ์ฉ: ์ค์ ๊ณผ ์ฌ์ฉ์ด ๊ฐํธํ๋ฉฐ, ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ ํ๊ฒฝ์์ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ค.
์ฃผ์ ํน์ง
โข
HTTP/2 ๋ฐ WebSocket ์ง์: HTTP/2์ WebSocket์ ์ง์ํ์ฌ ์ค์๊ฐ ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์ ์ ๋ฆฌํ๋ค.
โข
์๋ ๋ฆฌ๋ก๋ฉ: ๊ฐ๋ฐ ์ค ์ฝ๋ ๋ณ๊ฒฝ ์ ์๋ฒ๋ฅผ ์๋์ผ๋ก ์ฌ์์ํ์ฌ ๊ฐ๋ฐ ํธ์์ฑ์ ๋์ธ๋ค.
โข
๊ณ ์ฑ๋ฅ ๋น๋๊ธฐ ์ฒ๋ฆฌ: ๋น๋๊ธฐ I/O๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ ๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์๋ค.
โข
์ ์ฐ์ฑ: ๋ค์ํ Python ์น ํ๋ ์์ํฌ์ ํจ๊ป ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ASGI ํ์ค์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ํธํ์ฑ์ด ์ข๋ค.
์ค์น ๋ฐ ์ฌ์ฉ ์์
โข
Uvicorn์ pip๋ฅผ ํตํด ์ค์นํ ์ ์๋ค.
pip install uvicorn
Shell
๋ณต์ฌ
โข
Uvicorn์ ์ฌ์ฉํ์ฌ FastAPI ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
Python
๋ณต์ฌ
โข
์์ ๊ฐ์ FastAPI ์ ํ๋ฆฌ์ผ์ด์
์ Uvicorn์ผ๋ก ์คํํ๋ ค๋ฉด ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ค:
uvicorn main:app --reload
Shell
๋ณต์ฌ
โข
-reload ์ต์
์ ์ฝ๋ ๋ณ๊ฒฝ ์ ์๋ฒ๋ฅผ ์๋์ผ๋ก ์ฌ์์ํ๋ ๊ฐ๋ฐ ๋ชจ๋ ์ต์
์ด๋ค.
์์ฝ
โข
Uvicorn์ Python ๋น๋๊ธฐ ์น ํ๋ ์์ํฌ๋ฅผ ์ํ ๊ณ ์ฑ๋ฅ ASGI ์๋ฒ๋ก, ๊ฐํธํ ์ค์ ๊ณผ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํ๋ค.
โข
FastAPI, Starlette ๋ฑ๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ ํ๋์ ์ธ ๋น๋๊ธฐ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ๋ ๋ฐ ์ ํฉํ๋ค.
์๋
ํ์ธ์
โข
ํ๊ตญ์ ์๊ธฐ์ ์ฐ๊ตฌ์ ๊น์๊ด์
๋๋ค.
โข
๊ด๋ จ ๊ธฐ์ ๋ฌธ์์ R&D ๊ณต๋ ์ฐ๊ตฌ ์ฌ์
๊ด๋ จ ๋ฌธ์๋ โglory@keti.re.krโ๋ก ์ฐ๋ฝ ๋ถํ๋๋ฆฝ๋๋ค.
Hello 
โข
I'm Yeonggwang Kim from the Korea Electronics Research Institute.
โข
For technical and business inquiries, please contact me at โglory@keti.re.krโ



