SEOYUL
산호심는 블로그
SEOYUL
  • 분류 전체보기 (100)
    • IT (70)
      • Go (3)
      • Linux (34)
      • Python +Django (31)
      • RaspberryPi (2)
    • Memo (27)
      • 멀티캠퍼스 (26)

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우ⓒMIT.
SEOYUL

산호심는 블로그

Django MVT 패턴이란?
IT/Python +Django

Django MVT 패턴이란?

2020. 9. 21. 23:57

MVT 패턴

예를 들어, 모델은 블로그 내용을 데이터베이스로부터 가지고 오거나 저장, 수정하는 기능을 한다.

뷰는 버튼을 눌렀을 때 어떤 함수를 호출하며 ㅇ데이터를 어떻게 가공할 것인지 결정하는 역할

템플릿은 화면 출력을 위해 디자인과 테마를 적용해서 보여지는 페이지를 만들어주는 역할

이미지

웹 클라이언트의 요청을 받아 장고에서 MVT 패턴에 따라 처리하는 과정

  1. 클라이언트로부터 요청을 받으면 URLconf를 이용하여 URL을 분석한다.
  2. URL 분석 결과를 통해 해당 URL에 대한 처리를 담당할 View를 결정한다.
  3. View는 자신의 로직을 실행하면서, 만일 데이터베이스 처리가 필요하면 Model을 통해 처리하고 그 결과를 리턴 받는다.
  4. 뷰는 자신의 로직 처리가 끝나면 Template을 사용하여 클라이언트에 전송할 HTML 파일을 생성한다.
  5. 뷰는 최종 결과물로 HTML 파일을 클라이언트에게 보내 응답한다.

Model - 데이터베이스 정의

사용될 데이터에 대한 정의를 담고 있는 장고의 클래스로 장고는 ORM 기법을 사용하여 애플리케이션에서 사용할 데이터베이스를 클래스로 매핑하여 코딩할 수 있다.

하나의 모델 클래스는 하나의 테이블에 매핑되고, 모델 클래스의 속성은 테이블의 칼럼에 매핑된다.

from django.db import models

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

장고는 테이블 및 컬럼을 자동으로 생성하기 위해 필요한 많은 규칙을 가지고 있다. 위의 예는 다음의 규칙이 적용되었다.

  • 테이블명은 애플리케이션명과 모델 클래스명을 밑줄(_)로 연결하고, 모두 소문자로 표시한다.
  • Primary Key는 Person 클래스에서 정의하지 않아도 장고에서 자동으로 부여된다.

장고 모델 클래스의 규칙

https://docs.djangoproject.com/en/2.1/topics/db/models/

장고 모델 클래스 - 몽고디비

https://django-mongodb-engine.readthedocs.io/en/latest/tutorial.html

ORM(Object-Relational-Mapping)
쉽게 말해 객체와 관계형 데이터베이스를 연결해주는 역할을 한다. 데이터베이스 대신 객체(클래스)를 사용해 데이터를 처리할 수 있다.객체를 대상으로 필요한 작업을 실행하면, ORM이 자동으로 적절한 SQL 구문이나 데이터베이스 API를 호출해서 처리해주기 때문이다.

URLconf - URL 정의

클라이언트로부터 요청을 받으면 장고는 가장 먼저 요청에 들어있는 URL을 분석한다. 즉, 요청에 들어있는 URL이 urls.py 파일에 정의된 URL 패턴과 매칭되는지 확인한다.

웹 클라이언트가 웹 서버에 페이지 요청 시, 장고에서 URL을 분석하는 순서

  • setting.py 파일의 ROOT_URLCONF 항목을 읽어 최상위 URLconf 의 위치를 알아낸다.
  • URLconf를 로딩하여 urlpatterns 변수에 지정되어 있는 URL 리스트를 검사
  • 위에서부터 순서대로 URL 리스트의 내용을 검사하면서 URL 패턴이 매치되면 검사 종료
  • 매치된 URL의 뷰를 호출한다. (뷰는 함수 또는 클래스의 메소드) 호출 시 HttpRequest 객체와 매칭할 때 추출된 단어들을 뷰에 인자로 넘겨준다.
  • URL 리스트를 끝까지 검사했는데 매칭에 실패하면 에러를 처리하는 뷰를 호출한다.

