Programming Language/Django

Django 02) MTV 구조

Sergemeow 2023. 4. 11. 13:58

Design Pattern

  • 각기 다른 기능을 가진 다양한 응용 소프트웨어를 개발할 때 공통적인 설계 문제가 존재하며, 이를 처리하는 해결책 사이에도 공통점이 있음. 이러한 유사점을 패턴이라 함.
  • “클라이언트-서버 구조”도 소프트웨어 디자인 패턴 중 하나

디자인 패턴의 장점

  • 복잡한 커뮤니케이션이 간단해짐

장고의 디자인 패턴

  • Django에 적용된 디자인 패턴은 MTV 패턴
  • MTV pattern은 MVC 패턴을 기반으로 변형된 것

MVC Software Design Pattern

  • Model - View - Controller. 데이터 및 논리제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴
  • 하나의 큰 프로그램을 세가지 역할로 구분한 개발 방법론
  1. model: 데이터와 관련된 로직을 관리
  2. view: 레이아웃과 하면을 처리
  3. controller: 명령을 model과 view로 연결
  • 관심사 분리가 목적
  • 각 부분을 독립적으로 개발할 수 있어 일부 수정에 대한 용이성이 높아짐
    • 즉, 개발 효율성 및 유지보수가 비교적 간단해짐
    • 다수의 인원이 협업하여 개발하기 용이

MTV: Model - Template - View

  • Model
    • 데이터와 관련된 로직을 관리
    • 응용프로그램의 데이터 구조를 정의하고 데이터베이스의 기록을 관리
  • Template
    • 레이아웃과 화면을 처리
    • 화면상의 사용자 인터페이스 구조와 레이아웃 연결
  • View
    • 모델과 템플릿 사이에서 로직을 처리해서 응답을 반환
    • 클라이언트의 요청에 대해 처리를 분기하는 역할
    • 동작 예시
      • 데이터가 필요하다면 model에 접근해서 데이터를 가져오고 가져온 데이터를 template로 보내 화면을 구성하고 구성된 화면을 응답으로 만들어 클라이언트에게 반환


Django Template

  • 데이터 표현을 제어하는 도구이자 표현에 관련된 로직
  • Django Template을 이용한 HTML 정적 부분과 동적 컨텐츠 삽입
  • Django Template System: 데이터 표현을 제어하는 도구이자 표현에 관련된 로직을 담당

Django Template Language(DTL)

  • Django Template에서 사용하는 built-in template system
  • 조건, 반복, 변수치환, 필터 등의 기능을 제공
    • Python처럼 일부 프로그래밍 구조를 사용할 수 있지만 Python 코드로 실행되는 것은 아님
    • Django template system은 단순히 Python이 HTML에 포함된 것이 아님
  • 프로그래밍적 로직이 아니라 프레젠테이션을 하기 위한 것

DTL Syntax

  1. Variable: 변수
  2. Filters: 변수가 어떻게 보여질지 바꿔줌
  3. Tags: 기능
  4. Comments: 주석

Variable

{{ variable }}
  • 변수명은 영문알파벳, 숫자와 언더라인 조합으로 구성 가능. 언더라인으로는 시작 불가
  • dot을 사용하여 변수 속성에 접근할 수 있음
  • render()의 세번째 인자로 {’key’:value}와 같이 딕셔너리 형태로 넘겨주며, 여기서 정의한 key에 해당하는 문자열이 template에서 사용가능한 변수명이 됨
def index(request):
    info = {
        'name' : 'Daehyun',
        'age' : '21',
    }
    return render(request, 'myapp/index.html', {'info' : info})

Filters

{{ variable|filter }}
  • 표시할 변수를 수정할 때 사용
  • 예시)
    • name 변수를 모두 소문자로 출력
  • 60개의 built-in template filters가 있음
  • chained가 가능하며 일부 필터는 인자를 받기도 함
<h1>My name is {{ info.name | capfirst}}.</h1>
<h1>I am {{ info.age | add:2 }} years old.</h1>

Tags

  • 출력 텍스트를 만들거나, 반복 또는 논리를 수행하여 제어 흐름을 만드는 등 변수보다 복잡한 일들을 수행
  • 일부 태그는 시작과 종료 태그가 필요 {% if % }{% endif %}
  • 약 24개의 built-in template tags를 제공
{% if info.age == 21 %}
  <p>스물하나 부럽다</p>
{% endif %}

Comments

  • Django template에서 라인의 주석을 표현하기 위해 사용
  • 아래처럼 유효하지 않은 템플릿 코드가 포함될 수 있음
{# {% if %} text {% endif %} #}

응용예시)

def index(request):
    foods = ['apple', 'banana', 'cherry', 'durian']
    info = {
        'name' : 'daehyun',
        'age' : 21,
        'hometown' : 'jeonju',
    }
    context = {
        'foods' : foods,
        'info' : info,
    }
    return render(request, 'myapp/index.html', context)

Template Inheritance

템플릿 상속

  • 템플릿 상속은 기본적으로 코드의 재사용성에 초점을 맞춤
  • 템플릿 상속을 사용하면 사이트의 모든 공통 요소를 포함하고, 하위 템플릿이 재정의(override) 할 수 있는 블록을 정의하는 기본 ‘skeleton’ 템플릿을 만들 수 있음

상속 태그

{% extends '' %}
  • 자식(하위) 템플릿이 부모 템플릿을 확장한다는 것을 알림
  • 반드시 템플릿 최상단에 작성 되어야함(즉, 2개 이상 사용할 수 없음)
{% block content %}{% endblock content &}
  • 하위 템플릿에서 재지정(overridden)할 수 있는 블록을 정의
  • 즉, 하위 템플릿이 채울 수 있는 공간
  • 가독성을 높이기 위해 선택적으로 endblock 태그에 이름을 지정할 수 있음


Trailing Slashes

  • Django는 URL 끝에 /가 없으면 자동으로 붙여주는 것이 기본 설정
    • 그래서 모든 주소가 trailing slash로 끝나도록 구성되어 있음
    • 모든 프레임 워크가 동일하게 동작하지는 않음

Variable Routing

  • URL 주소를 변수로 사용하는 것을 의미
  • URL의 일부를 변수로 지정하여 view함수의 인자로 넘길 수 있름
  • 즉, 변수 값에 따라 하나의 path()에 여러 페이지를 연결 시킬 수 있음

  • 변수는 <>에 정의하며 view 함수의 인자로 할당됨
  • 기본 타입은 string이며 5가지 타입으로 명시할 수 있음
  1. str
    • ‘/’를 제외하고 비어있지 않은 모든 문자열
    • 작성하지 않을 경우 기본 값
  2. int
    • 0 또는 양의 정수와 매치

App URL mapping

  • 앱이 많아졌을 때 urls.py를 각 app에 매핑하는 방법

앱 내에 urls.py를 따로 만들고 from . import views로 임포트.

‘articles.urls’ 가 되었어야 했다.

 

'Programming Language > Django' 카테고리의 다른 글

Django 06) CRUD_2  (0) 2023.04.11
Django 05) CRUD_1  (0) 2023.04.11
Django 04) SQLite 기초  (0) 2023.04.11
Django 03) Form & Data  (0) 2023.04.11
Django 01) 첫걸음  (0) 2023.04.11