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 전체 구조 비교
| 항목 | Django | FastAPI |
|---|
| 개발 철학 | "배터리 포함(batteries included)" — 다 들어 있음 | "가볍고 빠르게" — 필요한 것만 가져다 씀 |
| 요청 처리 구조 | View 함수/클래스에서 request 객체 수동 처리 | 함수 파라미터에서 자동 파싱 (item: Item) |
| 데이터 검증 | forms, ModelForm, serializers | pydantic 모델로 자동 검증 |
| URL 라우팅 | urls.py에 명시적으로 등록 | 데코레이터 (@app.get, @app.post) |
| ORM | Django 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: 요청 처리 방식의 차이
| 항목 | Django | FastAPI |
|---|
| 요청 데이터 처리 | 직접 꺼냄 (request.POST) | 자동 파싱 (item: Item) |
| 검증 방식 | form, serializer | pydantic 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.py | main.py |
| 전체 URL 등록 | urls.py | app.include_router() |
| 앱 URL 정의 | todo/urls.py | routers/todo.py |
| View 로직 | views.py | routers/todo.py |
| 요청/응답 검증 | serializers.py | schemas.py (pydantic) |
| DB 모델 | models.py | models.py |
| DB 조작 로직 | ModelManager/ORM | crud.py |
| DB 연결 설정 | settings.py + DATABASES | database.py |
| 앱 설정 | settings.py | settings.py (직접 구성) |
📦 FastAPI 구조를 Django처럼 생각하면?
| Django 개념 | FastAPI 파일 또는 위치 |
|---|
| 앱 단위 모듈 | routers/ 폴더 |
views.py | routers/todo.py (endpoint 정의) |
models.py | 그대로 models.py 사용 |
serializers.py | schemas.py (Pydantic 기반) |
forms.py | 필요 없음 (pydantic이 검증함) |
urls.py | main.py에서 include_router() |
참고
https://fastapi.tiangolo.com/ko/