django, MTV Pattern 이해하기

유동헌·2021년 9월 13일
0

이 글은 https://livetodaykono.tistory.com/40?category=791539 블로그의 글을 간단하게 메모하며 공부한 기록입니다. Django 이해하기, 응용하기까지 참고하며 공부하였습니다.

Django

python으로 이뤄진 웹 어플리케이션 프레임워크(Web Application Frame work)

python으로 웹 어플리케이션을 다룰 수 있는 프로그램을 직접 개발할 수도 있지만, 웹 개발시 사용할 수 있는 기능을 모아둔 Django를 활용한다면 시간이 훨씬 줄어들 것.

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

MTV Pattern

model

Django의 model 모듈을 이용해 models.py 파일에 class를 만들고 그 속성을 기입하면 하나의 테이블 형태와 동일하게 된다.

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

Templete

html등과 같은 페이지 (사용자가 접근하는 부분)

View

데이터를 가공하여 Templete으로 전달 (Templete에서 받아지는 request에 대해 처리하고 response 해주는 역할)

역할

model, view에 의해 요청되는 데이터를 제공해준다.

view는 model에게 조회, 갱신, 삭제를 요청하여 DB에 이를 적용한다.

templete은 view에게 client에게 받은 데이터를 넘겨준다.

view는 templete에게 response으로 보여줄 데이터를 제공해준다.

역할 상세

프론트엔드에서 버튼 클릭 등 다양한 이벤트를 발생시키면 이를 받아 urls.py에 넘겨준다.

urls.py에서는 들어온 url의 엔드 포인트 경로를 구분하여 일치하는 패턴을 찾는다.

패턴을 찾고 해당하는 앱의 urls.py로 넘겨주고, 해당 앱에서 다시 한 번 엔드 포인트 경로에 따라 url pattern을 찾고, views.py에서 해당하는 class 내의 함수를 호출한다.

그리고 views.py에서는 전달받은 request를 가지고 API 목적에 맞게 데이터를 불러오고 가공한다.

DB의 데이터를 SQL 쿼리문으로 조작하는 것이 아니라 ORM을 통한 객체로 조작한다. 이 동작이 수행되고 난 후 views.py에서는 리턴한다.

urls.py

메인 프로젝트 urls.py에서 include하여 넘겨주기

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

urlpatterns = [
    path('users', include('users.urls')),
    path('boards', include('boards.urls'))
]

include는 찾는 url 패턴에 대해 다른 urls.py 파일로 넘겨주는 역할

직접 호출하지 않고 연결

예를 들어 url이 users/singin의 형태로 들어오면 urlpatterns라는 list에서 하나씩 찾게 됨

django App의 urls.py에서 views 함수 호출하기

from django.urls import path
from .views      import PostingView, RePostingView, PostingDeleteView, PostingListView, PostingDetailView, ReplyPostingView

urlpatterns = [
    path('/post', PostingView.as_view()),
    path('/repost/<int:board_id>', RePostingView.as_view()),
    path('/delete/<int:board_id>', PostingDeleteView.as_view()),
    path('/list', PostingListView.as_view()),
    path('/detail/<int:board_id>', PostingDetailView.as_view()),
    path('/reply/<int:board_id>', ReplyPostingView.as_view())
]

path 함수에서 import된 같은 디렉토리의 views.py 파일의 PostingView 클래스의 as_view 함수가 실행되는 것

path 함수의 역할 정리

path(route, view, kwargs=None, name=None)

  1. path('user',include('users.urls'))

django urls의 include를 사용해, 다른 url로 넘겨주어 사용

  1. path('/sign-in',view.SignInView.as_view(),name='login')

특정 패턴을 찾으면 해당 패턴에 대해 view 함수를 호출,

지정한 Template이 있으면 name=''으로 rendering이 가능

models.py

class로 데이터 모델을 작성(django-admin의 makemigration, migrate로 DB 테이블 저장)

from django.db import models
from django.db.models.fields.related import ForeignKey
        
class Board(models.Model):
    title     = models.CharField(max_length=100)
    content   = models.CharField(max_length=500)
    password  = models.CharField(max_length=5000, default=None)
    hits      = models.PositiveIntegerField(default=0)
    groupno   = models.IntegerField(default=0)
    orderno   = models.IntegerField(default=0)
    depth     = models.IntegerField(default=0)
    writer    = models.ForeignKey('users.User', on_delete=models.CASCADE)
    create_at = models.DateTimeField(auto_now_add=True)
    tag       = models.ForeignKey('Tag', on_delete=models.CASCADE)
    
    def __str__(self):
        return '[{}] {}'.format(self.id, self.title)

		class Meta:
        db_table = 'boards'

models.Model 상속하기 때문에 data format을 지정할 수 있다

views.py

urls.py에서 url pattern에 따라 이 view 파일의 함수를 불러오고, models.py에서 정의했던 class들이 import되어 이 데이터를 다룬다.

그리고 컨트롤된 데이터를 통해 Jsonresponse 또는 Httpresponse로 리턴해준다.

view class

class PostingView(View):
    @LoginDecorator
    def post(self, request):
        
        try:
            data = json.loads(request.body)
            
            title   = data['title']
            content = data['content']
            writer  = request.user
            
            if not title or not content:
                return JsonResponse({'message' : 'CHECK_YOUR_INPUT'}, status=400)
            
            if Board.objects.filter(title=title).exists():
                return JsonResponse({'message' : 'SAME_TITLE, CHANGE TITLE'}, status=400)
            
            board = Board(
                title     = title,
                content   = content,
                writer    = writer,
                password  = request.user.password,
                tag       = Tag.objects.get(id=1)
            )
            
            board.save()
            
            board.groupno = board.id
            board.save()

            return JsonResponse({'message' : data}, status=200)
            
        except KeyError:
            return JsonResponse({'message' : 'KEY_ERROR'}, status=400)

각 클래스는 기능 별로 구현되어 있고, API에 따라 함수가 구분된다. 그리고 가장 중요한 것은 이 각각의 class가 View를 상속받는다는 것이다. 이렇게 상속을 받기 때문에 request를 받을 수 있다.

profile
지뢰찾기 개발자

0개의 댓글