Django의 아키텍처 설계 (MVC 패턴과 MTV 패턴)
Django는 웹 애플리케이션을 구조적으로 개발하기 위해 MTV(Model-Template-View) 패턴을 따릅니다.
이는 전통적인 MVC(Model-View-Controller) 패턴에서 일부 역할이 변형된 구조입니다.
(나는 설계 순서에 따라 M-V-T라고 생각 )
1. Django 아키텍처 개요
Django의 아키텍처는 다음 3가지 주요 요소로 구성됩니다:
- Model (모델):
- 데이터베이스와의 상호작용을 담당 (데이터 저장, 검색, 수정, 삭제).
- ORM(Object-Relational Mapping)을 통해 SQL 없이 데이터 처리 가능.
- Template (템플릿):
- HTML/CSS로 구성된 프론트엔드, 사용자에게 데이터를 보여줌.
- Django의 템플릿 엔진을 사용하여 동적인 콘텐츠 출력.
- View (뷰):
- 요청을 처리하고 필요한 데이터를 모델에서 가져와 템플릿에 전달.
- 비즈니스 로직을 담당.
2. MTV 패턴과 MVC 패턴의 차이점
패턴 설명
| MVC 패턴 | Model-View-Controller: 뷰와 컨트롤러를 분리하여 역할 수행. |
| MTV 패턴 (Django) | Model-Template-View: Django는 "Template"을 View로 간주. |
Django에서는 'View'가 실제로 컨트롤러 역할을 하고, 프론트엔드는 'Template'로 분리됩니다.
즉, Django에서의 역할 매핑은 다음과 같습니다:
MVC (기존) MTV (Django) 역할
| Model | Model | 데이터 처리 및 저장 |
| View | Template | 사용자에게 보여지는 화면 |
| Controller | View | 요청을 처리하고 응답 반환 |
3. Django의 요청 흐름 (아키텍처의 동작 방식)
Django의 웹 요청 처리 흐름을 단계별로 살펴보겠습니다.
- 사용자가 웹 브라우저에서 특정 URL(예: http://example.com/products/)로 요청을 보냄.
- Django의 urls.py가 요청을 분석하여 적절한 view로 전달.
- view.py에서 비즈니스 로직 수행 및 필요 시 model을 통해 데이터를 가져옴.
- 데이터를 template에 전달하여 HTML로 렌더링.
- 완성된 웹 페이지가 사용자에게 반환.
4. 예제와 함께 아키텍처 흐름 살펴보기
(1) 프로젝트 및 앱 생성
django-admin startproject myshop
cd myshop
python manage.py startapp products
프로젝트 구조:
myshop/
│-- myshop/ # 프로젝트 설정 폴더
│ │-- settings.py # 프로젝트 설정
│ │-- urls.py # 프로젝트 전체 URL 관리
│
│-- products/ # 앱 폴더 (상품 기능)
│ │-- models.py # 데이터 모델 정의
│ │-- views.py # 비즈니스 로직 처리
│ │-- urls.py # 앱 URL 설정
│ │-- templates/ # 템플릿 폴더
│ │-- product_list.html # 상품 목록 템플릿
│
│-- manage.py # Django 명령어 실행 파일
(2) Model (데이터베이스 모델 생성)
products/models.py에서 상품 모델 생성:
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
price = models.DecimalField(max_digits=10, decimal_places=2)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
역할:
- Product 모델이 products 테이블을 생성하며, 상품 이름, 설명, 가격을 저장.
(3) View (요청 처리 및 비즈니스 로직)
products/views.py에서 요청 처리:
from django.shortcuts import render
from .models import Product
def product_list(request):
products = Product.objects.all() # 모든 상품 가져오기
return render(request, 'product_list.html', {'products': products})
역할:
- 사용자의 요청을 받아 Product 모델의 데이터를 가져와 템플릿에 전달.
(4) URL 라우팅 (라우터 설정)
프로젝트 수준의 URL 설정 (myshop/urls.py)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('products/', include('products.urls')), # 앱의 URL 연결
]
앱 수준의 URL 설정 (products/urls.py)
from django.urls import path
from .views import product_list
urlpatterns = [
path('', product_list, name='product_list'),
]
역할:
- http://example.com/products/ 요청이 product_list 뷰로 연결됨.
(5) Template (프론트엔드 구현)
products/templates/product_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>Product List</title>
</head>
<body>
<h1>Product List</h1>
<ul>
{% for product in products %}
<li>{{ product.name }} - ${{ product.price }}</li>
{% endfor %}
</ul>
</body>
</html>
역할:
- 데이터를 HTML로 렌더링하여 사용자에게 보여줌.
(6) 결과 확인
서버를 실행하여 테스트:
python manage.py runserver
- 브라우저에서 http://127.0.0.1:8000/products/로 접속하면 상품 목록이 출력됨.
5. Django 아키텍처 설계의 주요 원칙
- 모듈화(Modularity):
- 기능별로 앱을 나누고, 독립적으로 유지보수할 수 있도록 설계.
- 재사용성(Reusability):
- 앱을 다른 프로젝트에서도 쉽게 재사용 가능.
- 확장성(Scalability):
- 기능을 쉽게 추가할 수 있도록 분리된 구조.
- 보안(Security):
- 내장된 보안 기능(세션, 사용자 인증 등)을 사용하여 보안 강화.
6. Django 아키텍처 설계 시 고려해야 할 사항
- 기능별로 앱을 나누어 설계.
- 예: 사용자 관리, 게시판, 결제 등 각 기능을 독립적인 앱으로 분리.
- URL 라우팅을 체계적으로 구성.
- 프로젝트 수준에서 앱을 포함하여 URL 관리.
- 모델을 설계할 때 관계(ForeignKey, ManyToMany 등)를 신중히 정의.
- 템플릿 시스템을 활용하여 UI의 재사용성을 높이기.
- base.html을 만들어 공통 레이아웃 설정.
7. 요약
- Django는 MTV 패턴을 따름.
- Model(데이터 처리), Template(프론트엔드), View(요청 처리).
- 요청 흐름:
사용자 요청 → URL 매핑 → View 처리 → Model 조작 → Template 렌더링. - 기능을 앱으로 세분화하여 확장성과 유지보수를 고려한 설계가 중요.
- 실제 예제:
- 상품 관리 기능을 모델, 뷰, 템플릿으로 분리하여 구현.
'Django' 카테고리의 다른 글
| Django ORM과 클래스 상속 원리 (0) | 2025.02.01 |
|---|---|
| Django코드 VS Python 코드 : 웹 개발 내 각각 역할 비교 및 분석 (0) | 2025.01.20 |
| Djagno - 프로젝트 내 url / app 내 url의 관계 및 역할 (0) | 2025.01.20 |
| Django 개발 WORKFLOW (1) | 2025.01.20 |