TL;DR

  • FastAPI는 API 서버에 최적화된 Python 프레임워크다.
  • Starlette(ASGI) + Pydantic 조합으로 성능/검증/문서화가 동시에 해결된다.
  • 비동기 + 타입 힌트 + 자동 문서화를 기본 제공해 API 전용 서버에선 사실상 표준급.

1. FastAPI의 개념

FastAPI는 Python으로 API를 빠르고 안정적으로 만들기 위한 프레임워크다.

핵심은 세 가지다:

  1. 빠른 실행 성능 (ASGI 기반)
  2. 타입 안정성 (Pydantic 기반 자동 검증)
  3. 자동 문서화 (OpenAPI/Swagger 자동 생성)

즉, “빠르고, 정확하고, 문서까지 자동”인 API 프레임워크라고 보면 된다.


2. 등장 배경 (왜 필요했나?)

2018년 전후 Python 웹 환경은 다음 한계가 있었다:

  • Django/Flask는 동기(WGSI) 기반이라 동시성 처리에 불리
  • API 문서를 직접 만들거나 Swagger 세팅을 수동으로 해야 함
  • 타입 검증이 없어 런타임 오류가 잦고, 코드가 장황해짐
  • Python 3.6+의 타입 힌트 기능을 제대로 활용하지 못함

FastAPI는 “현대적인 Python 기능을 적극 활용하자”는 철학으로 등장했다.


3. FastAPI의 핵심 특징

✅ 1. 성능 (ASGI 기반 비동기)

  • Starlette 기반 비동기 처리
  • Node.js, Go 수준의 성능 목표
  • 요청당 스레드를 쓰지 않고 이벤트 루프 기반 처리

✅ 2. 타입 안정성 (Pydantic)

  • 타입 힌트를 곧바로 런타임 검증으로 사용
  • 잘못된 요청이면 자동으로 422 에러 반환
  • 데이터 변환도 자동

✅ 3. 자동 문서화

  • /docs → Swagger UI 자동 생성
  • /redoc → ReDoc 자동 생성
  • /openapi.json → OpenAPI 스펙 자동 제공

✅ 4. 개발 생산성

  • 코드량 감소
  • IDE 자동완성 / 타입 추적 강력
  • 테스트/유지보수 쉬움

4. 핵심 구성 요소

FastAPI
 ├─ Starlette (ASGI 웹 코어)
 ├─ Pydantic (데이터 검증/직렬화)
 └─ Uvicorn (ASGI 서버)

WSGI vs ASGI

  • WSGI: 요청 1개당 스레드 1개 (동기)
  • ASGI: 이벤트 루프로 동시 처리 (비동기)

5. 기본 사용법 (Hello World)

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}
uvicorn main:app --reload
# /docs (Swagger), /redoc 자동 제공

6. 타입 검증 예시 (Pydantic)

from pydantic import BaseModel, EmailStr

class User(BaseModel):
    name: str
    email: EmailStr
    age: int
  • 잘못된 타입 → 자동 422
  • “25” → 자동 int 변환
  • 이메일, URL 등 복합 검증 자동 처리

7. 의존성 주입 (Dependency Injection)

FastAPI는 인증/DB연결 같은 공통 로직을 주입하는 기능을 내장 제공한다.

from fastapi import Depends

def get_db():
    db = Database()
    try:
        yield db
    finally:
        db.close()

@app.get("/users")
def get_users(db=Depends(get_db)):
    return db.query(User).all()

장점:

  • 공통 로직 재사용
  • 테스트 용이
  • 코드 구조가 명확해짐

8. 비동기 처리 예시

@app.get("/async")
async def async_endpoint():
    async with httpx.AsyncClient() as client:
        res = await client.get("https://api.example.com")
    return res.json()

9. FastAPI vs Flask vs Django

| 항목 | FastAPI | Flask | Django | |—|—|—|—| | 비동기 | ✅ | ❌ | ⚠️ 제한적 | | 타입 힌트 | ✅ | ❌ | ❌ | | 자동 문서화 | ✅ | ❌ | ❌ | | 학습 곡선 | 낮음 | 낮음 | 높음 | | 용도 | API/ML | 간단 웹앱 | 풀스택 |

결론: API 전용 서버에서는 FastAPI가 가장 합리적인 기본 선택지.


10. 추천 프로젝트 구조

my_project/
├── app/
│   ├── main.py           # FastAPI 앱
│   ├── routers/          # API 라우터
│   ├── models/           # Pydantic 모델
│   ├── crud/             # DB 로직
│   └── core/             # 설정/보안
└── tests/

11. 정리

FastAPI는 속도·안정성·문서화를 동시에 잡는 API 프레임워크다.

  • API 서버 → FastAPI 거의 표준
  • 풀스택 웹앱 → Django
  • 간단 실험 → Flask

참고

  • https://fastapi.tiangolo.com/
  • https://www.starlette.io/
  • https://docs.pydantic.dev/