Skip to content

FastAPI

학림 edited this page Jul 15, 2026 · 2 revisions

1. FastAPI란?

FastAPI는 Python의 타입 힌트를 기반으로 API를 구축하기 위해 설계된 모던하고 빠른 고성능 웹 프레임워크

FastAPI는 왜 등장했는가

  1. 문제
    과거 파이썬은 데이터 분석과 머신러닝 생태계에서 압도적이었으나, 대규모 트래픽을 감당하는 웹 서버로서는 타 언어(Node.js, Go 등)에 비해 아쉬웠음

    • 비동기(Async) 처리 부재:
      기존의 Django와 Flask는 태생적으로 동기식(WSGI) 아키텍처 기반이라, 동시 요청시 I/O 병목 현상 발생
    • AI/ML 모델 서빙 수요 확산:
      기존의 Java(Spring)나 Node.js의 경우 Python 기반의 AI 모델과의 호환을 위해 API 브릿지를 두는 등 비효율이 초래되었음.
      기존 파이썬 웹 프레임워크(Django, Flask)를 쓰자니 모델이 무거운 추론 작업을 하는 동안 서버 전체가 멈추는 문제 발생
  2. 해결책

    • 고성능 비동기 처리:
      구형 WSGI 대신 최신 비동기 표준(ASGI)를 채택하여 이벤트 루프 기반으로 동시 트래픽 처리 성능을 높임.
    • 타입 힌트:
      Pydantic(Rust 코어) 엔진을 활용해서 타입 안정성을 높임 -> Swagger 동적 렌더링

2. FastAPI vs Others

vs Django

ORM, 인증, Admin 등 필수 기능이 내장된 풀스택 프레임워크
빠른 초기 개발

RDB 기반의 콘텐츠 중심 서비스, 빠른 MVP(최소 기능 제품) 개발시

vs Spring Boot (Java)

검증된 엔터프라이즈 생태계, 강력한 트랜잭션 관리, 엄격한 객체지향(OOP) 및 디자인 패턴 컨벤션
견고함 안정성 성숙한 생태계

복잡한 도메인 로직, 대규모 다인원 협업 및 장기 유지보수가 필수적인 엔터프라이즈급 코어 시스템 개발시

vs Node.js (Express)

비동기 서버 성능
실시간통신

채팅, 스트리밍 등 실시간 양방향 통신(WebSockets) 위주의 서비스나 프론트/백엔드 개발 언어를 단일화하여 리소스를 효율적으로 운영하고자 할 때

3. 핵심 기능들

① 자동화된 API 문서화 (/docs)

코드를 작성하고 서버를 실행한 뒤 /docs 경로에 Swagger UI가 자동 생성!

메커니즘:

  1. 런타임에 표준 타입 힌트 분석(Pydantic 덕분)
  2. JSON Schema 동적으로 자동 생성
  3. 화면에 렌더링

② Hot Reload (수정 사항 즉시 반영)

코드를 수정하고 저장하면, 서버를 수동으로 재시작할 필요 없이 즉시 최신 상태가 반영(Spring과 달라서 놀랐습니다)

메커니즘:

  1. ASGI 서버(Uvicorn)의 --reload 옵션으로 내부적으로 파일 시스템 변경 이벤트(I/O 감지) 추적
  2. 소스코드 변경 감지시 프로세스 재시작(인터프리터 언어라 재시작 과정이 빠름)

③ Pydantic 기반 데이터 검증

클라이언트가 보낸 데이터(JSON)의 유효성을 검사 및 직렬화/역직렬화 자동화
데이터 타입 불일치시 422 Unprocessable Entity 에러를 클라이언트에게 반환

심화: ASGI(Uvicorn)

ASGI 등장 배경

  1. 문제: 기존 WSGI의 한계 (Blocking I/O)
    하나의 요청이 DB 응답을 기다리는 동안, 해당 스레드는 멈춰 있는 블로킹되어 동시 접속 처리가 힘듦
    * 왜 웹 프레임워크를 만들면서 동기처리로 했을까?
    -> 옛날에는 동기식으로 충분했다고 한다.. python에 async가 추가된 것도 2014년이라 그 전에 만들어진 Django와 Flask는 동기 기반으로 작성됐다고

  2. 해결책: ASGI(이벤트 루프 기반)
    이벤트 루프를 통해 하나의 요청이 DB 응답을 기다리는 동안(I/O 작업) 즉시 다른 유저의 요청을 비동기 처리

  3. 구현체: Uvicorn ASGI는 단지 '표준 규약(문서)', 이에 맞춰 실제 트래픽을 받고 파이썬 코드를 실행해 주는 웹 서버가 Uvicorn

이벤트 루프란?

JS, Python 같은 싱글 스레드 기반 언어에서 비동기 처리를 하기 위한 아키텍처 패턴

운영체제에서 스케줄링/인터럽트 패러다임을 언어차원(웹 서버 부분)에서 구현한 것 같습니다.
스케줄링을 커널 차원이 아니라 언어 차원에 적용해서 운영체제 멀티스레드 대비 메모리 효율이 좋다고 합니다. 멀티 스레드는 OS 스레드 할당시 고정으로 1~2MB의 스택을 미리 할당하기 때문에 유저수가 많아지면 과하게 메모리를 잡아먹는 문제가 있다고...

웹서버? 웹프레임워크?

사용자 요청 ⇒ Web Server(Uvicorn, Tomcat) ⇒ Web Framework(FastAPI, Spring)

  • Web Server(웨이터)
    • 네트워크/인프라
    • HTTP 프로토콜 이해, 요청 수신, 보안, 로드밸런싱 등
  • Web Framework(요리사)
    • 로직/개발
    • 어떤 기능을 사용자에게 구현할 것인지에 대해 집중