웹 사이트를 설계할때 가장 먼저 해야할 일은 프로그램이 해야 할 일을 적당한 크기로 나누어 모듈화 하는 것이다. 이 경우에서 웹 사이트 전체 프로그램 또는 모듈화된 단위 프로그램을 애플리케이션이라고 한다.
장고에서는 이 애플리케이션 개념을 더 구체적으로 정의한다
- 프로젝트 : 웹 사이트에 대한 전체 프로그램을 의미
- 애플리케이션 : 모듈화된 단위 프로그램을 의미
즉, 애플리케이션 프로그램들이 모여 프로젝트가 되는것이다.
Django는 MVT 패턴 스펙을 가진다
일반적으로 Java Spring Boot, Ruby on Rails 등과 같은 프레임워크들은 MVC(Model-View-Controller)패턴을 가진다. Model(데이터), View(사용자), Controller(로직)를 구분해 한 요소가 다른 요소에 영향을 주지 않도록 하는 설계방식이다.
Django는 MVC가 아닌 MVT패턴을 따르게 된다.MVT패턴은 Model-View-Template의 약자이다. MVC의 'View'가 Django에서의 Template에 해당하고, Controller는 View에 해당한다. 이 MVT패턴이 각각 Django에서 어떤 역할을 지니는지 보면 아래와 같다.
- Model : 데이터베이스에 저장되는 데이터를 의미한다. 데이터 베이스로부터 CRUD를 담당하는 것이다.
- Template : 사용자에게 보여지는 UI부분이다.
- View : 실질적으로 프로그램 로직이 동작해 데이터를 가져오고 적절히 처리한 결과를 템플릿에 전달하는 역할을 수행한다.
기본적인 Django의 MVT패턴을 보면 아래와 같은 구조로 작동한다.
MVT패턴에 따른 처리 과정은 아래와 같다.
- 클라이언트로 부터 요청을 받으면 URLconf를 이용해 URL을 분석한다
- URL분석결과를 통해 해당 URL에 대해 처리를 담당할 View를 결정한다
- View는 로직을 실행하며 데이터 베이스 처리가 필요하면 Model을 처리하고, 결과를 반환받는다.
- View는 로직 처리가 끝나면 Template를 사용해 클라이언트에 전송할 HTML파일을 생성한다.
- View는 최종적으로 HTML파일을 클라이언트에게 응답한다
이제 각 Model,View,Template에 대해 간단히 살펴보자
Model : Database에 대한 정의
모델은 사용할 데이터에 대한 정의를 담고 있는 클래스이다. Django는 ORM(Object Relational Mapping)기법을 사용해 애플리케이션에서 사용할 데이터 베이스를 클래스로 매핑해 코딩할 수 있다. 하나의 모델 클래스는 하나의 테이블에 매핑되고, 모델 클래스의 속성은 테이블의 컬럼에 매핑된다. Django에서 사용하는 ORM기법이란, 객체와 관계형 데이터 베이스(RDBS)를 연결해 주는 역할을 하는 것이다. 자세한 것은 아래를 참고하자
https://eun-jeong.tistory.com/31
장고의 모델 클래스들은 주로 models.py파일에 정의한다. 예시 Model을 하나 작성해 보면 아래와 같이 작성할 수 있다.
from statistics import mode
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
second_name = models.CharField(max_length=40)
위 코드는 내부적으로 SQL의 아래 구문과 같이 변환해 테이블을 생성한다.
CREATE TABLE exapp_person(
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"second_name" varchar(40) NOT NULL
)
장고 내부의 테이블 및 컬럼 생성을 하는데 사용하는데 있어 여러 규칙이 있지만 이 변환과정에서 사용된 규칙은 아래 두가지가 있다.
- 테이블 명은 '애플리케이션명_클래스명' 형태로 연결하며, 소문자로 표시한다. 필요에 따라 다른 이름으로 지정할 수 있다.
- Primary Key는 정의하지 않아도 장고가 자동으로 부여한다. 필요에 따라 개발자가 직접 부여할 수 있다.
models에 대한 추가적인 document는 아래에 들어가서 볼 수 있다.
https://docs.djangoproject.com/en/4.0/topics/db/models/
URLconf : URL정의
장고는 클라이언트로 부터 요청을 받으면 먼저 URL을 분석한다. 요청에 들어있는 URL이 urls.py에 정의된 URL패턴과 매칭되는지를 분석한다.url을 정의하기 위해서는 urls.py파일에 URL과 View를 매핑하는 코드를 작성해 주면 된다. 이러한 URL/뷰 매핑을 URLconf라고 부른다. 예시 URLconf를 작성하면 아래와 같다.
from urllib.parse import urlparse
from django.urls import path
from . import views
urlpatterns = [
path('article/2021/',views.special_case_2021),
path('article/<int:year>/',views.year_archive)
]
위 예시를 보면 <int:year>과 같이 꺾쇠를 사용하는 부분이 있다. 이는 URL패턴의 일부 문자열을 추출하기 위한 것이며, <type:name>형식으로 사용한다. 두번째 패턴을 예시로 보면 article/2021/과 같은 형식이면 매칭이 되고, article/ex_string/과 같이 int가 아닌 경우에는 매칭되지 않는다.
이러한 꺾쇠 부분을 장고에서는 'Path Converter'라고 하며 사용되는 타입들은 아래와 같다.
- str : 모든 문자열 매칭, 타입 지정 안됐을 경우 str이 디폴트이다
- int : 0또는 양의 정수와 매칭
- slug : slug형식의 문자(ASCII,숫자, 하이픈, 밑줄로만 구성)와 매칭
- uuid : UUID형식의 문자열과 매칭
- path : 슬래시를 포함한 모든 문자열과 매칭
또한 URLconf에서 정규표현식을 사용할 수 도 있다.
from django.urls import path, re_path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail),
]
View : 로직정의
장고는 웹 요청에 있는 URL을 분석하고, 해당 URL에 매핑된 View를 호출한다 (URLconf에서의 작업). 일반적으로 View는 웹 요청을 받아 데이터 베이스 접속 등 해당 애플리케이션 로직에 맞는 처리를 하고, 그 결과 데이터를 HTML로 변환하기 위해 템플릿을 처리하고, HTML형식의 응답데이터를 클라이언트에 반환한다.
장고에서 View는 클래스 혹은 메소드로 작성된다. 클라이언트로 주는 응답은 HTML데이터일수도, 리다이렉션 명령일수도, HTTP status code에 따른 메세지일수 도 있다. View는 보통 views.py에 작성된다.
View함수는 기본적으로 HttpRequest객체를 인자로 받고, 응답은 HttpResponse객체를 반환한다. 에러를 반환하고 싶은 경우에는 HttpResponseNotFound 객체를 반환하면 되며, 이는 HttpResponse클래스의 하위 예외 클래스로 정의되어있다. 예시 View를 작성하면 아래와 같이 작성할 수 있다.
from django.http import HttpResponse
from datetime import datetime
def current_datetime(request):
now = datetime.now()
html = f"<html><body>It is now {now}</body></html>"
return HttpResponse(html)
Template : 화면 UI 정의
Django가 클라이언트에 반환하는 최종 response는 HTML텍스트이다. html파일을 개발자가 작성하면 장고는 이를 해석 ,최종 HTML파일을 생성한 후 클라이언트에 보내게 된다.
Django가 템플릿 파일을 찾을때는 TEMPLATE_DIRS 혹은 INSTALLED_APPS에서 정의된 디렉토리를 검색한다. 이 두가지는 settings.py파일에 정의되어있다.
'Back-End > Python Django' 카테고리의 다른 글
[Django][admin page] list_filter필터 (0) | 2022.02.18 |
---|---|
[Django] [admin page]레코드 리스트 컬럼 지정하기 (0) | 2022.02.18 |
[Django] [admin page] ForeignKey설정된 모델들을 한 화면에서 CRUD하기 (0) | 2022.02.18 |
[Django] [admin page]각 필드 분리해서 보기 (0) | 2022.02.16 |
[Django] [admin page]필드 순서 변경하기 (0) | 2022.02.16 |