FastAPI는 현대적인, 빠르고 (high-performance), Python 기반 웹 프레임워크입니다. Starlette와 Pydantic을 기반으로 하며, ASGI 표준을 따릅니다. FastAPI는 API 개발을 빠르고 쉽게 할 수 있게 해주며, 다음과 같은 주요 특징들이 있습니다.
고성능: Uvicorn을 ASGI 서버로 사용하여 매우 높은 성능을 자랑합니다. Uvicorn은 비동기 지원과 높은 동시성을 제공합니다.
자동 문서화: Swagger UI와 ReDoc을 통해 자동으로 API 문서를 생성합니다.
타입 힌팅: Python 타입 힌팅을 사용하여 자동으로 요청 데이터의 검증 및 변환을 수행합니다.
쉬운 사용성: 개발자가 사용하기 쉽고 직관적입니다. FastAPI는 빠른 개발을 지원합니다.
비동기 지원: 비동기 프로그래밍을 지원하여 높은 동시성을 제공합니다.
먼저 Fast api와 Uvicorn을 설치합니다.
pip install fastapi uvicorn
이후 프로젝트 디렉토리 구조를 설정합니다.
fastapi_project/
├── app/
│ ├── __init__.py
│ ├── crud.py
│ ├── database.py
│ ├── main.py
│ ├── models.py
│ └── schemas.py
└── requirements.txt
requirements.txt 파일을 생성하고 필요한 패키지를 추가합니다.
fastapi
uvicorn
pydantic
motor
MongoDB와 연동하여 데이터를 조회하고 추가하는 API를 생성하도록 하겠습니다.
MongoDB의 local에 products 컬렉션에 2개의 데이터를 생성한 이후 프로젝트에 코드를 추가합니다.
models.py
from pydantic import BaseModel
class Product(BaseModel):
id: str
name: str
description: str
price: float
quantity: int
crud.py
from app.schemas import ProductCreate
from bson import ObjectId
async def create_product(db, product: ProductCreate):
product_dict = product.dict()
result = await db.insert_one(product_dict)
product_dict["id"] = str(result.inserted_id)
return product_dict
async def get_products(db, skip: int = 0, limit: int = 10):
products = await db.find().skip(skip).limit(limit).to_list(length=limit)
for product in products:
product["id"] = str(product["_id"])
return products
async def get_product_by_id(db, product_id: str):
product = await db.find_one({"_id": ObjectId(product_id)})
if product:
product["id"] = str(product["_id"])
return product
schemas.py
from pydantic import BaseModel
class ProductBase(BaseModel):
name: str
description: str
price: float
quantity: int
class ProductCreate(ProductBase):
pass
class ProductResponse(ProductBase):
id: str
class Config:
orm_mode = True
database.py
from motor.motor_asyncio import AsyncIOMotorClient
MONGO_DETAILS = "mongodb://localhost:27017"
client = AsyncIOMotorClient(MONGO_DETAILS)
database = client.local # local 데이터 베이스 사용
products_collection = database.get_collection("products") # products 컬렉션 연결
async def get_db():
yield products_collection
main.py
from fastapi import FastAPI, Depends, HTTPException
from app.database import get_db
from app.schemas import ProductCreate, ProductResponse
from app.crud import create_product, get_products, get_product_by_id
app = FastAPI()
@app.get("/")
def read_root():
return {"Start": "Python Fast API"}
@app.post("/products_insert/", response_model=ProductResponse)
async def create_product_endpoint(product: ProductCreate, db = Depends(get_db)):
return await create_product(db, product)
@app.get("/products/", response_model=list[ProductResponse])
async def read_products(skip: int = 0, limit: int = 10, db = Depends(get_db)):
return await get_products(db, skip=skip, limit=limit)
@app.get("/products/{product_id}", response_model=ProductResponse)
async def read_product(product_id: str, db = Depends(get_db)):
product = await get_product_by_id(db, product_id)
if product is None:
raise HTTPException(status_code=404, detail="Product not found")
return product
위 처럼 각 파일들을 세팅한 이후 Fast API 서버를 실행합니다.
서버 실행 명령어
uvicorn app.main:app --reload
서버 실행 이후 localhost:8000으로 접속하면 위와 같은 화면을 확인할 수 있습니다.
이후 localhost:8000/docs로 접속하여 Swagger UI를 통해 엔드포인트를 테스트해보도록 하겠습니다.
localhost:8000/docs로 접속하면 위와 같은 화면을 확인할 수 있습니다.
해당 페이지에서 위에서 작성한 API를 테스트 하겠습니다.
Try it out 버튼을 클릭하여 해당 API를 호출합니다.
위와 같이 products 컬렉션의 데이터가 조회되는 것을 확인할 수 있습니다.
첫번째 테스트와 동일하게 Try it out 버튼을 클릭한 이후 추가할 데이터를 model에 맞게 작성한 이후 테스트하면 아래와 같습니다.
테스트에서 추가한 apple 데이터가 products 컬렉션에 추가된 것을 확인할 수 있습니다.
이처럼 Fast API를 사용하면 API 작업이 간편하고 쉬운 편에 속합니다.