Django/Django

MTV 패턴과 적용

하효닝 2022. 3. 9. 18:18

디자인 패턴

  • 만약 하나의 스크립트에 서버에서 처리해야하는 로직과 프론트로 전달되어야 하는 HTML 코드를 함께 작성하게 되면, 프론트만 수정해야 할 때도 로직이 들어있는 스크립트를 열어보아야 하고 잘못하면 로직 코드에 문제가 발생하게 된다.
  • 따라서 이러한 문제들을 해결하기 위해 화면 출력을 위한 HTML 코드를 별도의 파일로 분리하고, 서버쪽 코드는 다시 DB 구조를 위한 파일과 기능을 위한 파일을 분리하는 디자인 패턴을 사용하기 시작했다.
  • 웹 프로그래밍에서 자주 사용되는 디자인 패턴은 MVC로, Model View Controller의 약자이다.

 

MTV 패턴

  • MTV는 Model Template View의 약자로 각각의 기능은 아래와 같다.
Model DB의 구조를 결정하며, 테이블의 이름과 각 칼럼의 이름, 타입 등을 설계한다.
Template 사용자에게 보여지는 UI 부분으로, HTML 코드 등 실질적으로 클라이언트에게 보여질 부분에 해당된다.
View 기능, 로직 부분으로, 넘겨받을 데이터를 어떻게 해석하고 가공할지, 처리된 결과를 어떻게 클라이언트에게 돌려줄지 결정하는 부분에 해당된다.

  • MVC와 배교했을 때 Model은 Model과, View는 Template와, Controller는 View와 수행하는 역할이 동일하다.
  • MTV 패턴은 장고 전체에서 사용되지만 특히 앱 안에서 철저하게 분리해 사용된다.

 

MTV 패턴 적용

앱 생성

python manage.py startapp 앱이름
  • 위의 명령어로 앱을 생성하면 아래와 같이 MTV 패턴이 적용된 파일과 폴더가 만들어진다.

 

models.py

  • 장고에서 DB의 명세를 관리하는 파일
  • 모델은 클래스로 작성하며 클래스의 이름은 테이블 이름이 되고, 클래스의 속성들은 컬럼이 된다. (속성의 값이 컬럼의 데이터 타입과 제약사항을 결정)
  • 모델을 이용하면 ORM 내부에서 자동으로 데이터베이스에 할 일을 전달하고 결과를 반환해주기 때문에, 개발자는 특정 DB에서 사용되는 SQL 문이나 API 사용법을 몰라도 웹 어플리케이션을 작성하는 것이 가능하다.

 

admin.py

  • 장고의 기본 관리자 페이지를 사용하면 모델이 제대로 만들어졌는지 바로 확인이 가능하다.
  • 만약 만든 모델을 관리자 페이지에서 확인하거나 특별한 기능을 추가하고 싶으면 admin.py에 해당 내용을 작성한다.

 

views.py, urls.py

  • 만들 view는 views.py에 작성하고, 어떤 url을 이용해 어떤 view를 동작시킬지에 관한 내용은 urls.py에 작성한다.
  • 보통은 프로젝트 urls.py와 각 앱에 해당하는 urls.py들로 구성한다.

 

 

앱 등록

  • config/settings.py 파일에서 INSTALLED_APPS 변수에 아래와 같이 등록할 앱을 추가한다.
  • 간단하게 앱 이름만 적어도 된다.
# Application definition

INSTALLED_APPS = [
    'members.apps.MembersConfig'
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

 

뷰 생성

  • 뷰는 views.py에 작성하며, 클래스형 뷰와 함수형 뷰 두가지 방법으로 작성할 수 있다.

 

함수형 뷰

from django.http import HttpResponse

# Create your views here.


def index(request):
    return HttpResponse("Hello, world!")

 

URL 연결

  • 뷰를 만들고 나면, 앱 폴더 아래에 urls.py을 만들어서 뷰를 호출하기 위한 URL을 뷰와 연결시켜준다.
from django.urls import path
from . import views


urlpatterns = [
    path('', views.index, name='index')
]
  • path 함수는 path(route, view, kwargs, name) 형태로 호출된다.
    • route: 주소를 의미하며, 경로변수가 존재하면 <>를 써서 나타낸다.
    • view: route 주소로 접근했을 때 호출할 뷰
    • kwargs: 뷰에 전달할 값들
    • name: route의 이름을 의미하며, 이 이름을 가지고 원하는 곳에서 주소를 호출해 출력하거나 사용할 수 있다.
  • 해당 urls.py는 앱의 라우팅만 담당하기 때문에, 프로젝트의 메인 urls.py 파일에서 연결해주어야 한다.

 

config/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('members/', include('앱이름.urls')),
]
  • include는 다른 urls.py 파일을 참조할 수 있도록 해주는 함수

 

모델 만들기

  • 모델은 데이터베이스의 구조도로, 데이터베이스에 어떤 테이블을 만들고 어떤 컬럼을 갖게 할 것인지와 해당 컬럼의 제약조건을 결정한다.
  • 모델은 보통 models.py에 클래스 형태로 작성한다.
from django.db import models

# Create your models here.


class Team(models.Model):
    team_name = models.CharField(max_length=100)
    
    def __str__(self):
        return self.team_name


class Member(models.Model):
    username = models.CharField(max_length=100)
    team = models.ForeignKey(Team)

    def __str__(self):
        return self.username
  • 장고의 모델은 model.Model을 상속받아 만들며, 이 부모 클래스가 실제로 데이터베이스와 ORM을 이용해 동작하는 기능을 제공한다.
  • 각 클래스 변수들은 필드 값을 가지며 해당 필드는 자료형과 같다.
  • __str__ 메서드느느 관리자 화면이나 shell에서 객체를 출력할 때 나타낸 내용을 결정한다. (toString)

 

데이터베이스에 적용

python manage.py makemigrations 앱이름
  • 위 명령어를 실행하면 앱의 변경사항을 추적해서 데이터베이스에 적용할 내용을 만들어서 migrations 폴더에 기록한다.
  • 이후 변경사항을 데이터베이스에 반영하기 위해 아래와 같은 명령어를 입력한다.
python manage.py migrate

 

뷰 렌더링

from .models import Member

# Create your views here.


def index(request):
    member_list = Member.objects.all()
    context = {'member_list': member_list}
    
    return render(request, 'members/index.html', context)
  • render 메서드는 request와 템플릿 이름, 사전형 객체를 인자로 받는다.
  • 사전형 객체는 템플릿에서 사용할 변수들을 말한다.