파이썬-장고

Django (1)

threegopark 2021. 7. 7. 10:29
728x90

1. Django의 일반적인 특징

  • MVC 패턴 기반 MVT (Model-View-Template)
    • MVC (Model-View-Controller) 기반의 프레임워크
    • 장고에서 View -> Template  //  Controller -> View
    • 장고에서 Model은 데이터베이스에 액세스하는 컴포넌트
    • 장고에서 View는 데이터를 가져오고 변형하는 컴포넌트
    • 장고에서 Template는 데이터를 사용자에게 보여주는 컴포넌트
  • 객체 관계 매핑 (ORM, Object-Relational Mapping)
    • '데이터베이스 시스템' <--> 파이썬 클래스의 '모델' 연결
    • ORM -> SQL 문장 불필요
  • 자동으로 구성되는 관리자 화면
    • 기본 기능으로 제공 (관리 기능)
  • 세련된 URL 설계
    • 정규표현식 활용, 직관적이고 쉬운 URL 설계 지원
  • 자체 템플릿 시스템
    • 내부적으로 확장이 가능한 템플릿 시스템 존재 (HTML 등 텍스트형 언어의 적용이 가능)
  • 캐시 시스템
    • 동적인 페이지를 만들기 위해서 데이터베이스 쿼리를 수행하고 템플릿을 해석하며, 관련 로직을 실행해서 페이지를 생성하는 일은 서버에 엄청난 부하를 주는 작업이다. 캐시 시스템을 사용해서 자주 이용되는 내용을 저장해 두었다가 재사용하여 성능을 높일 수 있다.
    • 장고의 캐시 시스템은 캐시용 페이지를 메모리, 데이터베이스 내부, 파일 시스템 중 아무 곳에나 저장이 가능함
  • 다국어 지원
  • 풍부한 개발 환경
    • 아파치 등의 웹 서버가 없어도 테스트 진행 가능
  • 소스 변경사항 자동 반영

2. 장고에서의 애플리케이션 개발 방식

 

웹 사이트를 설계할 때 가장 먼저 해야 할 일은 프로그램이 해야 할 일을 적당한 크기로 나누어서 모듈화하는 것

이러한 경우, 웹 사이트의 전체 프로그램 or 모듈화된 단위 프로그램을 애플리케이션이라고 함

(= 프로그램으로 코딩할 대상)

 

장고에서는 전체 프로그램을 프로젝트라 하고, 모듈화된 프로그램을 애플리케이션이라고 부름

 

 

2.1 MVT 패턴

 

기존의 MVC 패턴데이터(Model), 사용자 인터페이스(View), 데이터를 처리하는 로직(Controller)을 구분해서 한 요소가 다른 요소들에 영향을 주지 않도록 설계하는 방식이다.

장고 프레임워크에서의 MVT 패턴은 View -->Template // Controller --> View 라 표현하며 Model은 데이터베이스에 저장되는 데이터를 의미하고, Template는 사용자에게 보여지는 UI, View는 실질적으로 프로그램 로직이 동작하여 데이터를 가져오고 처리한 결과를 템플릿에 전달하는 역할을 수행한다.

 

예시) 블로그의 내용을 DB로부터 가지고 오거나 저장, 수정하는 기능을 수행하는 Model

버튼을 눌렀을 때 어떤 함수를 호출하며 데이터를 어떻게 가공할 것인지 결정하는 View

화면 출력을 위해 디자인과 테마를 적용해서 보여지는 페이지는 만들어주는 Template

 

MVT 패턴 처리 순서

  1. 클라이언트로부터 요청을 받으면 URLconf를 이용하여 URL 분석
  2. 분석 결과를 통해 해당 URL에 대한 처리를 담당할 View 결정
  3. View는 자신의 로직을 실행하면서, 데이터베이스의 처리가 필요하면 Model을 통해 처리하고 그 결과를 반환받음
  4. View는 자신의 로직 처리가 끝나면 Template을 사용하여 클라이언트에 전송할 HTML 파일을 생성
  5. 최종 결과로 HTML 파일을 클라이언트에게 보내 응답

 

 

2.2 Model - 데이터베이스 정의

  • Model : 사용될 데이터에 대한 정의를 담고 있는 장고의 클래스
  • ORM 기법을 사용하여 애플리케이션에서 사용할 데이터베이스를 클래스로 매핑할 수 있음 (즉, 하나의 모델 클래스는 하나의 테이블에 매핑되고, 모델 클래스의 속성은 테이블의 컬럼에 매핑됨)

+ ORM 이란?

객체와 관계형 데이터베이스를 연결해주는 역할. 기존의 웹 프로그래밍에서 데이터베이스에 접근하려면 SQL 언어와 데이터베이스 접근 드라이버 API 등을 잘 알아야 했다. 하지만 ORM에서는 데이터베이스 대신에 객체(클래스)를 사용해 데이터를 처리할 수 있다. 객체를 대상으로 필요한 작업을 실행하면, ORM이 자동으로 적절한 SQL 구문이나 데이터베이스 API를 호출해서 처리해준다.

 

 

 

