ํน์ง¶
FastAPI ํน์ง¶
FastAPI๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํฉ๋๋ค.
๊ฐ๋ฐฉํ ํ์ค(Open standards) ๊ธฐ๋ฐ¶
- OpenAPI๋ path operations, ํ๋ผ๋ฏธํฐ, body requests, ๋ณด์ ๋ฑ์ ํฌํจํ ๋ค์ํ API ์์ฑ์ ๋ํ ํ์ค์ ๋๋ค.
- Automatic data model documentation with JSON Schema (OpenAPI ์์ฒด๋ JSON Schema ๊ธฐ๋ฐ์ด๋ฏ๋ก).
- ์ด๋ฌํ ํ์ค๋ค์ ์ฒ ์ ํ ์ฐ๊ตฌ๋ฅผ ๋ฐํ์ผ๋ก ์ค๊ณ๋์์ต๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋ค์ํ ์ธ์ด์์ ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๋ฌธ์ ์๋ํ¶
ํ๋ ์์ํฌ๊ฐ OpenAPI์ ๊ธฐ๋ฐํ๊ณ ์๊ธฐ ๋๋ฌธ์, ์ฌ๋ฌ ์ ํ์ง๊ฐ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Interactive API ๋ฌธ์์ ์น ์ ์ ์ธํฐํ์ด์ค ์ ๋ฆฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋ฉ๋๋ค.
- ๋ํํ API ๋ฌธ์๋ก๋ Swagger UI๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์์ API๋ฅผ ์ง์ ํธ์ถํ๊ณ ํ ์คํธํ ์ ์์ต๋๋ค.
- ๋ค๋ฅธ API ๋ฌธ์๋ก๋ ReDoc์ด ์ ๊ณต๋ฉ๋๋ค.
Just Modern Python¶
์ด ๋ชจ๋ ๊ฒ (Pydantic ๋๋ถ์) Python 3.6์ ํ์ ํ์ค ์ ์์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์๋ก ๋ฐฐ์ธ ๊ตฌ๋ฌธ๋ ์์ต๋๋ค. ๊ทธ์ Modern Python ํ์ค์ ๋๋ค.
Python ํ์ ์ ๋ํด์ ์ ๋ชจ๋ฅธ๋ค๋ฉด (FastAPI์ ์ ์ฐ๋๋ผ๋), ์ฌ๊ธฐ ์งง์ ํํ ๋ฆฌ์ผ์ ํ์ธํด๋ณด์ธ์: Python Types.
Python ํ์ ์ ์ฌ์ฉํด์ ์๋์ฒ๋ผ ์์ฑํ ์ ์์ต๋๋ค:
from datetime import date
from pydantic import BaseModel
# ๋ณ์๋ฅผ strํ์ผ๋ก ๋ฐ๊ฒ ๋ค๊ณ ์ ์ธํ๋ฉด
# ์ด์ ์๋ํฐ๋ ํจ์ ๋ด๋ถ์ ๋ณ์๋ ํ์
์ ์ ์ ์์ต๋๋ค
def main(user_id: str):
return user_id
# Pydantic ๋ชจ๋ธ
class User(BaseModel):
id: int
name: str
joined: date
์ด์ ์ด๋ ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค:
my_user: User = User(id=3, name="John Doe", joined="2018-07-19")
second_user_data = {
"id": 4,
"name": "Mary",
"joined": "2018-11-30",
}
my_second_user: User = User(**second_user_data)
์ ๋ณด
**second_user_data
๋ ์๋ฏธํ๋ ๊ฒ์ ์ด๋ ์ต๋๋ค.
second_user_data
๋์
๋๋ฆฌ(dict) ๋ด์ ๋ชจ๋ ํค(key)์ ๊ฐ(value)๋ค์ key-value ํํ์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ถ ๋๊ธด๋ค๋ ๋ป์
๋๋ค. ์ฆ, User(id=4, name="Mary", joined="2018-11-30")
์ ๊ฐ์ ์ฝ๋๊ฐ ๋ฉ๋๋ค.
์๋ํฐ ์ง์¶
๋ชจ๋ ํ๋ ์์ํฌ๋ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ์ง๊ด์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๋ด์ฉ์ ๊ฐ๋ฐ์ ์์ํ๊ธฐ ์ ์ ์ฌ๋ฌ ์๋ํฐ์์ ํ ์คํธ๋ ์ต๊ณ ์ ๊ฐ๋ฐ ๊ฒฝํ์ ๋ณด์ฅ๋ฐ์ ์ ์๋๋ก ๊ฒฐ์ ๋์์ต๋๋ค.
์ต๊ทผ ํ์ด์ฌ ๊ฐ๋ฐ์ ์ค๋ฌธ์์, ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ "์๋์์ฑ"์ด์์ต๋๋ค.
FastAPI ํ๋ ์์ํฌ ์ ์ฒด์์ ์ด๊ฑธ ๋ง์กฑํฉ๋๋ค. ์ด๋์๋ ์๋์์ฑ ํ ์ ์์ต๋๋ค.
๋ฌธ์๋ฅผ ๋ณด๋ฌ ์ค๋ ์ผ์ด ๊ฑฐ์ ์์๊ฒ๋๋ค.
์๋ํฐ๋ณ๋ก ์ด๋ป๊ฒ ์ง์ํ๋ ์ง๋ ์๋๋ฅผ ์ฐธ๊ณ ํ์ธ์.
์ ์๋ ์๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ ์ฝ๋๋ ์๋ ์์ฑ์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด, JSON body ์์ (์ค์ฒฉ๋์ด ์์ ์๋ ์๋) price
๋ผ๋ ํค๋ Request๋ก ๋์ด์จ ๊ฐ์ฒด ๋ด์ ์์ง๋ง ์๋ ์์ฑ์ ์ง์ํฉ๋๋ค.
์ด์ ์ด๋ฆ์ ์๋ชป ์ ์ง ๋ง์ธ์. username
์ธ์ง user_name
์ธ์ง ๋ชฐ๋ผ์, ๋ฌธ์๋ฅผ ์๋ค ๊ฐ๋ค ํ ์ผ๋ ์คํฌ๋กค์ ์์๋๋ก ํ์ ํ์๋ ์์ต๋๋ค.
์์ฝ¶
๋ชจ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ์ ๊ฐ๊ณ ์๊ณ , ์ด๋๋ ์ํ๋ฉด ์ค์ ํ ์๋ ์์ต๋๋ค. ๋ชจ๋ ํ๋ผ๋ฏธํฐ๋ ํ๊ณ ์ถ์ ๊ฒ์ ๋ฐ๋ผ, ์ํ๋ API ์ ์์ ๋ฐ๋ผ ์ ๋ง์ ๋ง๊ฒ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก, ์ ๋ถ "๊ทธ๋ฅ ๋๊ฑฐ๋ ์".
๊ฒ์ฆ¶
- ์๋๋ฅผ ํฌํจํ, ๊ฑฐ์ ๋๋ถ๋ถ์ ํ์ด์ฌ ๋ฐ์ดํฐ ํ์ ์ ๋ํ ๊ฒ์ฆ์ ์ง์ํฉ๋๋ค.
- JSON objects (
dict
). - JSON array (
list
) defining item types. - String (
str
) fields, defining min and max lengths. -
Numbers (
int
,float
) with min and max values, etc. -
์๋์ ๊ฐ์, ์ธ๋ถ์ ์ธ ํ์ ๋ค์ ๊ฒ์ฆ๋ ์ง์ํฉ๋๋ค.
- URL
- UUID
- ๊ทธ ์ธ
๋ชจ๋ ๊ฒ์ฆ์ ๊ฒฌ๊ณ ํ๊ฒ ์ ์ค๊ณ๋ Pydantic์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
๋ณด์๊ณผ ์ธ์ฆ¶
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฐ์ดํฐ ๋ชจ๋ธ๊ณผ ๊ด๊ณ ์์ด, ๋ณด์๊ณผ ์ธ์ฆ์ ํตํฉํฉ๋๋ค.
OpenAPI์ ์ ์๋ ๋ณด์ ์คํค๋ง๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- HTTP Basic.
- OAuth2 (JWT tokens ํฌํจ). OAuth2 with JWT ๋ฌธ์๋ฅผ ํ์ธํ์ธ์.
- API keys in:
- ํค๋(Headers)
- ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์(Query parameters)
- ์ฟ ํค(Cookies) ๋ฑ
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๋ณด์ ๊ธฐ๋ฅ๋ค์ Starlette ๊ธฐ๋ฐ์ ๋๋ค. (์ธ์ ์ฟ ํค ํฌํจ).
๋น๋๋ ๋ชจ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํด๊ณผ ์ปดํฌ๋ํธ๋ค์ ์์คํ ์ด๋ ๋ฐ์ดํฐ ์ ์ฅ์, ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค, NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ๊ณผ๋ ์ฐ๋ํ๊ธฐ ์ฝ์ต๋๋ค.
์์กด์ฑ ์ฃผ์ (Dependency Injection)¶
FastAPI๋ ๋งค์ฐ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ๋งค์ฐ ๊ฐ๋ ฅํ ์์กด์ฑ ์ฃผ์ (Dependency Injection) ์์คํ ์ ๊ฐ๊ณ ์์ต๋๋ค.
- ์์กด์ฑ์ด ๋ค๋ฅธ ์์กด์ฑ์ ๊ฐ๊ณ ์๋ค๋ฉด, ์์กด์ฑ ๊ณ์ธต ๊ตฌ์กฐ๋ ์์กด์ฑ "๊ทธ๋ํ" ๋ฅผ ๋ง๋ญ๋๋ค.
- ํ๋ ์์ํฌ์์ ์ ๋ถ ์๋์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
- All the dependencies can require data from requests and augment the path operation constraints and automatic documentation.
- ์๋ ๊ฒ์ฆ์ path operation ํ๋ผ๋ฏธํฐ์๋ ์์กด์ฑ์ ์ ์ํ ์ ์์ต๋๋ค.
- ๋ณต์กํ ์ ์ ์ธ์ฆ ์์คํ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฑ ์ง์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค, ํ๋ก ํธ์๋ ๋ฑ์ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์ต๋๋ค. ํ์ง๋ง ํตํฉ์ ๋ฌด์ฒ ์ฝ์ต๋๋ค.
๋ฌดํํ "ํ๋ฌ๊ทธ์ธ"¶
๋ค๋ฅด๊ฒ ๋งํ๋ฉด, ํ๋ฌ๊ทธ์ธ์ด๋ผ๊ณ ํ ๊ฒ ํ์๊ฐ ์์ต๋๋ค. ํ์ํ ์ฝ๋๋ฅผ ๋ถ๋ฌ์์ ์ฌ์ฉํ์ธ์.
๋ชจ๋ ์์กด์ฑ์ ๊ณ ๋ คํ๋ฉด์ ํตํฉํ๊ธฐ ์ฝ๋๋ก ๊ณ ์๋์์ต๋๋ค. path operations์ ์์ฑํ ๊ฒ๊ณผ ๋์ผํ ๊ตฌ์กฐ์ ๊ตฌ๋ฌธ์ผ๋ก ์ง 2์ค์ง๋ฆฌ ์ฝ๋๋ก๋ "ํ๋ฌ๊ทธ์ธ"์ ๋ง๋ค ์ ์์ต๋๋ค.
ํ ์คํธ¶
- 100% test coverage.
- 100% type annotated code base.
- ์ค์ ๋ก ๋ฐฐํฌํด์ ์ฌ์ฉํด๋ดค์.
Starlette features¶
FastAPI๋ Starlette๋ฅผ ์์ ํ ํธํํ๊ณ , ๊ทธ ๊ธฐ๋ฐ์ด๊ธฐ๋ ํฉ๋๋ค. ๊ทธ๋์ ๊ฐ์ง๊ณ ์๋ Starlette ์ฝ๋๋ฅผ ์ถ๊ฐํด๋ ์ ๋์ํ ๊ฒ์ ๋๋ค.
FastAPI
๋ ์ค์ ๋ก Starlette
์ ์๋ธ ํด๋์ค์
๋๋ค. ๊ทธ๋์ ์ด๋ฏธ Starlette๋ฅผ ์๊ณ ์๊ฑฐ๋ ์จ๋ดค๋ค๋ฉด, ๋๋ถ๋ถ์ ๊ธฐ๋ฅ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์ํ ๊ฒ์
๋๋ค.
FastAPI์์๋ Starlette์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ์ฌ์ฉํ์ค ์ ์์ต๋๋ค. (FastAPI๋ Starlette์ ์์ ํธํ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.)
- ๋งค์ฐ ์์ฒญ๋ ์ฑ๋ฅ. NodeJS, Go๋งํผ ๊ฐ์ฅ ๋น ๋ฅธ ํ์ด์ฌ ํ๋ ์์ํฌ ์ค ํ๋.
- WebSocket ์ง์.
- ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฒ๋ฆฌํ๋ ์์ ๋ค.
- ์์๊ณผ ์ข ๋ฃ ์ด๋ฒคํธ๋ค.
- Test client built on
requests
. - CORS, GZip, ์ ์ ํ์ผ๋ค, Streaming responses.
- ์ธ์ ๊ณผ ์ฟ ํค ์ง์.
- 100% test coverage.
- 100% type annotated codebase.
Pydantic features¶
FastAPI๋ Pydantic๋ฅผ ์์ ํ ํธํํ๊ณ , ๊ทธ ๊ธฐ๋ฐ์ด๊ธฐ๋ ํฉ๋๋ค. ๊ทธ๋์ ๊ฐ์ง๊ณ ์๋ Pydantic ์ฝ๋๋ฅผ ์ถ๊ฐํด๋ ์ ๋์ํ ๊ฒ์ ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ORM, ODM ๋ฑ์ Pydantic ๊ธฐ๋ฐ์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๋ ๋ง์ฐฌ๊ฐ์ง๋ก ํธํ๋ฉ๋๋ค.
๋ชจ๋ ๊ฒ ์๋์ ์ผ๋ก ๊ฒ์ฆ๋๊ธฐ ๋๋ฌธ์, request๋ก ๋ฐ์ ๊ฐ์ฒด๋ฅผ ๊ทธ๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ง์ ๋๊ธฐ๋ ๋ฑ์ ์ํฉ๋ ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ์ ๋๋ค.
๋ฐ๋์ ๊ฒฝ์ฐ๋ ๊ทธ๋๋ก ์ ์ฉํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊บผ๋ธ ๊ฐ์ฒด๋ฅผ ๊ทธ๋๋ก ํด๋ผ์ด์ธํธ์ ์ง์ ์ ๋ฌํ ์๋ ์์ต๋๋ค.
FastAPI์์๋ Pydantic์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ์ฌ์ฉํ์ค ์ ์์ต๋๋ค. (FastAPI๋ ๋ชจ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ Pydantic ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.)
- ๋จธ๋ฆฌ ๊นจ์ง๋ ์ผ์ ์ด์ ๊ทธ๋ง:
- ์๋ก ๋ฐฐ์์ผ ํ ์์ํ schema ์ ์๊ฐ ์์ต๋๋ค.
- ํ์ด์ฌ ํ์ ์ ๋ํด์ ์๋ค๋ฉด, Pydantic๋ฅผ ์ถฉ๋ถํ ์ธ ์ ์์ต๋๋ค.
- IDE, linter, ๊ทธ๋ฆฌ๋ ๋น์ ์ ๋๋๋ฅผ ์ ํ์ฉํ์ธ์:
- Pydantic์ ์๋ฃ ๊ตฌ์กฐ๋ ์ฌ๋ฌ๋ถ์ด ์ ์ํ ํด๋์ค์ ์ธ์คํด์ค๋ค๋ฟ์ ๋๋ค. ์๋ ์์ฑ, ๋ฌธ๋ฒ ๊ฒ์ฌ, mypy ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ๋ถ์ ์ง๊ฐ์ ๊ฒ์ฆ๋ ๋ฐ์ดํฐ์ ์ ๋์๊ฐ ๊ฒ๋๋ค.
- ๋น ๋ฅด๋ค:
- ๋ฒค์น๋งํน์์ Pydantic์ด ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๋ณด๋ค ๋น ๋ฅด๋จ ๊ฒ์ ํ์ธํ์ต๋๋ค.
- ๋ณต์กํ ๊ตฌ์กฐ ๊ฒ์ฆ:
- ๊ณ์ธต์ ์ธ Pydantic ๋ชจ๋ธ, ํ์ด์ฌ์
typing
์ ์๋List
andDict
๋ฑ์ ์ฌ์ฉํ์ธ์. - Validator๋ ๋ณต์กํ ๋ฐ์ดํฐ ์คํค๋ง๋ค์ ๊ฐ๋จํ๊ณ ์ฝ๊ฒ ์ ์ํ๊ณ ๊ฒ์ฌํ ์ ์๊ฒ, ๊ทธ๋ฆฌ๊ณ JSON ์คํค๋ง๋ก ๋ฌธ์ํ๊น์ง ํ ์ ์๊ฒ ํด์ค๋๋ค.
- ๊น์ด๊ฐ ๊น์ Nested JSON ๊ฐ์ฒด๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ๋ถ ๊ฒ์ฆ๋๊ณ ์ฃผ์์ด ๋ฌ๋ฆฐ ์ฑ๋ก์.
- ํ์ฅ์ฑ:
- Pydantic์ ์ปค์คํ ๋ฐ์ดํฐ ํ์ ๋ค์ ์ ์ํ ์ ์๊ฒ ๋ง๋ญ๋๋ค. ์๋๋ฉด, ๋ชจ๋ธ์ validator decorator๋ฅผ ๋ฐ์ฝ๋ ์ดํธ(decorate)ํ ํ, ํจ์๋ฅผ ์์ฑํด์ validation์ ํ์ฅํ ์๋ ์์ต๋๋ค.
- 100% test coverage.