Django의 애플리케이션 개발 방식

Django의 애플리케이션 개발 방식

A. 애플리케이션과 프로젝트

a. 애플리케이션
  • 모듈화된 단위 프로그램
b. 프로젝트
  • 웹 사이트에 대한 전체 프로그램
  • 애플리케이션 프로그램들이 모여서 프로젝트를 개발

B. MVT 패턴

  • MVC(Model-View-Controller) 패턴을 MVT(Model-View-Template)로 사용함.
  • View -> Template, Controller -> View로 표현
a. 모델 (Model)
  • 데이터베이스에 저장되는 데이터
b. 템플릿 (Template)
  • 사용자에게 보여지는 UI
c. 뷰 (View)
  • 프로그램 로직이 동작하여 데이터를 가져오고 적절하게 처리한 결과를 템플릿에 전달
d. MVT 패턴의 연결

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

C. Model - 데이터베이스 정의

  • 사용될 데이터에 대한 정의를 담고 있는 장고의 클래스
  • ORM 기법을 사용하여 애플리케이션에서 사용할 데이터베이스를 클래스로 매핑해서 코딩할 수 있다.
    • 하나의 모델 클래스는 하나의 테이블에 매핑되고, 모델 클래스의 속성은 테이블의 칼럼에 매핑된다.
a. ORM 기법을 사용하여 테이블을 클래스로 매핑하면
  • 애플리케이션에서는 데이터베이스에 대한 액세스를 SQL 없이도 클래스를 다루는 것처럼 할 수 있다.
  • 데이터베이스 엔진을 변경하더라도 ORM을 통한 API는 변경할 필요가 없어서, 필요에 따라 데이터베이스 엔진을 훨씬 쉽게 변경할 수 있다.
b. ORM (Object-Relational Mapping)
  • 객체와 관계형 데이터베이스를 연결해주는 역할
c. 테이블 및 컬럼을 자동으로 생성하기 위해 필요한 많은 규칙

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)


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 클래스에서 정의하지 않아도 장고에서 자동으로 부여

  • doc를 보면 더 많음

  • 테이블을 모델 클래스로 정의하고 실제 데이터베이스에 반영한 후에 테이블에 데이터를 입력하고 입력된 데이터를 확인 및 변경할 수 있는 여러 가지 기능을 제공한다.

D. URLconf - URL 정의

  • 클라이언트로부터 요청을 받으면, 요청에 들어있는 URL을 분석한다.
    • 요청에 들어있는 URL이 urls.py 파일에 정의된 URL 패턴과 매칭되는지를 분석한다.
a. 우아한(Elegant) URL
  • urls..py 파일에 URL과 처리 함수(뷰)를 매핑하는 파이썬 코드를 작성
  • URLconf = URL/뷰 매핑
b. URL 분석하는 순서
  • setting.py 파일의 ROOT_URLCONF 항목을 읽어 최상위 URLconf(urls.py)의 위치를 알아낸다.
  • URLconf를 로딩하여 urlpatterns 변수에 지정되어 있는 URL 리스트를 검사한다.
  • URL 패턴이 매치되면 검사를 종료한다
  • URL의 뷰를 호출한다. 뷰는 함수 또는 클래스의 메소드. 호출시 HttpRequest 객체와 매칭할 때 추출된 단어들을 뷰에 인자로 넘겨준다.
  • 매칭에 실패하면 에러를 처리하는 뷰를 호출한다.
c. URLconf 예시

from django.urls import path
from . import views

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

  • articles/2003/ 이 URL
  • views.special_case_2003 이 처리 함수 (뷰)
  • <type:name> 형식
    • URL 패턴의 일부 문자열을 추출하기 위한 것
  • 요청 URL이 /articles/2018/ 처럼 <> 부분이 정수면 매치되고, 정수가 아니면 매치되지 않는다.
    • 매치된 경우 2018 을 인자명 year에 할당한다.
    • 뷰 함수를 views.year_archive(request, year=2018) 처럼 호출한다.
d. Path Converter
  • 꺽쇠 부분