2.3 URLconf - URL 정의

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

  • 파이썬 URL : 우아한 URL (자바, PHP 계열의 URL보다 직관적)
  • url.py 파일에 URL과 처리 함수(view)를 매핑하는 코드 작성이 필요함
from django.urls import path
from . import views

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    #URL 부분            , 처리 함수 (VIEW) 부분
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>', views.month_archive),
    path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]
  • URL과 처리 함수를 별도로 정의하고, 맵핑하는 방식 --> 유연성 제공 (수정 등이 쉬워짐)

웹 클라이언트가 웹 서버에 페이지 요청 시, 장고에서 URL 분석하는 순서

  1. setting.py 파일의 ROOT_URLCONF 항목을 읽어 최상위 URLconf(url.py)의 위치를 알아냄
  2. URLconf를 로딩하여 urlpatterns 변수에 지정되어 있는 URL 리스트 검사
  3. 위에서부터 순서대로 URL 리스트의 내용을 검사하면서 URL 패턴이 일치하면 검사 종료
  4. 매치된 URL의 뷰 호출. (뷰는 함수 또는 클래스의 메서드임.) 호출 시 HttpRequest 객체와 매칭할 때 추출된 단어들을 뷰에 인자로 넘겨줌
  5. 검사 실패 시 에러 처리하는 뷰 호출

+<int:year> --> URL 패턴의 일부 문자열 추출 ( <type : name> 형식으로 사용 )

 

 

아래와 같이 정규표현식을 이용하여 URL 패턴을 작성할 수도 있다.

from django.urls import path
from . import views

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

 

 

2.4 View - 로직 정의

뷰는 웹 요청을 받아서 데이터베이스 접속 등 해당 애플리케이션의 로직에 맞는 처리를 하고, 그 결과 데이터를 HTML로 변환하기 위하여 템플릿 처리를 한 후에, 최종 HTML로 된 응답 데이터를 웹 클라이언트로 반환하는 역할을 수행

 

장고에서 View는 함수 또는 클래스의 메소드로 작성되며, 웹 요청을 받고 응답을 반환해준다. (HTML, 리다이렉션 명령, 404 에러 메세지 등 다양한 응답이 존재할 수 있으므로 다양한 형태의 응답 데이터를 위한 로직을 뷰에 작성한다.)

 

간단한 예로 현재의 날짜와 시간을 HTML로 반환해주는 뷰를 작성해본다.

from django.http import HttpRespoonse
import datetime

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

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

 

 

2.5 Template - 화면 UI 정의

클라이언트에게 반환하는 최종 응답은 HTML 텍스트이다. 즉, 개발자가 응답에 사용할 *.html 파일(=템플릿)을 작성하면, 장고는 이를 해석해서 최종 HTML 텍스트 응답을 생성하고 이를 클라이언트에게 보내준다. 

 

이러한 템플릿 파일은 *.html 확장자를 가지며, 적절한 디렉토리에 위치하여야 한다. 그리고 이러한 디렉토리는 settings.py 파일에 정의내린다.

INSTALLED_APPS = [
	
    'django.contrib.admin',
    'django.contrib.auth',
    ...
]

TEMPLATES = [
	{
    	...
        'DIRS' : [os.path.join(BASE_DIR, 'templates')],
        ...
    }
]

(이때 TEMPLATES 항목에 정의된 디렉토리를 먼저 찾고, 그 다음에 INSTALLED_APPS 항목에 등록된 각 앱의 디렉토리를 찾는다는 것을 유의한다.)

 

 

2.6 MVT 코딩 순서

화면 설계는 뷰와 템플릿 코딩으로 연결되고, 테이블 설계는 모델 코딩에 반영된다는 점을 기억해두자. 그렇기 때문에 독립적으로 개발할 수 있는 모델을 먼저 코딩하고, 뷰와 템플릿은 서로 영향을 미치므로 이후에 같이 코딩하는 것이 일반적이다. 

 

아래와 같은 순서처럼 정해진 것은 아니지만, 일반적으로 기본적인 개발 순서는 다음와 같다.

  1. 프로젝트 뼈대 만들기 : 프로젝트 및 앱 개발에 필요한 디렉토리와 파일 생성
  2. 모델 코딩하기 : 테이블 관련 사항을 개발 (models.py, admin.py 등)
  3. URLconf 코딩 : URL 및 뷰 매핑 관계 정의 (urls.py)
  4. 템플릿 코딩 : 화면 UI 개발 (templates/ 디레고리 하위의 *.html 파일)
  5. 뷰 코딩 : 애플리케이션 로직 개발 (views.py)

 

'파이썬-장고' 카테고리의 다른 글

Django (4)  (0) 2021.07.11
Django (3)  (0) 2021.07.07
Django (2)  (0) 2021.07.07
파이썬 웹 표준 라이브러리  (0) 2021.07.03
웹 프로그래밍의 이해  (0) 2021.06.21