FastAPI
Python 고성능 웹 API 프레임워크
Python 고성능 웹 API 프레임워크
FastAPI는 2018년 Sebastian Ramirez가 만든 Python 웹 프레임워크로, 현대적인 API 개발에 최적화되어 있습니다. Python 3.7+의 타입 힌트를 기반으로 설계되어, 코드를 작성하면 자동으로 API 문서(Swagger UI, ReDoc)가 생성되고 런타임 데이터 검증까지 수행합니다.
FastAPI의 핵심 특징은 Starlette을 기반으로 한 비동기(async/await) 지원입니다. Node.js나 Go에 필적하는 고성능을 제공하며, TechEmpower 벤치마크에서 Python 웹 프레임워크 중 최상위 성능을 기록합니다. 동기 코드도 함께 사용할 수 있어 기존 라이브러리와의 호환성도 뛰어납니다.
데이터 검증은 Pydantic 라이브러리를 사용합니다. 요청/응답 모델을 Python 클래스로 정의하면, 자동으로 JSON 직렬화, 타입 검증, 에러 메시지 생성이 처리됩니다. 이는 개발 속도를 높이고 버그를 줄이는 데 크게 기여합니다.
실무에서 FastAPI는 마이크로서비스, ML 모델 서빙(MLOps), 실시간 데이터 API 등에 널리 사용됩니다. Netflix, Uber, Microsoft 등 대형 기업에서도 채택하고 있으며, 특히 AI/ML 분야에서 모델을 API로 배포할 때 가장 인기 있는 선택지입니다.
# FastAPI 기본 서버 예제
from fastapi import FastAPI, HTTPException, Query
from pydantic import BaseModel, Field
from typing import Optional
import uvicorn
app = FastAPI(
title="KAITRUST API",
description="FastAPI를 활용한 고성능 API 서버",
version="1.0.0"
)
# Pydantic 모델 정의 (자동 검증 & 문서화)
class User(BaseModel):
id: int
name: str = Field(..., min_length=2, max_length=50)
email: str
is_active: bool = True
class UserCreate(BaseModel):
name: str = Field(..., min_length=2, example="홍길동")
email: str = Field(..., example="user@example.com")
# 인메모리 데이터베이스 (예시)
users_db: dict[int, User] = {}
next_id = 1
# GET - 사용자 목록 조회
@app.get("/users", response_model=list[User])
async def get_users(
skip: int = Query(0, ge=0),
limit: int = Query(10, ge=1, le=100)
):
"""모든 사용자를 페이지네이션하여 반환합니다."""
return list(users_db.values())[skip:skip + limit]
# POST - 새 사용자 생성
@app.post("/users", response_model=User, status_code=201)
async def create_user(user: UserCreate):
"""새 사용자를 생성합니다. 자동 ID 할당."""
global next_id
new_user = User(id=next_id, **user.model_dump())
users_db[next_id] = new_user
next_id += 1
return new_user
# GET - 특정 사용자 조회
@app.get("/users/{user_id}", response_model=User)
async def get_user(user_id: int):
"""ID로 특정 사용자를 조회합니다."""
if user_id not in users_db:
raise HTTPException(status_code=404, detail="사용자를 찾을 수 없습니다")
return users_db[user_id]
# 서버 실행: uvicorn main:app --reload
# API 문서: http://localhost:8000/docs (Swagger UI)
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
"ML 모델 서빙은 FastAPI로 구축하면 좋겠습니다. Pydantic으로 입출력 스키마를 정의하면 자동으로 Swagger 문서가 생성되고, async 지원으로 동시 요청 처리 성능도 충분합니다."
"FastAPI를 선택한 이유는 타입 힌트 기반의 자동 문서화와 Pydantic 검증 덕분에 개발 생산성이 높기 때문입니다. Django REST Framework보다 성능이 뛰어나고, Flask보다 현대적인 비동기 패턴을 지원합니다."
"이 엔드포인트에 response_model을 지정해주세요. 응답 데이터가 자동으로 직렬화되고 민감한 필드가 필터링됩니다. 그리고 Depends를 사용해서 인증 로직을 분리하면 재사용성이 높아집니다."
async def 함수 안에서 일반 requests 라이브러리를 쓰면 이벤트 루프가 블로킹됩니다. httpx나 aiohttp 같은 비동기 HTTP 클라이언트를 사용하거나, run_in_executor로 감싸세요.
dict로 직접 응답하면 타입 검증이 생략됩니다. 항상 response_model을 지정하고 Pydantic 모델을 반환하세요. 민감한 데이터 노출을 방지하고 API 일관성을 유지합니다.
인증, DB 세션, 설정 로드 등 공통 로직은 Depends로 분리하세요. 코드 재사용성이 높아지고, 테스트 시 모킹이 쉬워집니다. 중첩 의존성도 자동으로 해결됩니다.