[Django] 장고의 MVT 패턴 (Model-View-Template)

2025. 10. 7. 20:16·Development & Projects/Python

장고는 기본적으로 MVT 패턴에 따라 애플리케이션을 개발하도록 유도합니다.

 

MVT 패턴

데이터(Model), 사용자 인터페이스(View), 데이터를 처리하는 로직(Controller)을 구분해서 한 요소가 다른 요소들에 영향을 주지 않도록 설계하는 방식을 의미합니다.

 

이런 방식으로 개발을 진행하면 UI 디자이너는 데이터 관리나 애플리케이션 로직에 신경 쓰지 않고도 화면 UI를 설계할 수 있고 로직이나 데이터를 설계하는 개발자도 화면 디자인은 디자이너에게 맡기고 자신의 설계 및 개발 업무에만 집중할 수 있습니다. 

 

장고 프레임워크에서는 View를 Template, Controller를 View라고 표현하여 MVT 패턴이라고 합니다.

각각의 역할은 다음과 같습니다.

  • Model -  데이터베이스에 저장되는 데이터
  • Template - 사용자에게 보이는 UI 부분
  • View - 실질적으로 프로그램 로직이 동작하여 데이터를 가져오고 적절하게 처리한 결과를 템플릿에 전달

 

 

웹 클라이언트의 요청을 받아 장고에서 MVT 패턴에 맞게 처리하는 과정을 요약하면 다음과 같습니다.

  • 클라이언트 요청
    → 사용자가 브라우저에서 주소(URL)를 입력하거나 버튼을 클릭함.
  • URL 분석 (URLconf)
    → Django가 urls.py를 보고, 그 URL을 처리할 뷰 함수(View)를 찾음.
  • View 실행
    → 해당 뷰 함수가 실행되어 필요한 로직을 처리함.
    (필요하면 Model을 통해 DB에서 데이터 조회·저장)
  • Template 렌더링
    → 뷰가 데이터를 템플릿(HTML)에 넣어 화면을 만듦.
  • 응답 반환
    → 완성된 HTML을 클라이언트(브라우저)에게 돌려줌.

 


Model - 데이터베이스 정의

 

모델이란 사용될 데이터에 대한 정보를 담고 있는 장고의 클래스입니다. 장고에서는 ORM 기법을 바탕으로 애플리케이션에서 사용할 데이터베이스를 클래스로 매핑하여 코딩할 수 있습니다. 즉, 하나의 모델 클래스는 하나의 테이블에 매핑되고, 모델 클래스의 속성은 테이블의 컬럼에 매핑됩니다.

 

  • ORM이란?
  • ORM(Object-Relational Mapping)은 객체 지향 프로그래밍 언어를 사용하여 호환되지 않는 유형의 시스템 간에 데이터를 변환하는 프로그래밍 기술입니다. 즉, 객체와 관계형 데이터베이스의 데이터를 매핑하는 것을 의미합니다.
  • ORM의 주요 기능으로는 객체와 테이블 간의 매핑, 데이터 쿼리 및 조작, 트랜잭션 관리 등이 있습니다. 이 기능들은 개발자가 복잡한 SQL 쿼리 없이도 데이터베이스를 효과적으로 다룰 수 있게 해줍니다. 객체를 대상으로 필요한 작업을 실행하면 ORM이 자동으로 적절한 SQL 구문이나 데이터베이스 API를 호출하여 처리합니다.

ORM 기법에 대한 이해를 돕기 위해 Person이라는 테이블, 즉 장고의 Person 모델 클래스를 정의해보겠습니다.

이러한 모델 클래스는 models.py에 정의합니다.

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length= 30)
    last_name = models.CharField(max_length=30)

 

 

앞서 정의한 Person 모델은 장고 내부의 SQL 명령을 사용해 다음과 같은 데이터베이스 테이블을 자동으로 생성합니다.

CREATE TABLE myapp_person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
);

 

장고에는 데이터 및 컬럼을 자동으로 생성하기 위해 지켜야 하는 규칙이 많습니다. 

  • 애플리케이션명과 모델 클래스명을 밑줄(_)로 연결한 문자열로 정하고 모두 소문자로 표시합니다. 원한다면 다른 이름으로 직접 지정할 수도 있습니다.
  • Primary Key는 Person 클래스에서 정의하지 않아도 장고에서 알아서 부여합니다. 개발자가 직접 지정할 수도 있습니다.