URL 패턴을 정의할 때 꺾쇠를 이용하는 것은 URL 패턴의 일부 문자열을 추출하기 위한 것이며, <type:name>형식으로 사용한다. 또한, 매치된 경우에는 매치된 내용을 인자명에 할당한다.

path('articles/<int:year>/', views.special_case_2020)

위의 경우에 요청 URL이 articles/2020 인 경우 뷰 함수를 views.special_case_2020(request, year=2020) 처럼 호출한다. views 에서 year 파라메터 처럼 이용할 수 있단 뜻

꺾쇠 부분을 장고에서는 Path Converter라고 부르며, 다양한 타입을 사용할 수 있다

  • str 슬래시를 제외한 모든 문자열. 타입 미지정시 디폴트
  • int 0 또는 양의 정수 매칭시 python int형 변환
  • slug slug형식의 문자열 (ASCII, 숫자, 하이픈, 밑줄로만 구성됨) 과 매치
  • uuid UUID 형식의 문자열과 매치, 매칭시 python UUID 형 변환
  • path 슬래시를 포함한 모든 문자열과 매치.

View - 로직 정의

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

뷰는 웹 요청을 받아서 데이터베이스 접속 등 해당 애플리케이션의 로직을 처리하고, 그 결과 데이터를 HTML로 변환하기 위하여 템플릿 처리를 한 후에, 최종 HTML로 된 응답 데이터를 웹 클라이언트로 리턴한다.

뷰 함수는 첫 번째 인자로 HttpRequest 객체 (보통 파라미터를 request 또는 req로 명명)를 받는다. 그리고 로직 처리 후 최종적으로 HttpResponse 객체를 반환한다.

에러를 반환하고 싶다면 HttpResponseNotFound와 같은 에러 응답 객체를 반환하면 된다. 에러 응답 클래스는 모두 HttpResponse 클래스의 하위 클래스로 정의되어 있다.

Template - 화면 UI 정의

장고가 클라이언트에게 반환하는 최종 응답은 HTML 텍스트이다. 개발자가 작성하는 *.html 파일을 템플릿이라 하며, 여기에 화면 UI를 템플릿 문법에 맞게 작성한다.

장고에서 제공하는 템플릿은 템플릿 태그/필터 기능을 사용하여 파이썬 코드를 직접 사용할 수 있어확장이 쉽다.

장고에서 템플릿 파일을 찾을 때는 TEMPLATES 및 INSTALLED_APPS에서 지정된 앱의 디렉토리를 검색한다. 이 항목들은 프로젝트 설정 파일인 settings.py 파일에 정의되어 있다.

여러 개의 디렉토리를 지정한 경우, 지정된 순서대로 디렉토리를 검색하여 템플릿 파일을 찾는다.

settings.py의 TEMPLATE 항목에 정의된 디렉토리를 먼저 찾고, INSTALLED_APPS 항목에 등록 된 각 앱의 templates 디렉토리를 찾는다.

MVT 코딩 순서

장고에서 코딩 정해진 코딩 순서는 없다. 다만, 함수형 뷰를 사용할때는 모델, 템플릿, 뷰 순서로 클래스형 뷰를 사용할때는 모델, 뷰, 템플릿 순서로 진행하면 편하다.

함수형 뷰를 사용하는 코딩 순서

  • 프로젝트 뼈대 만들기 : 프로젝트 및 앱 개발에 필요한 디렉토리와 파일 생성
  • 모델 코딩 : 테이블 관련 사항을 개발(models.py, admin.py 파일)
  • URLconf 코딩하기 : URL 및 뷰 매핑 관계를 정의(urls.py 파일)
  • 템플릿 코딩하기 : 화면 UI 개발 (templates/디렉토리 하위의 *.html 파일들)
  • 뷰 코딩 : 애플리케이션 로직 개발(views.py 파일)
    SEOYUL
    SEOYUL
    산호는 해양 생물의 4분의 1에게 집을 제공하는 만큼 생태계에서 중요한 근간이라고 합니다. 하지만 최근 환경 파괴로 산호지대가 사라지고 있어 여러 국가에서 산호를 심는 활동을 한다고 합니다. 이와같이 꾸준한 내용으로 미래를 위한 블로그를 만들어가고자 합니다.

    티스토리툴바