Django 구조 — MTV 패턴
Django는 "배터리 포함(batteries included)" 철학의 풀스택 웹 프레임워크입니다. 관리자 패널, ORM, 인증, 폼 처리가 기본 내장되어 있습니다.
Django vs FastAPI
| 항목 | Django | FastAPI |
|---|---|---|
| 철학 | 풀스택, 배터리 포함 | 마이크로, 모듈식 |
| ORM | 내장 Django ORM | 선택 (SQLAlchemy 등) |
| 관리자 | 내장 Admin | 없음 |
| 비동기 | 부분 지원 (Django 4.1+) | 네이티브 async |
| 자동 문서 | 없음 (drf-spectacular) | OpenAPI 자동 생성 |
| 학습 곡선 | 가파름 | 완만함 |
| 적합한 용도 | CMS, 어드민, 대형 서비스 | API 서버, 마이크로서비스 |
설치 및 프로젝트 생성
pip install django djangorestframework
# 프로젝트 생성
django-admin startproject myproject .
# 앱 생성
python manage.py startapp users
python manage.py startapp products
# 개발 서버
python manage.py runserver
# DB 마이그레이션
python manage.py makemigrations
python manage.py migrate
# 슈퍼유저 생성
python manage.py createsuperuser
MTV 패턴
요청 (Request)
│
▼
urls.py ← URL 라우팅
│
▼
View ← 비즈니스 로직 처리
│
├── Model ← 데이터베이스 접근 (ORM)
│
▼
Template ← HTML 렌더링 (또는 JSON 직렬화)
│
▼
응답 (Response)
MVC (일반) Django MTV
Controller → View
Model → Model
View → Template
프로젝트 구조
myproject/ ← 루트 디렉토리
├── manage.py
├── myproject/ ← 프로젝트 패키지
│ ├── settings/ ← 설정 분리
│ │ ├── base.py # 공통 설정
│ │ ├── development.py # 개발 환경
│ │ └── production.py # 프로덕션 환경
│ ├── urls.py ← 루트 URL 설정
│ ├── asgi.py
│ └── wsgi.py
├── users/ ← 사용자 앱
│ ├── models.py
│ ├── views.py
│ ├── urls.py
│ ├── serializers.py
│ ├── admin.py
│ └── tests.py
└── products/ ← 상품 앱
├── models.py
├── views.py
└── ...
설정 분리 전략
# myproject/settings/base.py
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent.parent
SECRET_KEY = "change-me-in-production"
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
# Third-party
"rest_framework",
"corsheaders",
# Local apps
"users",
"products",
]
MIDDLEWARE = [
"corsheaders.middleware.CorsMiddleware",
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]
ROOT_URLCONF = "myproject.urls"
# 데이터베이스
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}
AUTH_USER_MODEL = "users.User" # 커스텀 User 모델
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
# myproject/settings/development.py
from .base import *
DEBUG = True
ALLOWED_HOSTS = ["localhost", "127.0.0.1"]
CORS_ALLOW_ALL_ORIGINS = True
# 개발용 이메일 (콘솔 출력)
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
# myproject/settings/production.py
from .base import *
import os
DEBUG = False
SECRET_KEY = os.environ["DJANGO_SECRET_KEY"]
ALLOWED_HOSTS = os.environ["ALLOWED_HOSTS"].split(",")
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": os.environ["DB_NAME"],
"USER": os.environ["DB_USER"],
"PASSWORD": os.environ["DB_PASSWORD"],
"HOST": os.environ["DB_HOST"],
"PORT": "5432",
}
}
# 보안 설정
SECURE_HSTS_SECONDS = 31536000
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
# 환경 선택
export DJANGO_SETTINGS_MODULE=myproject.settings.development
python manage.py runserver
URL 설정
# myproject/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("api/v1/users/", include("users.urls")),
path("api/v1/products/", include("products.urls")),
path("api/v1/auth/", include("users.auth_urls")),
]
# users/urls.py
from django.urls import path
from . import views
urlpatterns = [
path("", views.UserListView.as_view(), name="user-list"),
path("<int:pk>/", views.UserDetailView.as_view(), name="user-detail"),
]
정리
| 개념 | 설명 |
|---|---|
| MTV | Model-Template-View 패턴 |
startproject | 프로젝트 뼈대 생성 |
startapp | 기능별 앱 생성 |
settings/ 분리 | base / development / production |
INSTALLED_APPS | 앱 등록 |
AUTH_USER_MODEL | 커스텀 User 모델 지정 |
Django는 규약(Convention)을 따르면 빠르게 구축할 수 있는 프레임워크입니다.