View - 로직 정의

 

장고는 웹 요청에 있는 URL을 분석하고 그 결과로 해당 URL에 매핑된 뷰를 호출합니다.

 

일반적으로 뷰는 웹 요청을 받아서 데이터베이스 접속 등 해당 애플리케이션의 로직에 맞는 처리를 하고 그 결과 데이터를 HTML로 변환하기 위해 템플릿 처리를 한 후, 최종 HTML로 된 응답 데이터를 웹 클라이언트로 반환합니다. 장고에서 뷰는 함수 또는 클래스의 메소드로 작성되며, 웹 요청을 받고 응답을 반환합니다.

 

다양한 형태의 응답 데이터를 만드는 로직을 뷰에 작성하는 것입니다. 이러한 뷰는 보통 views.py에 작성하지만, 원한다면 다른 파일에 작성할 수 있습니다. 

 

아래의 코드는 현재 날짜와 시간을 HTML로 반환하는 뷰 예시입니다.

from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

 

이 예시에서는 클래스가 아닌 함수로 뷰를 작성했습니다. 뷰 함수는 첫 번째 인자로 Http Request 객체(이 예시에서는 request)를 받습니다. 그리고 필요한 처리를 한 후에 최종적으로 HttpResponse 객체를 반환합니다.

 

앞의 예시에서는 HTML 코드를 뷰 함수 내에 직접 사용하였지만, 보통은 별도의 템플릿 파일에 HTML 코드를 작성합니다. 즉, 뷰는 별도로 작성된 템플릿 파일을 해석해서 HTML 코드를 생성하고 이를 HttpResponse 객체에 담아서 클라이언트에게 응답합니다.


Template - 화면 UI 정의

 

장고가 클라이언트에게 반환하는 최종 응답은  HTML 텍스트입니다.  개발자가 작성하는 *.html 파일을 템플릿이라 부르며 이 파일에 화면에 표시되는 UI를 템플릿 문법에 맞게 작성합니다.

 

장고는 자체 템플릿 엔진을 가지고 있기 때문에 디자이너도 쉽게 이해할 수 있는 문법을 제공합니다. 화면 디자인을 변경할 일이 생기면 디자이너는 프로그램 로직에 상관없이 문법에 맞게 템플릿만 수정하면 되므로 디자이너와 개발자 간의 협업이 편리합니다. 또한 장고에서 제공하는 템플릿은 템플릿 태그/필터 기능을 사용하여 파이썬 코드를 직접 사용할 수 있어 더욱 강력하고 확장하기 쉬운 구조로 되어 있습니다.

 

장고에서 템플릿 파일을 찾을 때는 TEMPLATES 및 INSTALLED_APPS에 지정된 애플리케이션의 디렉터리를 검색합니다. 이 항목들은 프로젝트 설정 파일인 settings.py에 정의되어 있습니다.여러 개의 디렉터리를 지정할 수 있는데 지정된 순서대로 디렉터리를 검색하여 템플릿 파일을 찾습니다.

 


MVT를 코딩할 때에 정해진 순서는 없으나 일반적으로 뷰와 템플릿이 서로 영향을 미치므로 독립적으로 개발할 수 있는 모델을 먼저 코딩하고 이후에 뷰와 템플릿을 같이 코딩하는 것이 일반적입니다.

 

프로젝트 설정 파일 및 URLConf 파일까지 포함한 코딩 순서를 정리하면 다음과 같습니다.

  • 프로젝트 뼈대 만들기 : 프로젝트 및 애플리케이션 프로그래밍에 필요한 디렉터리와 파일 생성
  • 모델 코딩하기 : 테이블 관련 사항을 프로그래밍(models.py, admin.py 파일)
  • URLconf 코딩하기 : URL 및 뷰 매핑 관계를 정의(urls.py 파일)
  • 템플릿 코딩하기 : 화면 UI 프로그래밍(templates/ 디렉터리 하위의 *.html 파일들)
  • 뷰 코딩하기 : 애플리케이션 로직 프로그래밍(views.py 파일)

 

간단한 예제 시나리오

models.py

# app/models.py
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

 

ORM 

- Python 클래스 ↔ DB 테이블 자동 매핑

- 위의 코드는 아래와 같은 SQL 테이블로 변환됩니다.

