Django 프레임워크

정은영·2022년 12월 11일
0

CS

목록 보기
14/18

MVT 패턴

MVT 패턴

  • Model: 데이터베이스에 저장되는 데이터를 나타냅니다.
  • View: 실질적으로 프로그램 로직이 동작하여 데이터를 가져오고 처리한 결과를 템플릿에 전달하는 역할을 합니다. 여기서 함수를 정의합니다.
  • Template: 사용자에게 보여지는 UI 부분입니다.

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

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

URLconf - URL 정의

클라이언트로부터 받은 요청에 들어있는 URL이 urls.py 파일에 정의된 URL 패턴과 매칭되는지를 분석합니다.
URL을 정의하기 위해서는 urls.py 파일에 URL과 처리함수(View에 정의된 함수)를 매핑하는 파이썬 코드를 작성합니다. 이러한 URL-View 매핑을 URLconf라고 합니다.

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>/', views.month_archive),
    path('articles/<int:year>/<int:month>/<slug:slug>', views.article_detail),
]
  • article/2003 부분이 URL이고 views.special_case_2003 부분이 처리함수(View)입니다.

Path Converter
위 코드를 보면 URL 패턴을 정의할 때 <>를 사용하는 부분이 있는데 이 부분을 Path Converter라고 부릅니다.
이는 URL 패턴의 일부 문자열을 추출하기 위한 것이며 type:name 형식으로 사용합니다.

  • str: /(슬래시) 를 제외한 모든 문자열과 매치됩니다. 타입이 지정되지 않았다면 디폴트로 str 타입을 사용합니다.
  • int: 0 또는 양의 정수와 매치된다. 매치된 정수는 파이썬의 int 타입으로 변환된다.
  • slug: slug 형식의 문자열 (ASCII, 숫자, 하이픈, 밑줄로만 구성됨)과 매치된다.
  • uuid: UUID 형식의 문자열과 매치된다. 매치된 문자열은 파이썬의 uuid 타입으로 변환된다.
  • path: /(슬래시)를 포함한 모든 문자열과 매치된다. 이는 URL 패턴의 일부가 아니라 전체를 추출하고자 할 때 많이 사용한다.

View - 로직 정의

뷰는 웹 요청을 받아서 데이터베이스 접속 등 해당 어플리케이션의 로직에 맞는 처리를 하고, 그 결과 데이터를 HTML로 변환하기 위하여 템플릿 처리를 한 후에 최종 HTML로 된 응답 데이터를 웹 클라이언트로 반환하는 역할을 합니다.
장고에서 뷰는 함수 또는 클래스의 메소드로 작성되며, 웹 요청을 받고 응답을 반환해줍니다. 이러한 뷰는 보통 view.py에 작성하지만 다른 파일에 작성해도 무방합니다. (다만, 파이썬 경로에 있는 파일이어야 장고가 찾을 수 있습니다.)

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 객체를 받습니다. 그리고 필요한 처리를 한 후에 HttpResponse 객체를 반환해줍니다.
  • 위 코드에서는 HTML 코드를 뷰 함수 내에 직접 사용했지만, 보통 별도의 템플릿 파일에 HTML 코드를 작성합니다.
  • 즉, 뷰는 별도로 작성된 템플릿 파일을 해석해서 HTML 코드를 생성하고 이를 HttpResponse 객체에 담아서 클라이언트에게 응답합니다.

Template - 화면 UI 정의

장고가 클라이언트에 반환하는 최종 응답은 HTML 텍스트입니다. 개발자가 응답에 사용할 .html 파일을 작성하면, 장고는 이를 해석해서 최종 HTML 텍스트 응답을 생성하고 이를 클라이언트에게 보내줍니다.
템플릿 파일은
.html 확장자를 가지며, 장고의 템플릿 시스템 문법에 맞게 작성합니다. (템플릿 파일은 설정된 위치에 위치시켜야 합니다.)

ORM 기반 프레임워크

Django는 ORM 기반 프레임워크로 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주기 때문에 SQL 쿼리문 없이도 데이터베이스의 데이터를 다룰 수 있습니다.

>>> Book.objects.all()
<QuerySet [<Book: one>, <Book: two>]>
  • objects.all()메서드를 이용하면 쿼리문 없이 Book 객체에 저장된 데이터를 모두 가져올 수 있습니다.

Django ORM의 장점

  • 쿼리를 객체 관점으로 작성함으로써 재사용성을 높일 수 있습니다.

  • 반복되는 코드를 줄일 수 있습니다.

  • 특정 데이터베이스가 아닌 범용적으로 작성할 수 있습니다.

  • 생산성을 높일 수 있습니다.

  • 동적으로 처리하기 좋습니다.

    • 예를 들어 특정 필드의 결과값만 가져오고 싶으면 values 혹은 values_list를 사용하면 됩니다.
  • 조건절에 대해서 다양한 Lookup 필드를 제공해줘서 해당 lookup 필드를 알고 있다면 쉽게 사용할 수 있습니다.

  • dirty checking을 지원합니다.

    • dirty는 상태의 변화가 생긴 것을 말합니다. dirty checking이란 트랜잭션이 끝나는 시점에 변화가 있는 모든 엔티티 객체를 데이터베이스에 자동으로 반영해줍니다. (save 메소드로 변경사항을 저장하지 않아도 update 쿼리가 실행되어 데이터베이스에 반영합니다.)

Django ORM의 단점

  • ORM 관련 메소드를 공부해야 합니다.
  • 잘못 사용할 경우 N+1 문제 등 다양한 문제를 겪을 수 있습니다.
  • 연관관계를 잘못 맺을 경우 문제가 생길 수 있습니다.
  • NoSQL의 경우에는 다른 라이브러리를 통해 해결해야 하기 때문에 장고 ORM의 기능을 사용할 수 없습니다.

Spring vs Django

  1. 타입문제

    • Java는 정적언어로써 컴파일되고 타입이 있습니다.

    • Python은 동적언어로써 타입을 코드에 명시하지 않습니다.
      타입이 지정되는 언어가 런타임시에도 더 안정적이므로 타입 안정성 문제에 대해서는 스프링+자바가 낫다고 생각합니다.

  2. 개발의 편리함

    • 장고는 csrf_token 기능 등을 구현하지 않아도 기본 제공합니다

    • 파이썬 코드가 자바보다 훨씬 짧습니다.

    • 파이썬은 여러 자료형을 제공합니다.

      →주어진 비즈니스 로직을 구현할 때는 파이썬이 더 쉬울 수 있습니다.

    • 어드민 페이지를 제공합니다.

    • pandas를 통해, 엑셀, csv 파일 처리를 쉽게 할 수 있습니다.

  3. 언어 성능
    언어성능은 자바가 더 빠릅니다.

  4. 언어차원에서 json 다루기
    파이썬은 import json 후 json.dump(), json.load() 등 메소드로 json을 쉽게 다룰 수 있습니다.

  5. 러닝커브

    스프링은 기본 언어가 자바로 장고+파이썬에 비해 난이도가 있습니다.

Reference

0개의 댓글