Django와 FastAPI
FastAPI로 API 개발을 경험하신 여러분, Django의 세계에 오신 것을 환영합니다! 이번 장에서는 두 프레임워크의 차이점과 각각의 강점을 이해해보겠습니다.
- FastAPI : 웹 API 개발을 위한 최소한의 기능만 제공하고, ORM/템플릿/캐시/세션/인증 등의 기능들은 외부 라이브러리를 조합
- 수많은 라이브러리를 선택할 수 있고 자유도는 높으나, 아키텍처 설계 능력이 필요. 아키텍처 설계 능력없이 주먹구구 식으로 구성하다보면 산으로 가는 경우가 생깁니다.
- Django : 웹 서비스 개발에 필요한 모든 기능들을 장고의 철학 아래 모두 지원합니다.
- 라이브러리 선택의 폭은 좁으나, 모든 기능들이 유기적으로 연결되어 잘 관리되고 있습니다.
1. 두 프레임워크의 철학
FastAPI: "빠르고 현대적인 API 개발"
FastAPI의 핵심은 엔드포인트 함수가 호출되기 전에 요청 데이터에 대한 자동 변환/검증이 이뤄집니다.
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class ItemIn(BaseModel):
name: str
price: float
@app.post("/items/")
async def item_new(item: ItemIn):
return item
Django: "마감이 있는 완벽주의자를 위한 풀 스택 웹 프레임워크"
Django는 View 함수가 호출되어 요청 데이터가 전달되면 View 함수 내에서 값의 변환 및 검증을 수행합니다.
FastAPI와 같은 스타일의 API 개발은 django-ninja 라이브러리를 통해 제공됩니다.
from django.db import models
class Item(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
from django import forms
from .models import Item
class ItemForm(forms.ModelForm):
class Meta:
model = Item
fields = ["name", "price"]
from django.shortcuts import render, redirect
from .forms import ItemForm
from .models import Item
def item_new(request):
if request.method == 'POST':
# 요청 데이터 => Form 객체로 변환
form = ItemForm(data=request.POST, files=request.FILES)
# Form 객체 내에서 유효성 검사 수행
if form.is_valid():
# 유효성 검사에 통과하면, 입력값 들로 데이터베이스 저장
item: Item = form.save()
return redirect('item_list')
else:
form = ItemForm()
return render(request, 'item_form.html', {'form': form})
2. 아키텍처 패턴 비교
FastAPI의 구조
my_fastapi_project/
├── main.py # 단일 진입점
├── routers/ # API 엔드포인트
├── models/ # SQLAlchemy 모델
├── schemas/ # Pydantic 스키마
└── crud/ # 데이터베이스 작업
Django의 MTV 패턴
my_django_project/
│
├── manage.py # 프로젝트 관리 명령, 진입점
│
├── mysite/ # 프로젝트 설정
│ ├── settings.py
│ ├── urls.py # 최상위 URL 패턴 설정
│ ├── asgi.py # ASGI 모드, 서버 진입점
│ └── wsgi.py # WSGI 모드, 서버 진입점
│
├── accounts/ # 계정 관련된 기능 구현을 위한 장고 앱
│ ├── models.py # M: 데이터 모델
│ ├── views.py # V: 비즈니스 로직
│ ├── templates/ # T: HTML 템플릿
│ ├── urls.py # URL 라우팅
│ └── admin.py # 자동 관리자 페이지
│
└── blog/ # 블로그 기능 구현을 위한 장고 앱
├── models.py # M: 데이터 모델
├── views.py # V: 비즈니스 로직
├── templates/ # T: HTML 템플릿
├── urls.py # URL 라우팅
└── admin.py # 자동 관리자 페이지
라이브러리 설치 디렉토리
│
└── django/contrib/auth/ # 장고 기본 앱 `auth`
├── models.py
├── views.py
├── templates/
├── urls.py
└── admin.py
Note
향후 다른 장고 사이트에서 블로그 기능이 필요할 때 blog 폴더만 옮겨서 설정만 해주면 OK.
Note
models.py 파일도 모델 개수가 많아질 경우 models/ 폴더를 두시고,
목적에 맞게 여러 파일로 나눠 모델을 관리하실 수 있습니다.
MTV vs MVC
Django의 MTV는 전통적인 MVC 패턴의 변형입니다:
- Model = Model (동일)
- Template = View (화면 표시)
- View = Controller (로직 처리)
3. 핵심 기능 비교
| 기능 | Django | FastAPI |
|---|---|---|
| 주 용도 | 풀스택 웹 애플리케이션 (+ API 등 지원) | RESTful API 서버 |
| 프로젝트 구조 | 앱 기반 모듈화 | 직접 아키텍처 설계 필요 |
| 라우팅 | View와 URL Pattern을 분리하여 유연한 매핑 지원 | 장식자 기반으로 강한 결합 |
| 데이터 검증 | Django Forms / DRF Serializer / django-ninja Pydantic | Pydantic |
| ORM | Django ORM을 중심으로 여러 기능들이 유기적인 지원 | 기본 지원이 없기에 SQLAlchemy 등의 다양한 써드파티 사용 가능 |
| 템플릿 엔진 | Django Templates (내장) | 써드파티 jinja2 템플릿 지원 (API 전용) |
| 인증 | 세션(기본지원), JWT, OAuth 등은 써드파티를 통해 지원 | 기본 지원은 없고, 써드파티를 통한 지원 |
| 관리자 페이지 | 기본 지원 | 없음 |
| 비동기 지원 | 부분 지원 (3.1+) | 완전 지원 |
4. 코드 비교: 동일한 기능 구현
사용자 목록 조회
FastAPI:
from fastapi import FastAPI, Depends
from sqlalchemy.orm import Session
app = FastAPI()
@app.get("/users/", response_model=list[UserSchema])
async def get_users(db: Session = Depends(get_db)):
users = db.query(User).all()
return users
Django:
# views.py
from django.shortcuts import render
from .models import User
def user_list(request):
users = User.objects.all()
return render(request, 'users/list.html', {'users': users})
# API 응답 (django-rest-framework)
class UserListAPIView(APIView):
serializer_class = UserSerializer
queryset = User.objects.all()
user_list = UserListAPIView.as_view()
# API 응답 (django-ninja)
@router.get("/users", response=list[UserSchema])
def user_list(request):
users = User.objects.all()
return users
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('users/', views.user_list, name='user_list'),
]
5. 언제 어떤 프레임워크를 선택할까?
Django를 선택해야 할 때
"완성된 생태계로 빠른 비즈니스 가치 창출이 목표일 때"
- 풀스택 웹 애플리케이션: 사용자 인증, 관리자 패널, ORM이 모두 필요한 전통적인 웹서비스
- 팀 생산성 우선: 개발자 간 일관된 코드 스타일과 구조가 중요한 팀 프로젝트
- 빠른 MVP 출시: "Batteries included" 철학으로 초기 개발 속도가 중요한 스타트업
FastAPI를 선택해야 할 때
"성능과 유연성이 핵심"
- 모던 개발 스택: 타입 힌트, 자동 문서화, 최신 Python 기능 활용이 중요한 프로젝트
django-ninja를 통해서도 지원
- 고성능 요구사항: 비동기 처리와 높은 처리량이 중요한 서비스
Note
구현하시다보면 매번 똑같은 형태의 보일러플레이트 코드를 작성하게 되시거나, 비슷비슷한 CRUD 기능들의 반복 구현하시게 되는 경우가 많습니다.
django는 반복을 줄여주기 위한 다양한 기능들을 제공해줍니다.
6. Django의 "배터리 포함" 철학
Django는 웹 개발에 필요한 거의 모든 것을 내장하고 있고, 모든 기능들이 유기적으로 관리되고 있습니다.
# Django에 내장된 기능들
INSTALLED_APPS = [
'django.contrib.admin', # 관리자 사이트
'django.contrib.auth', # 안전한 인증 시스템
'django.contrib.sessions', # 세션 지원
'django.contrib.messages', # 메시지 프레임워크 (ex: "저장되었습니다.")
'django.contrib.staticfiles', # 정적 파일 관리
]
FastAPI에서는 각각 별도 구현하거나, 써드파티 라이브러리를 통해 지원합니다. 각 라이브러리의 관리 주체가 다릅니다.
- Admin: 직접 구현
- Auth: JWT 라이브러리 사용
- Sessions: Redis 등 별도 구현
- Messages: 직접 구현
- Static: 별도 설정
7. 마이그레이션: Django의 강력한 기능
Django:
FastAPI + SQLAlchemy:
8. 실습: 첫 페이지 만들기
FastAPI로 만든 API
Django로 만든 웹 페이지
# views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello World")
# 또는 템플릿 사용
def index(request):
return render(request, 'index.html', {'message': 'Hello World'})
정리
Django와 FastAPI는 각각의 장단점이 명확한 프레임워크입니다:
- Django: 풀스택 웹 개발, 빠른 프로토타이핑, 관리자 페이지
- FastAPI: API 서버, 마이크로서비스, 고성능, 타입 안정성
FastAPI 개발자로서 Django를 배우면:
- 풀스택 개발 능력 확보
- 프로젝트 요구사항에 따른 적절한 도구 선택
- 더 넓은 파이썬 웹 생태계 이해
다음 장에서는 Django 개발환경을 구축해보겠습니다. FastAPI와 비슷한 부분이 많으니 쉽게 따라오실 수 있을 거예요!