본문으로 바로가기

Django 웹사이트 개발 - 3. Model, View, Templates, Urls 간 관계

HTML 파일에서 쓰이는 확장 템플릿에 대해 작성하기에 앞서, Models.py, Views.py, Urls.py, Templates 폴더의 HTML 파일들의 관계를 먼저 정리하고 넘어가야 할 것 같다.


1. 앱 개발 및 웹 개발 관련 MVC 패턴

<모델-뷰-컨트롤러 위키백과>

모델-뷰-컨트롤러는 응용 프로그램을 세 가지의 구성요소로 나눈다. 각각의 구성요소들 사이에는 다음과 같은 관계가 있다.

  • 컨트롤러는 모델에 명령을 보냄으로써 모델의 상태를 변경할 수 있다. (예: 워드 프로세서에서 문서를 편집하는 것) 또, 컨트롤러가 관련된 뷰에 명령을 보냄으로써 모델의 표시 방법을 바꿀 수 있다. (문서를 스크롤하는 것)
  • 모델은 모델의 상태에 변화가 있을 때 컨트롤러와 뷰에 이를 통보한다. 이와 같은 통보를 통해서 뷰는 최신의 결과를 보여줄 수 있고, 컨트롤러는 모델의 변화에 따른 적용 가능한 명령을 추가·제거·수정할 수 있다. 어떤 MVC 구현에서는 통보 대신 뷰나 컨트롤러가 직접 모델의 상태를 읽어 오기도 한다.
  • 는 사용자가 볼 결과물을 생성하기 위해 모델로부터 정보를 얻어 온다.

<https://ko.wikipedia.org/wiki/%EB%AA%A8%EB%8D%B8-%EB%B7%B0-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC>

예전 HTML을 통해 웹페이지를 보여줄 때는 단순히 HTML 파일을 생성하여, 해당 파일 내에 있는 태그 등을 통해 정해진 데이터를 보여주는 것이었지만, 서버 사이드 스크립트 언어를 통해 기본 HTML에 PHP를 통해 MySQL의 데이터를 가져와서 출력하는 등 서버의 데이터를 사용자(클라이언트)의 요청에 의해 웹 브라우저에 나타내 주는 기능들을 사용하면서 HTML 이외의 여러가지가 필요하게 되었다. 

 MVC 모델에서 View는 사용자가 실제로 보게되는 HTML 파일 등의 구성요소를 말하며, Model은 이때 서버에서 가져와야 하는 데이터 등의 형태 및 실제 내용을 이루는 구성요소를 뜻하며, Controller는 실제로 사용자가 해당 페이지를 요청할 때 HTML파일을 불러오고, 필요한 데이터를 가져오고, 브라우저에 해당 페이지를 보여주기 위해 조율해주는 구성요소를 의미한다고 보면 될 것이다.


2. Django의 MTV 패턴

Django에서는 MTV 패턴을 사용한다. 상단에 언급한 MVC 패턴과 동일하며 용어만 다르다.

Model - View - Controller (MVC 패턴)
Model - Template - View  (MTV 패턴)

앞서 2번 게시물에서 home App에서 메인 페이지(index.html)을 불러오게 작성하는 과정을 살펴보자.

1. Home App의 templates 폴더에 index.html 파일을 넣어둔다. (Template)
 - Setting.py의 TEMPLATES 설정을 통해 기본적으로 templates 폴더를 인식하고, 파일을 가져온다.

2. Home App의 Views.py에서 request요청시 index.html을 render해주는 index라는 함수를 만든다. (View)

3. Urls.py에 home.urls를 include하고, home.urls에 path('', index, name='index')를 통해 메인페이지 접속시 views. index(View)를 통해 index.html(Template)을 나타내준다. 

이 경우 index.html에 별도의 기능이나 데이터가 없어서 따로 Model은 존재하지 않는다.
추후 작성하게 되는 models.py 또는 forms.py의 경우가 Model이다.


실제 메인 페이지 접속시 index.html이 나타나게 되는 순서는 다음과 같다.

1. 사용자가 127.0.0.1:8000에 접속한다.

2. 최상위 Urls.py에서 해당 주소('')를 찾는다. (sc_web\urls.py)

3. path('', include('home.urls'))를 통해 home App의 urls.py로 간다. (sc_web\urls.py)

4. path('', index, name='index')를 통해 index 함수를 호출한다. (home\urls.py)(View)

5. return render(request, 'home/index.html',{})을 통해서 Home App의 templates/home/index.html을 불러온다. (home\views.py)(Template)

위의 과정에는 별도의 데이터가 존재하지 않아서 model은 들어가 있지 않다.

URL 입력 -> urls.py -> view -> (model -> DB -> model -> view ->) template의 과정으로 보면 될 것 같다.
                                                      (데이터 존재시)

특정 페이지를 추가하고자 할 때는 위의 순서에 맞추어, 어떤 App에서 사용하는지, 해당 App의 path가 설정되어 있는지를 차근차근 따져서 추가를 하면 된다.


예전에 네트워크의 각 계층 공부를 할 때 '프로토콜'이란걸 굳이 왜 만들고 구분해서 사용하는지 궁금했던 적이 있었다. 생각 끝에 내린 결론은 '프로토콜'이라는 '통신 규약'을 설정해서 사용 규격을 통일하여 개발, 사용시에 공통적이고 효율적으로 사용할 수 있게 하기 위함이라고 생각하고 있다. 위의 MVC, MTV와 같은 패턴들도 마찬가지라고 생각한다. 특정 패턴을 만들어서 개발 및 사용 시 효율적이게 하기 위해 만들어서 사용하는 것 같다. 각각 특정 역할로 분류를 하고 프레임워크에 적용하여, 개발시 효율적이고 빠르게 만들기 위함이라고 생각한다.