일반적 관점
- 자주 사용되는 구조를 일반화해서 하나의 공법으로 만듦
소프트웨어 관점
- 다양한 응용 소프투웨어 개발 시 공통적인 설계가 존재
- 이를 처리할 해결책들에 공통점이 있다는 것을 발견
- 이러한 점을 근거로 자주 사용되는 구조를 일반적인 구조화를 해둔 것
목적
- 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책을 제시
- 어플리케이션이나 시스템 디자인 시 발생할 공통된 문제들을 해결하는데 형식화된 가장 좋은 관행
장점
- 디자인 패턴을 알고 있다면 서로 복잡한 커뮤니케이션이 매우 간단해짐
- Model - View - Controller
- Model : 데이터와 관련된 로직을 관리
- View : 레이아웃과 화면을 처리
- Controller : 명령을 model과 view 부분으로 연결
- 데이터 및 논리 제어 구현하는데 널리 사용됨
- 하나의 큰 프로그램을 세가지 역할로 구분한 개발 방법론
- 관심사 분리
- 더 나은 업무의 분리와 향상된 관리를 제공
- 각 부분을 독립적으로 개발 가능
- 하나를 수정할 때 다른 것을 건드리지 않아도 됨
- 개발 효율성 및 유지 보수가 쉬움
- 다수의 멤버로 개발 용이
MTV 패턴
- MVC 디자인 패턴을 기반으로 조금 변형된 패턴
- 두 패턴은 서로 크게 다른 점은 없음
- 일부 역할에 대해 부르는 이름이 다름
- MVC 패턴에서 Model의 역할에 해당
- 데이터와 관련된 로직을 관리
- 응용프로그램의 데이터 구조를 정의하고 데이터베이스의 기록을 관리
- 레이아웃과 화면을 처리
- 화면상의 사용자 인터페이스 구조와 레이아웃을 정의
- MVC 패턴에서 View의 역할에 해당
- Model과 Template과 관련한 로직을 처리해서 응답을 반환
- 클라이언트의 요청에 대해 처리를 분기하는 역할
- MVC패턴에서 Controller의 역할에 해당
데이터 표현을 제어하는 도구이자 표현에 관련된 로직을 담당
Django Template을 이용한 HTML 정적 부분과 동적 컨텐츠 삽입
Django template에서 사용하는 built-in template system
조건, 반복, 변수 치환, 필터 등의 기능을 제공
- python 처럼 일부 프로그래밍 구조를 사용할 수 가능
- 하지만 Python 코드로 실행되는 것이 아님
- Django 템플릿 시스템은 단순히 Python이 HTML에 포함된 것이 아님
프로그래밍적 로직이 아니라 프레젠테이션을 표현하기 위한 것
{{variable}}
- 변수명은 영어, 숫자, 밑줄(_)의 조합으로 구성 가능
- 밑줄로 시작 X
- 공백이나 구두점 문자 또한 사용할 수 없음
- dot(.)을 사용하여 변수 속성에 접근할 수 있음
render()
의 세번째 인자로{'key':value}
같은 딕셔너리 형태로 넘김- 정의한 key에 해당하는 문자열이 template에서 사용가능한 변수명이 됨
{{variable|filter}}
- 표시할 변수를 수정할 때 사용
- 60개의 built-in template filters를 제공
- chained가 가능하며 일부 필터는 인자를 받음
{% tag %}
- 출력 텍스트를 만들거나, 반복 또는 논리를 수행하여 제어 흐름을 만드는 등 변수보다 복잡한 일들을 수행
- 일부 태그는 시작과 종료 태그가 필요
- 약 24개의 built-in template tags를 제공
{# #}
- Django template에서 라인의 주석을 표현하기 위해 사용
- 유효하지 않은 템플릿 코드가 포함될 수 있음
- 한 줄 주석에만 사용할 수 있음(줄 바꿈이 허용되지 않음)
- 여러 줄 주석은
{% comment %}
와{% endcomment %}
사이에 입력
템플릿 상속은 기본적으로 코드의 재사용성에 초점
템플릿 상속을 사용하면 사이트의 모든 공통 요소를 포함
하위 템플릿이 재정의 할 수 있는 블록을 정의하는 기본 스켈레톤 템플릿 제작 가능
{% extned '' %}
- 자식 템플릿이 부모 템플릿을 확장한다는 것
- 반드시 템플릿 최상단에 작성되어야 함
{% block content %}{% endblock content %}
- 하위 템플릿에서 재지정할수 있는 블록을 정의
- 즉, 하위 템플릿이 채울 수 있는 공간
- 가독성을 높이기 위해 선택적으로 endblock 태그에 이름 지정 가능
장고는 URL 끝에 /가 없다면 자동으로 붙여줌
- 그래서 모든 주소가 /로 끝나도록 구성
- 그러나 모든 프레임워크가 이렇게 동작하는 것은 아님
- 템플릿의 많은 부분이 중복
- 일부분만 변경되는 상황에서 비슷한 URL과 템플릿을 만들기 귀찮음
- URL 주소를 변수로 사용
- URL의 일부를 변수로 지정하여 view 함수의 인자로 넘김
- 변수 값에 따라 하나의 path()에 여러 페이지를 연결 시킬 수 있음
- 변수는
<>
에 정의하며 view 함수의 인자로 할당됨 - 기본 타입은 string이며 5가지 타입으로 명시
str
/
를 제외하고 비어있지 않은 모든 문자열- 작성하지 않을 경우 기본값
- int
- 0 또는 양의 정수와 매치
- 각 앱 안에 urls.py를 만듦
- urls.py에서 각 앱의 urls.py 파일로 URL 매핑을 위탁 가능
- 다른 URLconf(app/urls.py)들을 참조할 수 있도록 돕는 함수
- 함수
include()
를 만나게 되면 URL의 그 시점까지 일치하는 부분을 잘라냄 - 남은 문자열 부분을 후속 처리를 위해 include된 URLconf로 전달
path()
함수의name
인자를 정의해서 사용- URL 태그를 사용해
path()
함수에 작성한name
을 사용할 수 있음 - URL 설정에 정의된 특정한 경로들의 의존성 제거 가능
- URL에 이름을 지정하는 방법을 제공함으로써 view 함수와 템플릿에서 특정 주소를 쉽게 참조하게 함
- 템플릿에서 사용하기
- 주어진 URL 패턴 이름 및 선택적 매개 변수와 일치하는 절대 경로 주소를 반환
- 템플릿에 URL을 하드 코딩할 필요 X
- DRY 원칙을 위반하지 않으면서 링크를 출력
- 서로 다른앱에서 동일한 URL 이름을 사용하는 경우 사용
{% url 'app이름:url이름'%}
{% url 'app이름:url이름' '변수'%}
식으로 변수 또한 추가 가능