path('articles/<int:year>/', views.year_archive),

  • str
    • / 제외한 모든 문자열과 매치.
    • 타입이 지정되지 않으면 디폴트로 str 타입 사용
  • int
    • 0 또는 양의 정수와 매치
    • 매치된 정수는 파이썬의 int 타입으로 변환
  • slug
    • slug 형식의 문자열(ASCII, 숫자, 하이픈, 밑줄로만 구성됨)과 매치
  • uuid
    • UUID 형식의 문자열과 매치.
    • 매치된 문자열은 파이썬의 UUID 타입으로 변환
  • path
    • / 를 포함한 모든 문자열과 매치
    • URL 패턴 전체를 추출하고자 할 때 사용
e. URL 패턴에 정규표현식(Regular Expression) 사용
  • URL을 좀 더 세밀하게 표현하거나 복잡한 URL 표현 가능

from django.urls import patg, re_path

from . import views

urlpattern = [
    path('articles/2003/', views.special_case_2003),
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.years_archive),
]

  • 모든 정수가 아닌 0-9로 이뤄진 4자리 숫자만 매치되도록 한정.

E. View - 로직 정의

  • 장고에서의 뷰는 함수 또는 클래스의 메소드로 작성되며, 웹 요청을 받고 응답을 반환해준다.
  • 다양한 형태의 응답 데이터를 만들어내기 위한 로직을 뷰에 작성하는 것

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)

  • 뷰 함수는 첫 번째 인자로 HttpRequest 객체 (request)를 받는다.
  • 필요한 처리를 한 후에 최종적으로 HttpResponse 객체를 반환한다.
  • 에러를 반환하고 싶다면 HttpResponseNotFound와 같은 에러 응답 객체를 반환한다.
    • 에러 응답 클래스는 모두 HttpResponse 클래스의 하위 클래스로 정의되어 있다.

      
      return HttpResponseNotFound('<h1>Page not found</h1>')
      
      
    • 보통은 별도의 템플릿 파일에 HTML 코드를 작성한다.

  • 뷰는 별도로 작성된 템플릿 파일을 해석해서 HTML 코드를 생성하고 이를 HttpResponse 객체에 담아서 클라이언트에게 응답한다.

F. Template - 화면 UI 정의

  • 개발자
    • 응답에 사용할 .html 파일을 작성
  • 장고
    • 이를 해석해서 최종 HTML 텍스트 응답을 생성하고, 클라이언트에게 보내준다.
  • 클라이언트
    • 응답으로 받은 HTML 텍스트를 해석해서 우리가 보는 웹 브라우저 화면에 UI를 보여준다.
a. 템플릿
  • 개발자가 작성하는 .html 파일을 템플릿이라 함.
  • 화면 UI 모습을 템플릿 문법에 맞게 작성한다.
b. 장고 자체 템플릿 엔진
  • 장고에서 제공하는 템플릿은 템플릿 태그/필터 기능을 사용하여 파이썬 코드를 직접 사용할 수 있기 때문에 더욱 강력하고 확장하기 쉬운 구조로 되어 있음
c. 유의할 점
  • 템플릿 파일을 적절한 디렉토리에 위치시켜야 한다는 것
d. 템플릿 파일 찾는 순서
  • setting.py에 정의된
    • TEMPLATES, INSTALLED_APPS 에서 지정된 앱의 디렉토리를 검색
  • 여러 개의 디렉토리를 지정하면, 지정된 순서대로 디렉토리를 검색하여 템플릿 파일을 찾는다.
  • TEMPLATES 항목에 정의된 디렉토리를 먼저 찾고
  • 그 다음에 INSTALLED_APPS 항목에 등록된 각 앱의 templates 디렉토리를 찾는다.

G. MVT 코딩 순서

화면 설계는 뷰와 템플릿 코딩으로 연결 테이블 설계는 모델 코딩에 반영

  • 독립적으로 개발할 수 있는 모델을 먼저 코딩, 뷰와 템플릿은 서로 영향을 미치므로 모델 이후에 같이 코딩.

참고문헌

김석훈, "Django로 배우는 쉽고 빠른 웹개발 파이썬 웹프로그래밍", 개정판, 4쇄, 한빛미디어, 2020년

0분전
작성된 댓글이 없습니다. 첫 댓글을 달아보세요!
    댓글을 작성하려면 로그인이 필요합니다.