카테고리 없음

파이썬 웹 프로그래밍, 기초편_Chapter03_Django 웹 프레임워크

강용민 2022. 12. 29. 01:07

장고는 기본적으로 MVC 패턴에 해당하는 MVT 패턴에 따라 개발하도록 설계되어 있다. 

 

1. 장고의 특징

장고 웹 프레임워크의 주요 기능별 특징을 살펴보자.

  • MVC 패턴 기반 MVT
    • 장고는 MVC 패턴을 기반으로 한 프레임워크이다. 하지만 장고에서는 View를 Template, Controller를 View라고 부른다.
  • 객체 관계 매핑(ORM)
    • ORM 기능을 통해 다양한 데이터베이스 시스템을 지원하며 SQL 문장을 사용하지 않고도 테이블을 조작할 수 있다.
  • 자동으로 구성되는 관리자 화면
    • 장고는 웹 서버의 콘텐츠, 즉 데이터베이스 관리 기능을 위한 관리자 화면을 프로젝트를 시작하는 시점에 기본 기능으로 제공한다.
  • 우아한 URL 설계
    • 웹 프로그래밍에서 URL 설계는 필수인데 장고에서는 유연하면서도 강력한 URL 설계 기능을 제공한다.
  • 자체 템플릿 시스템
    • 장고는 내부적으로 확장 가능하고 디자인하기 쉬운 강력한 템플릿 시스템을 가지고 있다.
  • 캐시 시스템
    • 장고의 캐시 시스템은 캐시용 페이지를 메모리, 데이터베이스 내부, 파일 시스템 중 아무곳에나 저장할 수 있다.
    • 또한 캐시 단위를 페이지에서부터 사이트 전체 또는 특정 뷰의 결과, 템플릿의 일부 영역만을 지정하여 저장할 수도 있다.
  • 소스 변경 사항 자동 반영
    • 개발 과정에서 장고는 *.py 파일의 변경 여부를 감시하고 있다가 파일이 변경되면 실행 파일에 변경 내역을 바로 반영한다.

 

3. 장고에서의 애플리케이션 프로그래밍 방식

장고에서 애플리케이션의 개념을 웹 서버 프로그래밍 측면에서 조금 더 구체화하여 웹 사이트에 대한 전체 프로그램을 프로젝트라 하고, 모듈화된 단위 프로그램을 애플리케이션이라 부른다. 즉, 애플리케이션 프로그램들이 모여서 프로젝트를 이루는 개념이다.

 

MVT 패턴

장고는 기본적으로 MVT 패턴에 따라 애플리케이션을 개발하도록 유도하는데 먼저 MVT 패턴을 살펴보자.

장고 프레임워크에서는 View를 Template, Controller는 View라고 표현하며 MVC 대신 MVT패턴이라고 한다.

장고의 MVT 패턴

웹 클라이언트의 요청을 받아 장고에서 MVT 패턴에 맞게 처리하는 과정을 요약하면 다음과 같다.

  • 클라이언트로부터 요청을 받으면 URLconf를 이용하여 URL을 분석한다.
  • URL 분석 결과를 바탕으로 해당 URL 처리를 담당할 뷰를 결정한다.
  • 뷰는 자신의 로직을 실행하면서 만일 데이터베이스 처리가 필요하면 모델을 통해 처리하고 그 결과를 반환받는다.
  • 뷰는 자신의 로직 처리가 끝나면 템플릿을 사용하여 클라이언트에 전송할 HTML 파일을 생성한다.
  • 뷰는 최종 결과로 HTML 파일을 클라이언트에게 보내 응답한다.

 

Model - 데이터베이스 정의

장고에서는 ORM 기법을 바탕으로 애플리케이션에서 사용할 데이터베잇를 클래스로 매핑하여 코딩할 수 있다. 모델 클래스로부터 테이블을 자동으로 생성하기 위해 models.py 파일에 정의된 모델 클래스를 해석하고 여러 가지 규칙을 적용한다.

 

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)

 

URLconf - URL 정의

클라이언트로부터 요청을 받으면 장고는 가장 먼저 요청에 들어 있는 URL을 분석한다. 즉, 요청에 ㄷㄹ어 있는 URL이 urls.py 파일에 정의된 URL 패턴과 매칭되는지를 분석한다.

URL을 정의하기 위해서는 다음 예시처럼 urls.py 파일에 URL과 처리 함수(뷰)를 매핑하는 코드를 작성하면 된다. 이런한 URL/뷰 매핑을 URLconf라 한다.

 

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/' vies.month_archive),
    path('articles/<int:year>/<int:month>/<slug:slug>/' ,vies.article_detail),
]

이는 URL과 뷰 함수를 자유롭게 연결할 수 있어서 URL과 뷰 함수 이름이 자주 바뀌는 경우에 URLconf에서 매핑한 부분만 수정하면 되므로 변경이 쉬워진다.

 

