Django 완벽 가이드 | MTV·ORM·Admin·REST Framework·배포
이 글의 핵심
Django로 풀스택 웹 앱을 구축하는 완벽 가이드. MTV 패턴, ORM, Admin, Django REST Framework, 인증, 배포까지 실전 예제로 정리. Django·Python·Backend 중심으로 설명합니다.
이 글의 핵심
Django로 풀스택 웹 앱을 구축하는 완벽 가이드입니다. MTV 패턴, ORM, Admin, Django REST Framework, 인증, 배포까지 실전 예제로 정리했습니다.
실무 경험 공유: Django로 SaaS 플랫폼을 구축하면서, Admin 패널로 개발 시간을 40% 단축하고 ORM으로 데이터베이스 마이그레이션을 안전하게 관리한 경험을 공유합니다.
들어가며: “백엔드 개발이 복잡해요”
실무에서 마주치는 문제들
Admin 패널을 직접 만들어야 해요
CRUD 인터페이스 개발에 시간이 오래 걸립니다. Django는 자동 생성합니다. SQL 쿼리가 복잡해요
Raw SQL을 작성해야 합니다. Django ORM은 Python 코드로 작성합니다. 인증 구현이 어려워요
직접 구현하면 보안 이슈가 있습니다. Django는 검증된 인증 시스템을 제공합니다.
1. Django란?
핵심 특징
Django는 Python 기반 풀스택 웹 프레임워크입니다. 주요 장점
- Batteries Included: 모든 기능 내장
- Admin 패널: 자동 생성
- ORM: 강력한 데이터베이스 추상화
- 보안: CSRF, XSS, SQL Injection 방어
- 확장성: Instagram, Pinterest 사용
2. 프로젝트 생성
설치
pip install django
django-admin startproject myproject
cd myproject
python manage.py runserver
앱 생성
python manage.py startapp users
3. Models (ORM)
모델 정의
# users/models.py
from django.db import models
class User(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
age = models.IntegerField(null=True, blank=True)
is_active = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['-created_at']
def __str__(self):
return self.name
마이그레이션
python manage.py makemigrations
python manage.py migrate
4. Views
Function-based View
# users/views.py
from django.http import JsonResponse
from django.views.decorators.http import require_http_methods
from .models import User
@require_http_methods([GET])
def user_list(request):
users = User.objects.all().values('id', 'name', 'email')
return JsonResponse(list(users), safe=False)
@require_http_methods([GET])
def user_detail(request, user_id):
try:
user = User.objects.get(id=user_id)
return JsonResponse({
'id': user.id,
'name': user.name,
'email': user.email,
})
except User.DoesNotExist:
return JsonResponse({'error': 'User not found'}, status=404)
Class-based View
from django.views.generic import ListView, DetailView
class UserListView(ListView):
model = User
template_name = 'users/list.html'
context_object_name = 'users'
paginate_by = 10
class UserDetailView(DetailView):
model = User
template_name = 'users/detail.html'
context_object_name = 'user'
5. URLs
# users/urls.py
from django.urls import path
from . import views
urlpatterns = [
path(', views.user_list, name='user_list'),
path('<int:user_id>/', views.user_detail, name='user_detail'),
]
# myproject/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/users/', include('users.urls')),
]
6. Django REST Framework
설치
pip install djangorestframework
# settings.py
INSTALLED_APPS = [
# ...
'rest_framework',
'users',
]
Serializer
# users/serializers.py
from rest_framework import serializers
from .models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'name', 'email', 'age', 'is_active', 'created_at']
read_only_fields = ['id', 'created_at']
ViewSet
# users/views.py
from rest_framework import viewsets
from .models import User
from .serializers import UserSerializer
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
Router
# users/urls.py
from rest_framework.routers import DefaultRouter
from .views import UserViewSet
router = DefaultRouter()
router.register(r'users', UserViewSet)
urlpatterns = router.urls
7. Admin
등록
# users/admin.py
from django.contrib import admin
from .models import User
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
list_display = ['id', 'name', 'email', 'is_active', 'created_at']
list_filter = ['is_active', 'created_at']
search_fields = ['name', 'email']
ordering = ['-created_at']
Superuser 생성
python manage.py createsuperuser
브라우저에서 http://localhost:8000/admin 접속
8. 인증
기본 인증
from django.contrib.auth.decorators import login_required
@login_required
def protected_view(request):
return JsonResponse({'message': 'Protected'})
JWT (djangorestframework-simplejwt)
pip install djangorestframework-simplejwt
# settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
],
}
# urls.py
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)
urlpatterns = [
path('api/token/', TokenObtainPairView.as_view()),
path('api/token/refresh/', TokenRefreshView.as_view()),
]
9. 배포
Gunicorn
pip install gunicorn
gunicorn myproject.wsgi:application --bind 0.0.0.0:8000
Docker
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN python manage.py collectstatic --noinput
EXPOSE 8000
CMD ["gunicorn", "myproject.wsgi:application", "--bind", "0.0.0.0:8000"]
취업·면접과 연결하기
MTV·ORM·Admin·DRF는 Python 백엔드·풀스택 면접에서 자주 이어집니다. 기술 면접 완벽 대비 가이드와, 코테·과제 병행은 코딩 테스트 완벽 대비 가이드와 같이 잡아 두면 좋습니다.
정리 및 체크리스트
핵심 요약
- Django: Python 풀스택 프레임워크
- MTV: Model-Template-View 패턴
- ORM: 강력한 데이터베이스 추상화
- Admin: 자동 생성 관리 패널
- DRF: REST API 구축
- 보안: 내장 보안 기능
구현 체크리스트
- Django 프로젝트 생성
- Models 정의
- Views 구현
- URLs 설정
- Admin 등록
- DRF로 API 구현
- 인증 구현
- 배포
같이 보면 좋은 글
- FastAPI 완벽 가이드
- PostgreSQL 고급 가이드
- Redis 고급 가이드
이 글에서 다루는 키워드
Django, Python, Backend, MTV, ORM, REST API, Full Stack
자주 묻는 질문 (FAQ)
Q. Django vs FastAPI, 어떤 게 나은가요?
A. Django는 풀스택 프레임워크입니다. FastAPI는 API 전용입니다. Admin 패널이 필요하면 Django, API만 필요하면 FastAPI를 권장합니다.
Q. Flask vs Django, 어떤 게 나은가요?
A. Django가 더 많은 기능을 제공합니다. Flask는 더 가볍습니다. 대규모 프로젝트는 Django, 소규모는 Flask를 권장합니다.
Q. 비동기를 지원하나요?
A. 네, Django 3.1+부터 async views를 지원합니다.
Q. 프로덕션에서 사용해도 되나요?
A. 네, Instagram, Pinterest, Mozilla 등 많은 기업에서 사용합니다.