MVT 패턴
예를 들어, 모델은 블로그 내용을 데이터베이스로부터 가지고 오거나 저장, 수정하는 기능을 한다.
뷰는 버튼을 눌렀을 때 어떤 함수를 호출하며 ㅇ데이터를 어떻게 가공할 것인지 결정하는 역할
템플릿은 화면 출력을 위해 디자인과 테마를 적용해서 보여지는 페이지를 만들어주는 역할
이미지
웹 클라이언트의 요청을 받아 장고에서 MVT 패턴에 따라 처리하는 과정
- 클라이언트로부터 요청을 받으면
URLconf
를 이용하여 URL을 분석한다. - URL 분석 결과를 통해 해당 URL에 대한 처리를 담당할
View
를 결정한다. - View는 자신의 로직을 실행하면서, 만일 데이터베이스 처리가 필요하면
Model
을 통해 처리하고 그 결과를 리턴 받는다. - 뷰는 자신의 로직 처리가 끝나면
Template
을 사용하여 클라이언트에 전송할 HTML 파일을 생성한다. - 뷰는 최종 결과물로 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 파일)