CREATE TABLE Post (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(100),
    content TEXT,
    created_at DATETIME
);

 

views.py

# app/views.py
from django.shortcuts import render
from .models import Post

def post_list(request):
    posts = Post.objects.all()   # ORM을 사용해 DB 데이터 조회
    return render(request, 'post_list.html', {'posts': posts})

 

templates/post_list.html

<!-- templates/post_list.html -->
<!DOCTYPE html>
<html>
<head>
    <title>게시글 목록</title>
</head>
<body>
    <h1>게시글 목록</h1>
    <ul>
        {% for post in posts %}
            <li>{{ post.title }} - {{ post.created_at|date:"Y-m-d H:i" }}</li>
        {% empty %}
            <li>게시글이 없습니다.</li>
        {% endfor %}
    </ul>
</body>
</html>

 

urls.py (view와 template의 연결고리)

views.py의 함수명이 urls.py에서 연결되는 구조 (Django가 urls.py에서 해당 URL 패턴을 찾음)

# app/urls.py
from django.urls import path
from .views import post_list

urlpatterns = [
    path('', post_list, name='post_list'),
]

path() 함수는 URL 패턴과 views.py의 함수를 연결하는 역할 

예) path('about/', about_page)

-> /about/으로 접속 시 views.py 안의 about_page() 함수가 실행됨

 

실행 흐름 요약

 

사용자 요청 (GET /)
     ↓
urls.py  →  views.py(post_list)
     ↓
views.py  →  models.py(Post.objects.all())  ← ORM이 SQL 실행
     ↓
views.py  →  templates/post_list.html로 데이터 전달
     ↓
HTML 렌더링 후 브라우저 응답

 

Django의 MVT 패턴은
Model이 DB를 다루고, View가 데이터를 처리해 Template으로 넘기며,
ORM을 통해 SQL 없이 Python 코드만으로 DB 작업을 수행하는 구조입니다.

 

참고 도서

'Development & Projects > Python' 카테고리의 다른 글

웹 크롤링을 통한 데이터 수집 (Selenium) / NoSuchElementException  (0) 2025.03.05
[Python] execute() 함수 / exec()와의 차이 / cursor  (0) 2025.01.20
[Python] 웹소켓 서버 / 클라이언트 구현 (WebSocket 라이브러리)  (1) 2024.11.27
[python] 아나콘다 파이썬 버전 확인 / 다운그레이드 / 버전 변경 방법 / Solving environment 무한로딩  (0) 2024.05.28
'Development & Projects/Python' 카테고리의 다른 글
  • 웹 크롤링을 통한 데이터 수집 (Selenium) / NoSuchElementException
  • [Python] execute() 함수 / exec()와의 차이 / cursor
  • [Python] 웹소켓 서버 / 클라이언트 구현 (WebSocket 라이브러리)
  • [python] 아나콘다 파이썬 버전 확인 / 다운그레이드 / 버전 변경 방법 / Solving environment 무한로딩
seulll
seulll
개인 공부 블로그입니다.
  • seulll
    seulll
    seulll
  • 전체
    오늘
    어제
  • Seuli's Github
    • 분류 전체보기 (398)
      • Coding Test (260)
        • Programmers (164)
        • Baekjoon (94)
      • Data Structures & Algorithm.. (15)
      • Development & Projects (59)
        • Python (5)
        • Java (15)
        • Android (5)
        • AI (6)
        • Unity (3)
        • API (5)
      • OS (5)
      • DB | SQL (7)
      • Network (8)
      • Data Analysis (14)
      • Study | etc (21)
  • 블로그 메뉴

    • 홈
    • 태그
    • 글쓰기
    • 설정
  • 공지사항

  • 인기 글

  • 태그

    대입 표현식
    asterisk
    train_test_split
    Greedy
    Python
    kakao map api
    Boxplot
    백엔드 개발자
    프렌즈4블록
    야근 지수
    데이터분석
    오블완
    바다코끼리
    카카오맵 api
    프로그래머스
    모델 성능 평가
    티스토리챌린지
    백엔드
    박스플롯
    2 x n 타일링
    solving environment
    코딩테스트
    API
    파이썬
    카카오맵
    그리디 알고리즘
    백엔드 개발자 역량
    오차행렬
    웹크롤링
    confusion matrix
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
seulll
[Django] 장고의 MVT 패턴 (Model-View-Template)
상단으로

티스토리툴바