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

황인용·2020년 7월 24일
1

Django

목록 보기
5/13
post-thumbnail
post-custom-banner

MVT(Model-View-Template)

  • Python의 Django 프레임워크에서 사용하는 디자인 패턴
  • Django의 MVC 패턴
  • Model ⇒ Model
    • 데이터베이스에 저장되는 데이터를 CRUD 하는 부분
  • View ⇒ Template
    • 사용자에게 보여지는 UI 부분
  • Controller ⇒ View
    • 프로그램의 비즈니스 로직을 구현하여 데이터를 요청 및 가져오고
      가져온 데이터를 Template에 전달

MVT 처리과정

  1. 클라이언트로 부터 요청을 받으면 URLconf를 이용하여 URL 을 분석

  2. URL 분석 결과를 통해 해당 URL 에 대한 처리를 담당할 View 를 결정

  3. View 는 자신의 로직을 실행 하면서 만일 데이터 베이스 처리가 필요하면 해당 모델에 요청하고 그 결과를 반환받음

  4. View 는 자신의 로직 처리가 끝나면 Template 을 사용하여 클라이언트에 전송할 HTML 파일을 생성

  5. View 는 최종 결과로 HTML 파일을 클라이언트에 보내어 응답

MVT 구성요소

Model

  • 사용될 데이터에 대한 정의를 담고 있는 Django의 클래스
  • ORM(Object-Relational Mapping)이나 Raw Query로 데이터베이스와 관련된 코드를 작성
  • ORM은 데이터베이스를 클래스로 매핑함
  • [Models.py](http://models.py) 에서 모델 클래스를 정의

ORM(Object-Relational Mapping)

  • 객체와 관계형 데이터베이스를 연결해주는 역할
  • SQL(Structured Query Language)를 사용하지 않고, 데이터베이스 Schema(스키마)를 구성하고,
    접근할 수 있음
  • 객체를 사용해 데이터를 처리함
  • 데이터를 요청하면 QuerySet을 통해 객체형태로 데이터를 반환

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)

		class Meta:
        db_table = 'myapp_person'
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 클래스에서 정의하지 않아도 Django에서 자동으로 부여

  • 별도의 Primary Key를 지정할 수 있음

URLconf

  • 클라이언트로부터 요청을 받으면 Django는 가장 먼저 요청에 들어있는 URL을 분석
  • 요청에 들어있는 URL이 [urls.py](http://urls.py) 파일에 정의된 URL 패턴과 매칭되는지 분석
  • URLconf에서 URL분석 후 해당 매핑되는 View를 호출

urls.py

from django.urls import path
from . import views

urlpatterns = [
		path('articles/2003/', views.special_case_2003),
		path('articles/<int:year>/', views.year_archive),
		path('articles/<int:year>/<int:month>', views.month_archive),
		path('articles/<int:year>/<int:month>/<slug:slug>', views.archive_detail),
]
  • [setting.py](http://setting.py) 파일의 ROOT_URLCONF 항목을 읽어 최상위 URLconf(urls.py)의 위치를 확인
  • URLconf를 로딩하여 urlpatterns 변수에 지정되어 있는 URL 리스틀 검사
  • 위에서부터 순서대로 URL 리스트의 내용을 검사하면서 URL 패턴이 매치되면 검사를 조료
  • 매치된 URL의 view 를 호출. 여기서 view는 함수 또는 클래스의 메소드
  • 호출 시 HttpRequest 객체와 그리고 매칭할 때 추출된 단어들을 view 인자로 넘겨준다
  • URL 리스트 끝까지 검사했는데도 매칭에 실패하면, 에러를 처리하는 view 를 호출

Path Converter

  • urlpatterns 변수에서 / 부분을 가르킴
  • URL 패턴의 일부 문자열을 추출하기 위한 것
  • <type:name> 형식
    • str : / (슬래시)를 제외한 모든 문자열과 매치. 타입이 지정되지 않았다면 디폴트로 str 타입으로 사용
    • int : 0 또는 양의 정수와 매치. 매치된 정수는 파이썬의 int 타입으로 변환
    • slug : slug 형식의 문자열(ASCII, 숫자, 하이픈, 밑줄로만 구성됨)과 매치
    • uuid : UUID 형식의 문자열과 매치. 매치된 문자열은 파이썬의 UUID 타입으로 변환
    • path : / (슬래시)를 제외한 모든 문자열과 매치. URL 패턴의 일부가 아니라 전체를 추출하고자 할 때 많이 사용
  • view 에서 정규표현식으로 URL 패턴 로직을 구현할 수 있다

View

  • 웹 요청을 받고 응답을 반환
  • 응답메세지는 HTML, Json, xml, Redirection, 404 등등
  • [views.py](http://views.py) 에서 함수 또는 클래스의 메소드로 정의

views.py

from django.http import HttpResponse
import datetime

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

Template

  • 클라이언트에게 반환되는 HTML(Hyper Text Markup Language)을 작성
  • Django에서 Template 파일을 찾을 때는 settings.pyTEMPLATESINSTALLED_APPS 에서 지정된 앱의 디렉토리에에서 *.html 파일을 찾음
  • *.html Django의 template 시스템 문법에 맞게 작성

MVT 패턴 코딩 순서

1. 프로젝트 뼈대 만들기

  • 프로젝트 및 앱 개발에 필요한 디렉토리와 파일 생성

2. Model(모델) 코딩하기

  • 테이블 관련 사항을 개발(models.py, admin.py파일)

3. URLconf 코딩하기

  • URL 및 View 매핑 관계를 정의(urls.py 파일)

4. template(템플릿) 코딩하기

  • 화면 UI 개발(templates/ 디렉토리 하위의 *.html 파일)

5. View(뷰) 코딩하기

  • 어플리케이션 로직 개발(views.py 파일)
profile
dev_pang의 pang.log
post-custom-banner

0개의 댓글