django MTV패턴
- 장고의 개발 방식은 MTV(Model, Template, View) 패턴을 따르며, 기본적으로 MVC와 많이 유사하다.
- 이러한 패턴을 따라 개발하는 방식은 데이터, 사용자 인터페이스, 데이터를 처리하는 로직을 구분하여 한 요소가 다른 요소들에 영향을 최소화하여 설계하는 방식입니다.
- 이러한 방식으로 개발을 진행하면 UI 디자이너와 개발자는 독립적인 영역에서 개발이 가능하게 됩니다.
웹 클라이언트의 요청을 받아 장고에서 MTV모델에 따라 처리하는 과정
1. 웹 클라이언트로부터 request를 받아 URLconf를 이용하여 url 분석
2. 분석 결과 해당 url에 매칭되는 view들을 실행
3. 뷰는 자신의 로직을 실행, DB처리 필요시 Model을 사용하여 처리 그 결과를 반환
4. 뷰에서 로직처리가 끝나면 템플릿을 사용하여 클라이언트에 전송할 reponse를 구성하기 위한 HTML파일을 생성
5. 뷰는 최종적으로 HTML파일을 클라이언트에게 보내 응답합니다.
Model - 데이터 베이스 설계
- 모델이란 애플리케이션에서 사용될 데이터에 대한 정의를 담고 있는 장고 클래스입니다.
장고는 ORM기법을 이용하여 데이터베이스를 클래스로 매핑하여 코딩할 수 있습니다.
즉 하나의 모델 클래스는 하나의 테이블에 매핑되고 모델 클래스는 변수(속성)은 테이블의 컬럼에 매핑됩니다. - 또한 장고에서는 ORM을 제공하기때문에 고도의 SQL지식을 강요받지 않고 DB작업을 가능하게 한다.
- class로 구현되며 하나의 모델클래스는 DB에서 하나의 테이블로 표현된다.
ex) models.py
class Site(models.Model):
name = models.CharField(max_length=255,)
는 sql문으로는
CREATE TABLE site
(id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
PRIMARY KEY (id))
ENGINE=INNODB AUTO_INCREMENT=0
이런식으로 매칭 될 수 있다.
Template - 화면 UI 설계
- 장고는 자체 템플릿 시스템을 갖고 있기 때문에 디자이너도 쉽게 이해할 수 있는 문법을 제공하고 있습니다.
- 화면의 디자인을 변경할 일이 생기면 디자니어는 프로그램 로직에 상관없이 문법에 맞게만 템플릿을 수정하면 됩니다.
이런식으로 독립적인 영역에서 협업이 가능한게 장고의 장점입니다. - 템플릿에서 장고 템플릿 시스템 문법에 맞게 파이썬 코드를 직접 사용할 수 있기 때문에 더욱 강력하고 확장하기 쉬운 구조입니다.
- HTML로 구현되며 화면에 보여주기위한 프리젠테이션 로직만을 가집니다.
- 일반적인 MVC패턴에서 View와 비슷한 역할을 합니다.
View - 로직 설계
- 메소드로 구현되며, HTTP request를 받아 HTTPResponse를 반환하는 형태입니다.
- model과 template를 중계하며 비즈니스 로직의 핵심입니다.
- 일반적인 MVC패턴에서 Controller과 비슷한 역할을 합니다.
URLconf
- 장고에서 URL지정방식은 직관적이고 이해하기 쉽습니다. => 특히 2.X버젼 이상에서는 path함수를 통해 더 직관적이고 이해하기가 쉬워짐
- URL에 실행할 View(로직)을 지정 해주는 것을 URLconf라 한다.
ex) urls.py
from django.contrib import admin
from django.urls import path
from mylotto.views import index
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', index, name='index'),
]
이런식으로 DNS/index/의 url에 index라는 이름을 가진 view를 지정하여 처리 할 수 있다.
mvc의 컨트롤러와 mtv의 view의 차이점
그렇다면 《컨트롤러》는 어디에 맞을까요? 장고의 경우, 아마 프레임워크 자체 일것입니다. 프레임워크가 장고 URL설정에 따라 요청을 적절한 뷰에게 전달합니다.
=> 장고의 경우 프레임워크에서 URL설정에 따라 요청을 적절한 뷰에게 전달해준다.
솔직히 컨트롤러에 대해 잘몰라서 저런 차이 때문에 명칭에 차이를 두었다라고 알고 있다.
아래 링크에 공식문서에서 말하는 명칭을 달리하는 이유를 알 수 있다.
https://docs.djangoproject.com/ko/3.1/faq/general/#faq-mtv
참조
https://livetodaykono.tistory.com/40
https://wayhome25.github.io/django/2017/02/28/django-03-lotto-project-1/
'django' 카테고리의 다른 글
[Django] 클래스형 뷰 (CBV, Class-Based View) (0) | 2021.02.14 |
---|---|
[Django] 템플릿(template) 언어 (0) | 2021.02.06 |
[Django] 쿼리셋(QuerySet) (0) | 2021.02.05 |
[Djnago] HttpRequest와 HttpResponse API (1) | 2021.02.02 |
[Django] 프로젝트 및 앱 구조 (0) | 2021.01.31 |