장고는 기본적으로 MVT 패턴에 따라 애플리케이션을 개발하도록 유도합니다.
MVT 패턴
데이터(Model), 사용자 인터페이스(View), 데이터를 처리하는 로직(Controller)을 구분해서 한 요소가 다른 요소들에 영향을 주지 않도록 설계하는 방식을 의미합니다.
이런 방식으로 개발을 진행하면 UI 디자이너는 데이터 관리나 애플리케이션 로직에 신경 쓰지 않고도 화면 UI를 설계할 수 있고 로직이나 데이터를 설계하는 개발자도 화면 디자인은 디자이너에게 맡기고 자신의 설계 및 개발 업무에만 집중할 수 있습니다.
장고 프레임워크에서는 View를 Template, Controller를 View라고 표현하여 MVT 패턴이라고 합니다.
각각의 역할은 다음과 같습니다.
- Model - 데이터베이스에 저장되는 데이터
- Template - 사용자에게 보이는 UI 부분
- View - 실질적으로 프로그램 로직이 동작하여 데이터를 가져오고 적절하게 처리한 결과를 템플릿에 전달
웹 클라이언트의 요청을 받아 장고에서 MVT 패턴에 맞게 처리하는 과정을 요약하면 다음과 같습니다.
- 클라이언트로부터 요청을 받으면 URLconf를 이용하여 URL을 분석합니다.
- URL 분석 결과를 바탕으로 해당 URL 처리를 담당할 뷰를 결정합니다.
- 뷰는 자신의 로직을 실행하면서 만일 데이터베이스 처리가 필요하면 모델을 통해 처리하고 그 결과를 반환받습니다.
- 뷰는 자신의 로직 처리가 끝나면 템플릿을 사용하여 클라이언트에 전송할 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 파일)