Skip to content

Latest commit

 

History

History
256 lines (180 loc) · 7.67 KB

MTV_CRUD.md

File metadata and controls

256 lines (180 loc) · 7.67 KB

웹 프레임워크 이해하기


Ⅰ. Design Pattern



ⅰ. 디자인 패턴이란?


일반적 관점

  • 자주 사용되는 구조를 일반화해서 하나의 공법으로 만듦

소프트웨어 관점

  • 다양한 응용 소프투웨어 개발 시 공통적인 설계가 존재
  • 이를 처리할 해결책들에 공통점이 있다는 것을 발견
  • 이러한 점을 근거로 자주 사용되는 구조를 일반적인 구조화를 해둔 것

ⅱ. 디자인 패턴의 목적과 장점


목적

  • 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책을 제시
  • 어플리케이션이나 시스템 디자인 시 발생할 공통된 문제들을 해결하는데 형식화된 가장 좋은 관행

장점

  • 디자인 패턴을 알고 있다면 서로 복잡한 커뮤니케이션이 매우 간단해짐



Ⅱ. Django's Design Pattern



ⅰ. MVC 디자인 패턴


1. MVC 디자인 패턴이란?

  • Model - View - Controller
    • Model : 데이터와 관련된 로직을 관리
    • View : 레이아웃과 화면을 처리
    • Controller : 명령을 model과 view 부분으로 연결
  • 데이터 및 논리 제어 구현하는데 널리 사용됨
  • 하나의 큰 프로그램을 세가지 역할로 구분한 개발 방법론

2. MVC 디자인 패턴의 목적

  • 관심사 분리
  • 더 나은 업무의 분리와 향상된 관리를 제공
  • 각 부분을 독립적으로 개발 가능
    • 하나를 수정할 때 다른 것을 건드리지 않아도 됨
    • 개발 효율성 및 유지 보수가 쉬움
    • 다수의 멤버로 개발 용이

ⅱ. Django에서의 디자인 패턴


MTV 패턴

  • MVC 디자인 패턴을 기반으로 조금 변형된 패턴
  • 두 패턴은 서로 크게 다른 점은 없음
  • 일부 역할에 대해 부르는 이름이 다름

ⅲ. MTV 디자인 패턴


1. Model

  • MVC 패턴에서 Model의 역할에 해당
  • 데이터와 관련된 로직을 관리
  • 응용프로그램의 데이터 구조를 정의하고 데이터베이스의 기록을 관리

2. Template

  • 레이아웃과 화면을 처리
  • 화면상의 사용자 인터페이스 구조와 레이아웃을 정의
  • MVC 패턴에서 View의 역할에 해당

3. View

  • Model과 Template과 관련한 로직을 처리해서 응답을 반환
  • 클라이언트의 요청에 대해 처리를 분기하는 역할
  • MVC패턴에서 Controller의 역할에 해당



Ⅲ. Django Template



ⅰ. Django Template system이란?


데이터 표현을 제어하는 도구이자 표현에 관련된 로직을 담당

Django Template을 이용한 HTML 정적 부분과 동적 컨텐츠 삽입


ⅱ. Django Template Language


Django template에서 사용하는 built-in template system

조건, 반복, 변수 치환, 필터 등의 기능을 제공

  • python 처럼 일부 프로그래밍 구조를 사용할 수 가능
  • 하지만 Python 코드로 실행되는 것이 아님
  • Django 템플릿 시스템은 단순히 Python이 HTML에 포함된 것이 아님

프로그래밍적 로직이 아니라 프레젠테이션을 표현하기 위한 것


ⅲ. DTL Syntax


1. Variable

  • {{variable}}
  • 변수명은 영어, 숫자, 밑줄(_)의 조합으로 구성 가능
    • 밑줄로 시작 X
    • 공백이나 구두점 문자 또한 사용할 수 없음
  • dot(.)을 사용하여 변수 속성에 접근할 수 있음
  • render()의 세번째 인자로 {'key':value} 같은 딕셔너리 형태로 넘김
    • 정의한 key에 해당하는 문자열이 template에서 사용가능한 변수명이 됨

2. Filters

  • {{variable|filter}}
  • 표시할 변수를 수정할 때 사용
  • 60개의 built-in template filters를 제공
  • chained가 가능하며 일부 필터는 인자를 받음

3. Tags

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

4. comments

  • {# #}
  • Django template에서 라인의 주석을 표현하기 위해 사용
  • 유효하지 않은 템플릿 코드가 포함될 수 있음
  • 한 줄 주석에만 사용할 수 있음(줄 바꿈이 허용되지 않음)
  • 여러 줄 주석은 {% comment %}{% endcomment %} 사이에 입력



Ⅲ. Template inheritance



ⅰ. 템플릿 상속


템플릿 상속은 기본적으로 코드의 재사용성에 초점

템플릿 상속을 사용하면 사이트의 모든 공통 요소를 포함

하위 템플릿이 재정의 할 수 있는 블록을 정의하는 기본 스켈레톤 템플릿 제작 가능


ⅱ. 템플릿 상속에 관련된 태그


{% extned '' %}

  • 자식 템플릿이 부모 템플릿을 확장한다는 것
  • 반드시 템플릿 최상단에 작성되어야 함

{% block content %}{% endblock content %}

  • 하위 템플릿에서 재지정할수 있는 블록을 정의
  • 즉, 하위 템플릿이 채울 수 있는 공간
  • 가독성을 높이기 위해 선택적으로 endblock 태그에 이름 지정 가능



Ⅳ. Django URLs



ⅰ. Trailing URL Slashes


장고는 URL 끝에 /가 없다면 자동으로 붙여줌

  • 그래서 모든 주소가 /로 끝나도록 구성
  • 그러나 모든 프레임워크가 이렇게 동작하는 것은 아님

ⅱ. Variable Routing


1. 필요성

  • 템플릿의 많은 부분이 중복
  • 일부분만 변경되는 상황에서 비슷한 URL과 템플릿을 만들기 귀찮음

2. variable routing이란?

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

3. 작성

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

ⅲ. App URL mapping


1. urls.py를 쪼개는 방법

  • 각 앱 안에 urls.py를 만듦
  • urls.py에서 각 앱의 urls.py 파일로 URL 매핑을 위탁 가능

2. include()

  • 다른 URLconf(app/urls.py)들을 참조할 수 있도록 돕는 함수
  • 함수 include()를 만나게 되면 URL의 그 시점까지 일치하는 부분을 잘라냄
  • 남은 문자열 부분을 후속 처리를 위해 include된 URLconf로 전달

ⅳ. Naming URL patterns


1. 특징

  • path() 함수의 name인자를 정의해서 사용
  • URL 태그를 사용해 path() 함수에 작성한 name을 사용할 수 있음
  • URL 설정에 정의된 특정한 경로들의 의존성 제거 가능
  • URL에 이름을 지정하는 방법을 제공함으로써 view 함수와 템플릿에서 특정 주소를 쉽게 참조하게 함

2. {% url '' %}

  • 템플릿에서 사용하기
  • 주어진 URL 패턴 이름 및 선택적 매개 변수와 일치하는 절대 경로 주소를 반환
  • 템플릿에 URL을 하드 코딩할 필요 X
  • DRY 원칙을 위반하지 않으면서 링크를 출력

3. URL namespace

  • 서로 다른앱에서 동일한 URL 이름을 사용하는 경우 사용
  • {% url 'app이름:url이름'%}
  • {% url 'app이름:url이름' '변수'%}식으로 변수 또한 추가 가능