Django 아키텍처 이해하기: 초보자를 위한 친절한 가이드
Source: Dev.to
1. Django의 핵심 패턴: MVT != MVC
Laravel, Rails, 그리고 Flask 확장과 같은 대부분의 프레임워크는 고전적인 MVC(Model‑View‑Controller) 디자인 패턴을 따르지만, Django는 MVT(Model‑View‑Template)라는 밀접하게 연관된 접근 방식을 사용합니다.
- Model – 데이터베이스 구조를 정의하고 데이터 상호작용을 처리합니다.
- Template – 사용자가 보는 화면(UI 렌더링)을 담당합니다.
- View – 로직을 처리하고, 요청을 받아 응답을 반환합니다.
Django가 동작하는 간단한 흐름:
User request → URL → View (logic) → Model (data) → Template (display UI) → Browser
이러한 분리는 개발자가 깔끔하고 확장 가능한 코드를 유지하도록 도와주며, 사용자 인터페이스와 관리자 관리 기능을 모두 갖춘 복잡한 애플리케이션에 적합합니다.
2. Django의 다중 폴더 시스템 이해
Django 프로젝트는 두 가지 주요 유형의 폴더로 구성되며, 각각 고유한 목적을 가집니다.
2.1 프로젝트 폴더 구조
다음 명령을 실행하면:
django-admin startproject myproject
Django는 외부 폴더(myproject/)를 프로젝트 루트 또는 작업 공간으로, 내부 폴더(myproject/)를 설정 파일을 담는 패키지로 생성합니다.
myproject/ # 프로젝트 루트
│
├── myproject/ # 설정 패키지
│ ├── __init__.py
│ ├── settings.py # DB, 앱, 미들웨어, 템플릿 등
│ ├── urls.py # 프로젝트 수준 URL 라우팅
│ ├── wsgi.py / asgi.py # 서버 게이트웨이 인터페이스
│
├── manage.py # CLI 유틸리티 (마이그레이션, runserver 등)
└── db.sqlite3 # 예시 데이터베이스
내부 폴더의 핵심 파일
settings.py– 데이터베이스, 설치된 앱, 미들웨어, 정적 파일 등 설정을 한 곳에서 관리합니다.urls.py– 프로젝트 수준 라우팅 테이블; 앱별 URL 패턴을 포함할 수 있습니다.wsgi.py/asgi.py– 웹 서버에 프로젝트를 배포하기 위한 진입점입니다.__init__.py– 폴더를 파이썬 패키지로 인식하게 하여 import를 가능하게 합니다.
외부 폴더는 프로젝트의 몸통(모든 것이 존재하는 곳)이고, 내부 폴더는 뇌(설정)라고 생각하면 됩니다.
2.2 앱 폴더 구조
프로젝트를 만든 뒤, 기능별로 앱을 추가합니다:
python manage.py startapp myapp
Django는 다음과 같은 구조를 생성합니다:
myapp/
├── __init__.py # 폴더를 파이썬 패키지로 표시
├── admin.py # 모델을 admin 사이트에 등록
├── apps.py # 앱 설정
├── models.py # 이 앱의 데이터베이스 모델
├── views.py # 이 앱의 로직 / 컨트롤러
├── urls.py # 앱 전용 라우트(선택 사항)
├── migrations/ # 이 앱의 데이터베이스 마이그레이션
└── templates/ # 이 앱의 선택적 HTML 템플릿
이 구조가 의미하는 바
- 모듈화 – 각 앱이 자체적으로 독립됩니다.
- 재사용성 – 하나의 앱을 여러 프로젝트에 플러그인 형태로 삽입할 수 있습니다.
- 조직화 – 각 앱이 자체 모델, 뷰, 템플릿을 갖습니다.
예를 들어 blog, shop, users와 같은 앱을 동일 프로젝트 안에 둘 수 있습니다.
2.3 프로젝트와 앱이 함께 작동하는 방식
프로젝트(myproject/)는 전역 설정과 라우팅을 담당하고, 각 앱은 자체 모델, 뷰, 템플릿, 로직을 포함합니다.
# myproject/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')), # 'blog' 앱의 라우트 포함
]
이러한 모듈식 설계는 특히 규모가 큰 프로젝트에서 코드를 깔끔하게 유지하고 확장성을 높여줍니다.
2.4 핵심 정리
- 관심사의 분리: 프로젝트는 설정 및 전역 라우팅을 담당하고, 각 앱은 특정 기능 집합을 담당합니다.
- Models는 데이터를 관리하고, views는 비즈니스 로직을, templates는 프레젠테이션을 담당합니다.
- 프로젝트 + 앱 구조 덕분에 새로운 기능을 추가하려면 새 앱을 만들면 되며, 기존 코드를 건드리지 않아도 되어 유지보수와 확장성이 용이합니다.