💻 프로그래밍

FastAPI

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 함수에서 동기 I/O 호출

async def 함수 안에서 일반 requests 라이브러리를 쓰면 이벤트 루프가 블로킹됩니다. httpx나 aiohttp 같은 비동기 HTTP 클라이언트를 사용하거나, run_in_executor로 감싸세요.

Pydantic 모델 검증 무시

dict로 직접 응답하면 타입 검증이 생략됩니다. 항상 response_model을 지정하고 Pydantic 모델을 반환하세요. 민감한 데이터 노출을 방지하고 API 일관성을 유지합니다.

의존성 주입(Depends) 활용

인증, DB 세션, 설정 로드 등 공통 로직은 Depends로 분리하세요. 코드 재사용성이 높아지고, 테스트 시 모킹이 쉬워집니다. 중첩 의존성도 자동으로 해결됩니다.

🔗 관련 용어

📚 더 배우기