웹 클라이언트가 웹 서버에 페이지를 요청할 때 장고에서 URL을 분석하는 순서를 간단히 요약하면 다음과 같다.

  • setting.py 파일의 ROOT_URLCONF 항목을 읽어 최상위 URLconf(urls.py)의 위치를 알아낸다.
  • URLconf를 로딩하여 urlpatterns 변수에 지정되어 있는 URL 리스트를 검사한다.
  • 위에서부터 순서대로 URL 리스트의 내용을 검사하다가 URL 패턴이 매치되면 검사를 종료한다.
  • 매치된 URL의 뷰를 호출한다. 뷰는 함수 또는 클래스의 메소드를 의미한다. 호출 시 HttpRequest 객체와 매칭할 때 추출된 단어들을 뷰에 인자로 넘겨준다.
  • URL 리스트 끝까지 검사했는데도 매칭에 실패하면 에러 처리 뷰를 호출한다.

 

꺽쇠 부분을 장고에서는 Path Converter라 부르는데 사용되는 기본 타입은 다음과 같다.

  • str : '/'를 제외한 모든 문자열과 매치된다. 디폴트로 str 타입을 사용한다.
  • int
  • slug
  • uuid
  • path : '/'를 포함한 모든 문자열과 매치된다. 이는 URL 패턴의 일부가 아니라 전체를 추출하고자 할 때 많이 사용한다.

이 외에도 re_path() 함수를 사용하면 좀 더 세밀하게 표현하거나 복잡한 URL도 표현할 수 있다.

 

View - 로직 정의

장고는 웹 요청에 있는 URL을 분석하고 그 결과로 해당 URL에 매핑된 뷰를 호출한다. 

장고에서 뷰는 함수 또는 클래스의 메소드로 작성되며 웹 요청을 받고 응답을 반환한다. 이러한 뷰는 보통 views.py 파일에 작성한다.

 

view.py

from django.http import HttpResonse
import datetime

def current_datetile(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

만일 에러를 반환하고 싶다면 다음처럼 HttpResponseNotFound와 같은 에러 응답 객체를 반환하면 된다. 에러 응답 클래스는 모두 HttpResponse 클래스의 하위 클래스로 정의되어 있다.

return HttpResponseNotFound('<h1>Page not found</h1>')

앞의 예시에서는 HTML 코드를 뷰 함수 내에 직접 사용했지만, 보통은 별도의 템플릿 파일에 HTML 코드를 작성한다. 즉, 뷰는 별도로 작성된 템플릿 파일을 해석해서 HTML 코드를 생성하고 이를 HttpResponse 객체에 담아서 클라이언트에게 응답한다.

 

Template - 화면 UI 정의

장고는 *.html 파일을 해석해서 최종 HTML 텍스 응답을 생성하고 이를 클라이언트에게 보낸다. 클라이언트는 응답으로 받은 HTML 텍스트를 해석해서 우리 보는 웹 브라우저 화면에 UI를 표시한다.

유의할 점은 템플릿 파일을 적절한 디렉터리에 위치시켜야 한다는 것이다. 즉, 장고에서 템플릿 파일을 찾는 방식을 이해하고 있어야 하며 그에 맞는 위치에 템플릿 파일을 위치시켜야 장고가 그 템플릿 파일을 찾을 수 있다.

장고에서 템플릿 파일을 찾을 때는 TEMPLATES 및 INSTAILED_APPS에 지정된 애플리케이션의 디렉터리를 검색한다. 이 항목들은 프로젝트 설정 파일인 settings.py에 정의되어 있다.

 

애플리케이션 설계하기

본격적인 코딩에 들어가기 전에 애플리케이션의 로직부터 설계해야 한다. 우리가 개발하게 될 애플리케이션의 내용은 질문을 보여 준 후 질문에 포함된 답변 항목에 투표하면 그 결과를 알려 주는 예제이다.

 

프로젝트 뼈대 만들기

프로젝트가 만들어지면 그 하위에 애플리케이션 디렉터리 및 파일을 구성한다. 장고는 이런 작업을 위한 장고 셸 커멘드를 제공한다.

프로젝트의 각 디렉터리 및 파일의 용도는 다음과 같다.

항목명 설명
ch99 디렉터리 프로젝트 관련 디렉터리 및 파일을 모다 주는 최상위 루트 디렉터리다. 보통 sttings.py 파일에서 BASE_DIR 항목으로 지정된다.
db.sqlite3  
manage.py 장고의 명령어를 처리하는 파일
mysite 디렉터리 프로젝트명으로 만들어진 디렉터리이다.
__init__.py 디렉터리에 이 파일이 있으면 파이썬 패키지로 인식한다.
settings.py 프로젝트 설정 파일이다.
Urls.py 프로젝트 레벨의 URL 패턴을 정의하는 최상위 URLconf이다. 
polls 디렉터리 애플리케이션명으로 만들어진 애플리케이션 디렉터리이다.
__init__.py  
admin.py Admin 사이트에 모델 클래스를 등록하는 파일
apps.py 애플리케이션의 설정 클래스를 정의하는 파일
migrations 디렉터리 데이터베이스 변경 사항을 관리하기 위한 디렉터리
models.py 데이터베이스 모델 클래스를 정의하는 파일
tests.py 단위 테스트용 파일
views.py 뷰 함수를 정의하는 파일
templates 디렉터리 템플릿 파일이 들어 있다.
static 디렉터리 CSS, Image, Javascript 파일이 들어 있다.
logs 디렉터리 로그 파일이 들어있다. 로그 파일의 위치는 sttings.py  파일에서 LOGGING 항목으로 지정한다.