
FastAPI에서도 일반적인 RESTful API 설계 원칙을 따르는 것이 중요하기 때문에 명사 기반의 URI, 적절한 HTTP 메서드, 상태 코드 반환 등을 준수해야 합니다.
from fastapi import FastAPI
app = FastAPI()
# 기본적인 CRUD 예제
@app.get("/users")
def get_users():
return [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
@app.get("/users/{user_id}")
def get_user(user_id: int):
return {"id": user_id, "name": "Alice"}
@app.post("/users")
def create_user(user: dict):
return {"id": 3, "name": user["name"]}
@app.put("/users/{user_id}")
def update_user(user_id: int, user: dict):
return {"id": user_id, "name": user["name"]}
@app.delete("/users/{user_id}")
def delete_user(user_id: int):
return {"message": f"User {user_id} deleted"}
Path와 Query Parameter를 구분
Path Parameter는 특정 리소스를 식별할 때 사용
Query Parameter는 필터링, 정렬, 페이징에 사용
@app.get("/products")
def get_products(category: str = None, page: int = 1, limit: int = 10):
return {"category": category, "page": page, "limit": limit}
FastAPI는 데이터 유효성 검증을 위해 Pydantic 모델을 지원합니다.
이를 사용하여 입력 데이터의 구조를 정의하고 검증하는 것이 좋습니다.
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
email: str
@app.post("/users")
def create_user(user: User):
return {"message": f"User {user.name} created!"}
FastAPI는 status 모듈을 통해 HTTP 상태 코드를 쉽게 정의할 수 있습니다. 응답에서 적절한 상태 코드를 반환
from fastapi import HTTPException, status
@app.get("/users/{user_id}")
def get_user(user_id: int):
if user_id != 1:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="User not found"
)
return {"id": user_id, "name": "Alice"}
버전을 명시적으로 관리하여 변경에 유연하게 대처
from fastapi import APIRouter
api_v1 = APIRouter()
@api_v1.get("/users")
def get_users():
return [{"id": 1, "name": "Alice"}]
app.include_router(api_v1, prefix="/v1")
FastAPI는 자동으로 Swagger와 Redoc 문서를 생성해줍니다.
이를 통해 API의 가독성과 사용성을 높일 수 있습니다.
FastAPI를 실행하면 /docs (Swagger)와 /redoc (Redoc)에서 문서를 확인할 수 있습니다.
엔드포인트에 명확한 설명을 추가하면 문서화가 더 풍부해집니다.
@app.get("/users", summary="Get Users", description="Retrieve a list of users.")
def get_users():
return [{"id": 1, "name": "Alice"}]
FastAPI는 OAuth2 및 JWT 토큰 인증을 기본적으로 지원합니다.
인증 및 권한 관리를 통해 보안을 강화하세요.
from fastapi.security import OAuth2PasswordBearer
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@app.get("/secure-data")
def secure_data(token: str = Depends(oauth2_scheme)):
return {"message": "This is secure data"}
RESTful API의 필수 기능인 필터링, 정렬, 페이징을 쿼리 파라미터로 구현
@app.get("/items")
def get_items(sort: str = "asc", limit: int = 10):
# 예제: 정렬과 제한 구현
items = [{"id": i, "name": f"Item {i}"} for i in range(1, 21)]
sorted_items = sorted(items, key=lambda x: x["id"], reverse=(sort == "desc"))
return sorted_items[:limit]
FastAPI는 TestClient를 통해 간단한 유닛 테스트를 지원합니다.
또한, 로깅을 사용하여 API의 동작을 추적합니다.
from fastapi.testclient import TestClient
client = TestClient(app)
def test_get_users():
response = client.get("/users")
assert response.status_code == 200
assert isinstance(response.json(), list)
중복 코드를 줄이고, Dependency Injection을 사용하여 재사용성을 높여주기.
비동기 처리를 통해 성능을 최적화
from fastapi import Depends
def get_db():
# 예: 데이터베이스 연결
return "db_connection"
@app.get("/data")
def get_data(db: str = Depends(get_db)):
return {"db": db}