장고의 어플리케이션 개발 방식
MVT 패턴
일반적인 MVC 패턴과 용어가 조금 다르다. 기존 MVC에서는 M이 MODEL, V가 VIEW, C가 CONTROLLER를 의미하는 반면, 장고의 MVT에서
- M은 MODEL
- V는 VIEW(하지만 실질적으로 CONTROLLER 역할)
- T는 TEMPLATE(실질적으로 VIEW)
을 나타낸다.
각 요소들은 다음과 같이 연결된다.
- 웹 클라이언트로부터 Request
- 요청을 받으면 URLconf를 이용하여 URL을 분석
- 분석 결과를 통해 담당 뷰를 결정(로직)
- 뷰는 로직을 실행하며 DB처리가 필요하면 모델을 통해 처리하고 결과를 반환받음
- 뷰는 로직 처리가 끝나면 템플릿을 사용하여 클라이언트에 보낼 HTML 파일을 생성함
- 뷰는 최종 결과로 HTML 파일을 클라이언트에 보내 Response함
위에서 진하게 표시된 단어를 하나씩 짚고 가자.
URLconf - urls.py
장고에서 프로젝트를 생성하면 urls.py
가 생성되는데, 이 파일 내부에 보면 urlpatterns
라는 리스트가 있고, url과 뷰(처리 함수)를 매핑하여 어떤 url 요청에 대해 어떤 뷰가 처리할지를 정의하고 있다.
from django.urls from import path
from home import views # project 내 home이라는 app으로부터 views 임포트
urlpatterns = [path('/exmaple/', views.example),
path('/example/<int:level>/<slug:slug>')]
# /example로 요청이 오면 home이라는 app의 views.py에서 example 함수가 처리
url 패턴 뒤에 <>
꺾쇠는 url 패턴의 일부 문자열을 추출하기 위한 것으로, <type:name>
형식으로 사용된다. 타입이 일치하지 않으면 매치되지 않는다. 이는 Path Converter
라고 불리며, str
, int
, slug
, uuid
, path
의 타입을 가진다. 추가로 타입을 등록하는 것도 가능하다.
정규표현식을 사용하여 더욱 정교한 url을 정의할 수도 있는데, 이 때는 re_path를 사용한다.
urlpatterns=[re_path(r'^example/(?P<year>[0-9]{4})/$', views.example)]
# /example/2019/ 와 같이, year 꺾쇠에는 0에서 9까지의 숫자 4자리만 올 수 있도록 함. ^는 url 시작, $은 url 끝을 나타낸다. P는 최소 0번에서 최대 1번까지 반복한다는 의미이다.
View - views.py
뷰는 웹 요청을 받아 필요하면 db에 접속하는 등 로직 처리를 하고 그 결과를 HTML로 만들어서 클라이언트에 반환한다.
Model - models.py
ORM(Object-Relational-Mapping)이란 객체와 관계형 DB(SQL)을 연결해주는 역할을 한다. ORM을 사용하면 직접 SQL 문법을 사용하지 않고도 객체(클래스)를 사용하여 데이터를 처리할 수 있다.
장고의 모델 역시 ORM을 사용하여 테이블을 클래스로 매핑한다.
from django.db from import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL
)
장고에서 myapp이라는 앱에서 models.py 내에 저렇게 Person 클래스를 만들면 내부적으로 SQL 명령이 사용되며 myapp_person
이라는 테이블이 생성된다. 테이블명 생성규칙은 앱이름_클래스
이며 모두 소문자로 표시된다. 변경도 가능하다. Primary Key는 정의하지 않아도 장고에서 자동으로 부여하며 직접 변경할 수 있다.
Template
장고는 템플릿(.html 파일)을 사용하여 최종 HTML 텍스트 응답을 생성하고 이를 클라이언트에 보여준다.
장고의 템플릿 엔진이 좋은 이유는
- 프로그램 로직과 UI를 분리한다. 로직은 views.py가 담당하고 UI는 template이 담당하므로 디자인을 변경할 일이 있으면 template만 건드리면 된다.
- html 파일 내에 템플릿 문법을 통해 직접 파이썬 코드를 작성할 수 있다.
장고에서 템플릿 파일을 찾을 때에는 settings.py
에서 TEMPLATES
, INSTALLED_APP
에서 지정된 앱의 디렉토리를 검색한다. 일단 앱을 생성하면 settings.py
에 INSTALLED_APP
에 추가하는데, 장고는 템플릿을 찾을 때 INSTALLED_APP
에 등록된 앱의 templates 디렉토리를 탐색하므로 가장 쉬운 방법으로는 해당 앱(myapp)의 하위 폴더로 templates라는 폴더(myapp/templates)를 만든 다음 거기에서 html 파일을 생성하는 것이다.
장고의 MVT 코딩 순서
화면 설계는 뷰(V)와 템플릿 코딩(T)으로 연결되고, 테이블 설계는 모델 코딩(M)에 반영된다.
독립적으로 개발할 수 있는 모델을 먼저 코딩하고, 서로 영향을 미치는 뷰와 템플릿은 모델을 개발한 후 함께 코딩하는 것이 일반적이다. 그러므로
- 프로젝트 생성 및 앱 생성, 필요한 디렉토리 생성
- 모델 코딩 - models.py, admin.py
- URLconf 코딩 (URL/뷰 매핑) - urls.py
- 템플릿 코딩 - templates/ 하위의 .html 파일
- 뷰 코딩 - views.py
이런 순서로 코딩을 하면 편리하다.