기본 개념
Django
Python 웹 프레임워크로, 웹 애플리케이션의 전반적인 백엔드 개발을 돕는 도구입니다. HTML 템플릿 렌더링, ORM(Object-Relational Mapping), 라우팅, 인증 등 웹 개발 전반에 필요한 도구를 제공합니다.
- 사용 사례: 블로그, 커머스 사이트, 포럼 등.
Django REST Framework (DRF)
Django 위에 추가되는 라이브러리로, RESTful API를 쉽게 개발할 수 있게 도와줍니다. DRF는 JSON 응답, API 인증, 직렬화(Serialization) 등을 기본적으로 지원하며, Django ORM과 잘 통합됩니다.
- 사용 사례: 모바일 앱 백엔드, 데이터 제공용 API 서버, SPA(Single Page Application) 백엔드.
기능 비교
기능 | Django | DRF |
템플릿 렌더링 | HTML 페이지를 렌더링하는 데 적합 | JSON이나 XML 같은 데이터 응답을 제공 |
직렬화 | 지원하지 않음 | Serializer를 통해 Python 객체를 JSON으로 변환 (반대도 가능) |
ORM 지원 | Django ORM으로 데이터베이스 연동 | Django ORM을 기반으로 직렬화와 통합 |
라우팅 | URL 패턴 매핑 (장고의 urlpatterns) | API 전용 라우터 (routers) 제공 |
인증 | 기본 인증 시스템 (세션, 사용자 관리) | 토큰 기반 인증(JWT), OAuth 등 다양한 인증 방식 지원 |
목적 | 전통적인 웹 애플리케이션 개발 | API 개발 전용 |
브라우저에서의 디버깅 | 기본 Django Admin 제공 | API를 테스트할 수 있는 Browsable API UI 제공 |
코드 예시 비교
Django로 구현 (HTML 렌더링)
사용자 정보를 보여주는 HTML 페이지 작성.
# views.py
from django.shortcuts import render
from .models import User
def user_list(request):
users = User.objects.all()
return render(request, 'user_list.html', {'users': users})
# urls.py
from django.urls import path
from .views import user_list
urlpatterns = [
path('users/', user_list, name='user_list'),
]
# user_list.html
<!DOCTYPE html>
<html>
<body>
<ul>
{% for user in users %}
<li>{{ user.name }}</li>
{% endfor %}
</ul>
</body>
</html>
결과: /users/로 접속하면 사용자 리스트를 보여주는 HTML 페이지가 렌더링됩니다.
DRF로 구현 (JSON API)
사용자 정보를 제공하는 RESTful API 작성.
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer
class UserListAPIView(APIView):
def get(self, request):
users = User.objects.all()
serializer = UserSerializer(users, many=True)
return Response(serializer.data)
# serializers.py
from rest_framework import serializers
from .models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'name', 'email']
# urls.py
from django.urls import path
from .views import UserListAPIView
urlpatterns = [
path('api/users/', UserListAPIView.as_view(), name='user_list_api'),
]
결과: /api/users/로 요청을 보내면 JSON 형식으로 사용자 데이터를 응답합니다
[
{"id": 1, "name": "Alice", "email": "alice@example.com"},
{"id": 2, "name": "Bob", "email": "bob@example.com"}
]
Django와 DRF를 함께 사용하는 이유
Django는 HTML 기반 웹 애플리케이션을 빠르게 개발하는 데 강력하지만, JSON과 같은 데이터를 주고받는 API 개발에는 적합하지 않습니다. DRF는 이를 보완하여 Django의 강력한 ORM과 인증 기능을 활용하면서도 RESTful API를 간단히 설계할 수 있도록 합니다.
- Django로 전통적인 웹 페이지와 관리자(Admin) 페이지를 개발하고,
- DRF로 모바일 앱이나 프론트엔드(SPA)와 통신하는 API를 추가 개발하는 방식으로 두 도구를 결합할 수 있습니다.
DRF의 장점
- 간편한 직렬화: Serializer 클래스로 데이터를 직렬화/역직렬화하는 작업이 쉽습니다.
- API 문서화: 자동으로 브라우저에서 테스트 가능한 UI 제공 (Browsable API).
- 다양한 인증 방식 지원: OAuth2, JWT 등.
- 필터링과 페이징: 데이터의 검색, 정렬, 페이지네이션 기능 내장.
- 확장성: 커스터마이징 가능한 강력한 구조.
6. 어떤 것을 선택해야 할까?
- HTML 페이지 중심의 프로젝트라면 Django만으로 충분.
- 모바일 앱 또는 React/Vue.js 같은 SPA와 통신할 API가 필요하다면 Django + DRF 조합 추천.