Django의 아키텍처 설계 (MVC 패턴과 MTV 패턴)

Django는 웹 애플리케이션을 구조적으로 개발하기 위해 MTV(Model-Template-View) 패턴을 따릅니다.
이는 전통적인 MVC(Model-View-Controller) 패턴에서 일부 역할이 변형된 구조입니다.

(나는 설계 순서에 따라 M-V-T라고 생각 )


1. Django 아키텍처 개요

Django의 아키텍처는 다음 3가지 주요 요소로 구성됩니다:

  1. Model (모델):
    • 데이터베이스와의 상호작용을 담당 (데이터 저장, 검색, 수정, 삭제).
    • ORM(Object-Relational Mapping)을 통해 SQL 없이 데이터 처리 가능.
  2. Template (템플릿):
    • HTML/CSS로 구성된 프론트엔드, 사용자에게 데이터를 보여줌.
    • Django의 템플릿 엔진을 사용하여 동적인 콘텐츠 출력.
  3. 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의 웹 요청 처리 흐름을 단계별로 살펴보겠습니다.

  1. 사용자가 웹 브라우저에서 특정 URL(예: http://example.com/products/)로 요청을 보냄.
  2. Django의 urls.py가 요청을 분석하여 적절한 view로 전달.
  3. view.py에서 비즈니스 로직 수행 및 필요 시 model을 통해 데이터를 가져옴.
  4. 데이터를 template에 전달하여 HTML로 렌더링.
  5. 완성된 웹 페이지가 사용자에게 반환.

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'),
]

역할:


(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 아키텍처 설계의 주요 원칙

  1. 모듈화(Modularity):
    • 기능별로 앱을 나누고, 독립적으로 유지보수할 수 있도록 설계.
  2. 재사용성(Reusability):
    • 앱을 다른 프로젝트에서도 쉽게 재사용 가능.
  3. 확장성(Scalability):
    • 기능을 쉽게 추가할 수 있도록 분리된 구조.
  4. 보안(Security):
    • 내장된 보안 기능(세션, 사용자 인증 등)을 사용하여 보안 강화.

6. Django 아키텍처 설계 시 고려해야 할 사항

  1. 기능별로 앱을 나누어 설계.
    • 예: 사용자 관리, 게시판, 결제 등 각 기능을 독립적인 앱으로 분리.
  2. URL 라우팅을 체계적으로 구성.
    • 프로젝트 수준에서 앱을 포함하여 URL 관리.
  3. 모델을 설계할 때 관계(ForeignKey, ManyToMany 등)를 신중히 정의.
  4. 템플릿 시스템을 활용하여 UI의 재사용성을 높이기.
    • base.html을 만들어 공통 레이아웃 설정.

7. 요약

  1. Django는 MTV 패턴을 따름.
    • Model(데이터 처리), Template(프론트엔드), View(요청 처리).
  2. 요청 흐름:
    사용자 요청 → URL 매핑 → View 처리 → Model 조작 → Template 렌더링.
  3. 기능을 앱으로 세분화하여 확장성과 유지보수를 고려한 설계가 중요.
  4. 실제 예제:
    • 상품 관리 기능을 모델, 뷰, 템플릿으로 분리하여 구현.

 

+ Recent posts