Dev/Django

Django 이해하기 Part1. MTV Pattern

sincerely10 2020. 7. 11. 22:35
반응형

안녕하세요. 이번 포스트에서는 Django를 학습하고 이해한 내용을 작성 해보겠습니다.
Django 자체의 개괄적인 내용보다는 실제로 다룰 수 있는 형태를 기록하겠습니다.

지난 번 TIL 포스트에서는 Django의 MTV(MVC) 패턴에 대해서 서술하였습니다.
이번에도 Django(장고)에 대한 설명과 함께 MTV 구조를 더 자세히 얘기 해보겠습니다.

1. Django란?

간단하게 요약하면 python으로 이뤄진 웹 어플리케이션 프레임워크(Web Application Frame work) 입니다.
python으로 웹 어플리케이션을 다룰 수 있는 프로그램을 직접 개발할 수도 있지만, 웹 개발시 사용할 수 있는 기능을 모아둔 Django를 활용한다면 시간이 훨씬 줄어들 것입니다.

비유하자면, 어떤 집을 짓는 대략적인 프레임이 있는 것이고 그 내부 형태나 구조나 개발자에 의해 달라질 수 있는 것입니다.

그 외에 역사나 특징 등이 있지만 기능적인 부분을 설명하는 포스트니 생략하겠습니다. 

2. MTV Pattern

Django는 MTV 패턴을 따르고 있습니다.
물론 반드시 이 패턴을 사용해야 하는 것은 아닙니다.

MTV는 Model, Template, View을 의미합니다.

2.1 Model

먼저 Model 입니다. model은 데이터 모델을 의미합니다.
Django의 model 모듈을 이용해 models.py 파일에 class를 만들고 그 속성을 기입하면 하나의 테이블 형태와 동일하게 됩니다.

Django의 App내에 생성되는 클래스는 설정한 DB와 100% 일치하는 명령어와 구조를 갖습니다.
예를 들어 DB를 mysql로 사용한다면, 각 model을 이용해 사용할 수 있는 객체의 동작(생성하고 찾고 지우는 등)이 SQL 쿼리문으로 완전히 대응 됩니다.

2.2 Template

Template은 사용자가 직접 접근하는 html등과 같은 페이지입니다. 후술하겠지만, urls.py라는 url 패턴에 따라 특정 함수를 불러오는 동작에서 Template을 설정하여 사용자에게 보여줄 수 있습니다.

 2.3 View

가장 중요하고 많은 작업을 하는 View 입니다.
이름을 생각해보면 실제 보여지는 데이터를 최종적으로 가공해 제공해주기 때문이지 않을까 생각합니다. 
View는 이름 때문에 Template과 혼선이 올 수 있지만, 실제 역할은 Template에서 받아지는 request(요청)에 대해 처리하고 response(응답) 해주는 역할을 합니다.

위 그림처럼 각 패턴은 서로 상응하는 액션을 합니다.

Model-Template 관계를 제외하고(model의 데이터를 직접 template에 제공해주지 않기 때문입니다.)
Model은 View에 의해 요청되는 데이터를 제공해줍니다.
그리고 View는 Model에게 조회, 갱신, 삭제를 요청하여 DB에 이를 적용합니다.

그리고 Template-View의 관계입니다.
Template은 View에게 client(유저)에게 받은 데이터를 넘겨줍니다.
즉, request(요청)를 받아 넘겨주는 것 입니다.
View는 Template에게 response(응답)으로 보여줄 데이터를 제공해줍니다.

기본적인 MTV 패턴에 대해서 살펴봤습니다.
단순히 클론하고 기능 구현에 급급해 작성했을 때와 다르게 폭 넓게 볼 수 있었습니다.

이와 같은 MTV 패턴은 Django를 이해하는데 필수적이지만, 보통 Template을 Django에서 직접 제공해주지 않습니다.
더 효과적으로 JavaScript를 사용해서 보여주는 React, Vue 등과 같은 Front-End 프레임워크가 있기 때문에
Django의 역할은 RESTful 하게 작성된 API를 통해 효과적으로 Front-End와 통신하는 것으로 한정됩니다.

3. API를 통한 Front-End와의 통신

그렇다면 2에서 말씀드린 RESTful한 API를 가지고 통신하는 구조는 어떻게 생겼을까요?

draw.io로 직접 작성한 Web의 전체 End to End 형태의 구조도입니다.
Django의 역할은 template을 사용하지 않으면, API로 데이터를 다루고 불러오는 주황색 박스에 그칩니다.

Front-End에서 버튼 클릭 등 다양한 이벤트를 발생시키면 이를 받아 urls.py에 넘겨줍니다.
urls.py에서는 들어온 url의 End Point를 구분하여 일치하는 패턴을 찾습니다.

보통 프로젝트에서는 패턴을 찾고 해당하는 앱의 urls.py로 넘겨줍니다.
그리고 해당 앱에서 다시 한 번 End Point에 따라 url Pattern을 찾고, views.py에서 해당하는 class내의 함수를 호출합니다.

그리고 views.py에서는 전달받은 request를 가지고 API 목적에 맞게 데이터를 불러오고 가공합니다.
DB의 데이터를 SQL 쿼리문으로 직접 조작하는 것이 아니라 python에서 model의 객체를 Django QuerySet을 통해 컨트롤 할 수 있습니다.
이 QuerySet이 위에서 언급한 SQL 쿼리문과 100% mapping 된다는 데이터베이스를 다루는 method 입니다.

그리고 views.py는 해당 동작을 수행한 후, 필요하다면 데이터와 함께 return 해줍니다.
최종적으로 Front-End가 전달받은 데이터 등을 화면에 맞게 뿌려주고, 우리가 보는 web을 볼 수 있는 것 입니다.

다음 포스트 내용은 Django에서 가장 많이 사용하는 urls.py, models.py, views.py에 대해 상세히 다뤄보겠습니다.

 

반응형