FastAPI

채채·2025년 6월 10일

FastAPI는 Python 기반의 현대적이고 빠른 웹 프레임워크로, REST API 개발에 특화되어 있음. 비동기 처리 지원, 자동 문서화, 데이터 검증 및 직관적인 사용이 가능함.

FastAPI의 기본 개념

  • 속도: Starlette와 Uvicorn 같은 비동기 기반 서버를 활용하여 매우 빠른 성능을 제공함.
  • 비동기 지원: async/await를 사용하여 쉽게 비동기 프로그래밍이 가능함.
  • 데이터 검증 및 직렬화: Pydantic을 활용해 데이터의 유효성을 검사하고 자동으로 타입 변환과 직렬화를 지원함.
  • 자동 문서화: OpenAPI 스펙을 기반으로 자동으로 API 문서를 생성함(Swagger UI 및 ReDoc).

장고와 FastAPI의 직접적인 코드 작성 차이점

항목Django (+ DRF)FastAPI
타입 명시명시적 타입 지정 필요 없음Python 타입 지정 필수
데이터 검증Serializer 클래스 활용Pydantic 모델 활용
파일 구조앱 중심, 명확한 구조(views.py, models.py 등)간단한 구조, 필요에 따라 구성 변경 가능
비동기 지원제한적이고 기본은 동기적임비동기 프로그래밍 기본 지원
API 문서 자동화추가 패키지 필요함(drf-yasg 등)기본적으로 지원됨

FastAPI 파일 구조 예시

  • main.py: FastAPI 앱의 진입점으로, 엔드포인트를 정의하고 관리함.
  • schemas.py: 데이터 모델 정의를 위해 Pydantic 클래스를 작성함.
  • routers/: 기능별로 API 라우터를 분리하여 관리할 수 있음.

Django 파일 구조 예시

  • views.py: 요청 처리 로직을 구현함.
  • models.py: ORM을 사용한 데이터베이스 모델 정의함.
  • serializers.py: 데이터 검증 및 직렬화를 위한 클래스 정의함.
  • urls.py: URL 패턴과 뷰의 연결 정의함.

Django vs FastAPI 전체 구조 비교

항목DjangoFastAPI
개발 철학"배터리 포함(batteries included)" — 다 들어 있음"가볍고 빠르게" — 필요한 것만 가져다 씀
요청 처리 구조View 함수/클래스에서 request 객체 수동 처리함수 파라미터에서 자동 파싱 (item: Item)
데이터 검증forms, ModelForm, serializerspydantic 모델로 자동 검증
URL 라우팅urls.py에 명시적으로 등록데코레이터 (@app.get, @app.post)
ORMDjango ORM (내장, 강력)선택 (SQLAlchemy, Tortoise 등 수동 구성)
템플릿 엔진내장 (Django templates)없음 (원하면 Jinja2 등 추가)
Admin 페이지자동 생성 (admin.site.register)없음 (직접 만들어야 함)
Form 처리서버 렌더링 중심 (request.POST, form.is_valid())주로 JSON API 사용 (프론트 분리 기반)
비동기 지원제한적 (ASGI 기반으로 확장 가능)기본이 비동기 (ASGI 완전 지원)
API 문서 자동화DRF에서 Swagger/OpenAPI 지원 (별도 설치)기본 내장 (Swagger, Redoc 자동 생성)
속도전통적 WSGI, 무난함매우 빠름 (Starlette 기반, 비동기 최적화)
사용자 인증auth.User, LoginView, 세션 기반JWT 기반 인증을 많이 씀 (직접 구성해야 함)

Django vs FastAPI: 요청 처리 방식의 차이

항목DjangoFastAPI
요청 데이터 처리직접 꺼냄 (request.POST)자동 파싱 (item: Item)
검증 방식form, serializerpydantic model
타입 힌트 사용선택적극 사용 (기반 기능임)
문서 자동 생성없음 (DRF로 일부 가능)Swagger/OpenAPI 자동 생성

언제 FastAPI를 사용할까?

  • 빠른 성능과 비동기 처리의 효율성을 원하는 경우
  • REST API 중심으로 프로젝트를 구성하고 자동화된 문서화가 필요한 경우
  • 최소한의 기능으로 빠르게 시작하고 필요한 기능만 추가하고 싶은 경우

FastAPI는 직관적이고 빠르게 배울 수 있는 프레임워크로, 명시적인 타입 지정과 간결한 구조로 인해 개발 생산성을 높일 수 있음.


만약 이런 프로젝트를 fast api와 django에서 각각 만든다면?

목표: 아주 단순한 To-Do List API (CRUD)
할 일 목록 만들기 (POST)
목록 전체 보기 (GET)
개별 항목 보기 (GET)
수정하기 (PUT/PATCH)
삭제하기 (DELETE)


📁 Django 폴더 구조 예시

todo_project/
├── manage.py
├── todo_project/
│   └── settings.py
│   └── urls.py
├── todo/
│   └── models.py         ← DB 모델
│   └── views.py          ← View 함수/클래스
│   └── serializers.py    ← 요청/응답 검증
│   └── urls.py           ← 이 앱의 URL 모음

📁 FastAPI 폴더 구조 예시 (같은 To-Do 기능)

fastapi_todo/
├── main.py                ← 앱 실행 진입점
├── models.py              ← DB 모델 (예: SQLAlchemy)
├── schemas.py             ← Pydantic 모델 (입출력용)
├── crud.py                ← DB 처리 함수 (Create, Read, Update, Delete)
├── database.py            ← DB 연결/세션 관리
├── routers/
│   └── todo.py            ← 실제 API 라우터 (endpoint 모음)
├── settings.py            ← 환경변수 기반 설정 파일 (선택)
└── requirements.txt

🧩 역할 대응표

기능Django 위치FastAPI 위치
실행 진입점manage.py + asgi.pymain.py
전체 URL 등록urls.pyapp.include_router()
앱 URL 정의todo/urls.pyrouters/todo.py
View 로직views.pyrouters/todo.py
요청/응답 검증serializers.pyschemas.py (pydantic)
DB 모델models.pymodels.py
DB 조작 로직ModelManager/ORMcrud.py
DB 연결 설정settings.py + DATABASESdatabase.py
앱 설정settings.pysettings.py (직접 구성)

📦 FastAPI 구조를 Django처럼 생각하면?

Django 개념FastAPI 파일 또는 위치
앱 단위 모듈routers/ 폴더
views.pyrouters/todo.py (endpoint 정의)
models.py그대로 models.py 사용
serializers.pyschemas.py (Pydantic 기반)
forms.py필요 없음 (pydantic이 검증함)
urls.pymain.py에서 include_router()

참고
https://fastapi.tiangolo.com/ko/

profile
화이팅

0개의 댓글