웹 사이트를 설계할 때 가장 먼저 해야할 일은 프로그램이 해야 할 일을 적당한 크기로 나누어서 모듈화하는 것이다.
장고에서는 웹 사이트에 대한 전체 프로그램을 프로젝트라고 하고 모듈화된 단위 프로그램을 애플리케이션이라고 한다.
Model : DB에 저장되는 데이터를 의미 (블로그의 내용을 DB로부터 가져오거나 저장, 수정하는 기능)
Template : 사용자에게 보여지는 UI부분
View : 실질적으로 프로그램 로직이 동작하여 데이터를 가져오고 적절하게 처리한 결과를 템플릿에 전달하는 역할 (버튼을 눌렀을 때 어떤 함수를 호출하며 데이터를 어떻게 가공할 것인지 결정)
출처: https://butter-shower.tistory.com/49
웹 클라이언트의 요청을 받고 장고에서 MVT 패턴에 따라 처리하는 과정
Model이란 사용될 데이터에 대한 정의를 담고 있는 장고의 클래스이다.
장고는 ORM 기법을 사용하여 애플리케이션에서 사용할 DB를 클래스로 매핑할 수 있다. 즉, 하나의 모델 클래스는 하나의 테이블에 매핑되고, 모델 클래스의 속성은 테이블의 컬럼에 매핑된다.
ORM 기법을 사용해 테이블을 클래스로 매핑하면 DB에 대한 엑세스를 SQL 없이도 클래스를 다루는 것처럼 할 수 있고, DB 엔진을 변경하더라도 ORM을 통한 API는 변경할 필요가 없어서 편하다.
ORM이란?
ORM(Object-Relational Mapping)은 객체와 관게형 DB를 연결해주는 역할을 한다. ORM이 자동으로 적절한 SQL 구문이나 DB API를 호출해서 처리해주기 때문에 DB 대신에 객체(클래스)를 사용해 데이터를 처리할 수 있다.
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 클래스에서 정의하지 않아도 장고에서 자동으로 부여한다.
클라이언트의 요청을 받으면 가장 먼저 URL을 분석한다. 즉, 요청에 들어있는 URL이 urls.py 파일에 정의된 URL 패턴과 매칭되는 지를 분석한다.
URL을 정의하기 위해서는 urls.py 파일에 URL과 처리 함수(뷰)를 매핑하는 파이썬 코드를 작성해야 한다. 이러한 URL/뷰 매핑을 URLconf라고 한다.
from django import views
from django.urls import path
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/2004/', views.special_case_2004),
]
URLconf를 사용하면 URL과 뷰 함수를 서로 자유롭게 연결할 수 있어서 URL과 뷰 함수 이름이 자주 바뀌는 경우에도 URLconf에서 매핑한 부분만 수정하면 되므로 매우 편리하다.
setting.py 파일의 ROOT-URLCONF 항목을 읽어 최상위 URLconf(urls.py) 위치를 알아낸다.
URLconf를 로딩하여 urlpatterns 변수에 지정되어 있는 URL 리스트를 검사한다.
위에서부터 순서대로 URL 리스트를 검사하면서 URL 패턴이 매치되면 검사를 종료한다.
매치된 URL의 뷰(함수 or 클래스의 메소드)를 호출한다. 호출 시 HttpRequest 객체와 매칭할 때 추출된 단어들을 뷰에 인자로 넘겨준다.
URL 리스트 끝까지 검사해도 매칭이 안되면 에러를 처리하는 뷰를 호출한다.
<int:year>처럼 꺾쇠를 사용하는 부분으로 URL 패턴의 일부 문자열을 추출하기 위한 것이다. 요청 URL이 /articles/2018/인 경우 매치된 문자열 2018을 year에 할당한다. 즉 뷰 함수를 views.year_archive(request, year=2018)처럼 호출하는 것이다.
URL 패턴에 정규표현식을 사용하면 복잡한 URL도 표현할 수 있다.
from django import views
from django.urls import re_path
urlpatterns = [
re_path(r'^articles/(?P<year>[0-9]{4})$', views.year_archive)
]
path() 함수에서의 <int:year>부분이 re_path() 함수에서는 (?P< year>[0-9]{4}) 처럼 정규표현식을 사용하면서 모든 정수가 아닌 0-9로 이루어진 4자리 숫자만 매치되도록 한정하고 있다.
웹 요청에 있는 URL을 분석하고 그 결과로 해당 URL에 매핑된 뷰를 호출한다.
뷰는 웹 요청을 받아서 DB 접속 등 해당 애플리케이션의 로직에 맞는 처리를 하고, 그 결과 데이터를 HTML로 변환하기 위해 템플릿 처리 후 최종 HTML로 된 응답 데이터를 웹 클라이언트로 반환하는 역할을 한다.
import datetime
from django.http import HttpResponse
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
뷰 함수는 첫 번째 인자로 HttpRequest 객체(위에서는 request)를 받고 필요한 처리를 한 후 최종적으로 HttpResponse 객체를 반환한다.
클라이언트에게 반환하는 최종 응답은 HTML 텍스트이다. 클라이언트는 응답으로 받은 HTML 텍스트를 해석해 웹 브라우저 화면에 UI를 보여준다.
장고에서 템플릿 파일을 찾을 때는 프로젝트 설정 파일인 settings.py 파일에 정의되어 있는 TEMPLATES 및 INSTALLED_APPS에서 지정된 앱의 디렉토리를 검색한다.
TEMPLATES 항목에 정의된 디렉토리를 먼저 찾고 그 다음에 INSTALLED_APPS 항목에 등록된 각 앱의 templates 디렉토리를 찾는다는 점 유의
모델, 뷰, 템플릿 중 정해진 순서는 없지만 독립적으로 개발할 수 있는 모델을 먼저 코딩하고 뷰와 템플릿은 서로 영향을 미치므로 모델 이후에 같이 코딩하는 것이 일반적이다.
출처: Django로 배우는 파이썬 웹 프로그래밍(기초) - 김석훈님