본문 바로가기
개발일지/Django

Django - 잡설과 MVT 패턴 기본 원리와 흐름

by 개발에정착하고싶다 2022. 10. 21.

# intro

기본적으로 django는 이론에 관련된 것이 지나고나면 그냥 주구장창 코드만 짜는 것이고

코드도 한파일 안에서만 짜는 것이 아니라 여기랑 저기랑 이어붙여야하는 특이성이 있기 때문에

이것을 블로깅 한다는 것은 부적합하다고 판단했다.

추후에 코드를 올릴목적으로, 올린코드를 사이트화 하기 위해서 일단 내게 필요했던 것은 github였다.

github도 정말 기본적인 기능에서 유용한기능, 더 나아가서는 왜 쓰이는것인지 이해가 안가는 난해한 기능들이 많았다.

때문에 나에게 지금 당장 필요로하는 기본 기능들에 대해서만 배웠더니 그래도 기본 git은 사용할 수 있게 되었다.

그리고 하나하나씩 github에 포트폴리오 용 코드들을 올리기 시작했다.

https://github.com/daniel4191/portpolio_for_get_biggin_job

 

GitHub - daniel4191/portpolio_for_get_biggin_job

Contribute to daniel4191/portpolio_for_get_biggin_job development by creating an account on GitHub.

github.com

 

django에 대한 기초를 쌓고싶다는 갈망이 django를 배우면 배울수록 더 커져만 갔다.

한국어로 되어있는 책이나 강의는 실속있는것들이 없고, 영어로 되어있고 한국어 자막없는 강의로 듣자니

이해는 되는데 어설프게이해가 되어서 지금은 '아 이런게 있구나'정도로 이해가 되지

그게 왜 돌아가는지 구체적으로는 이해가 안된다.

더 정확히는 영어로 설명하는 것에 대해서 90% 이상 '이해는 된다'근데 그게 한국어처럼 유기적으로 남아있질 않는다.

분명 한국어 강의처럼 설렁설렁 핵심을 생략하는게 아닌데도 말이다.

그래도.. 할 수 있는것 한에서 최선을 다해야지.

 

지금은 '백엔드를 위한 Django REST Framework with 파이썬'이라는 책을 읽고 있는데

장점으로는 필요한 원리 설명이 80쪽 까지는 좋다.

하지만 문제가 있다면 편집이 너무 하자가 심해서 myweb을 mysite로 사용한다던가

아예 말했어야하는데 생략된 것들이 많다.

따라서 출판사에 정오표를 요청하고 보면 그래도 내가 django 봤던 책중에 가장 질이 좋다.

분명 도움이 많이 된다.


django

 

MVT패턴

 

기본적으로 MVT를 다루는 사이클은 ‘앱’안에서 구동이 된다.

라는 점과 구동되는 앱을 전체적으로 가져와서 사용한다는 개념으로 이해해야할 것 같다.

 

#1 models

 

1)

MVT패턴의 첫번째는 models이다.

 

여기서 SQL의 테이블구조를 짜는 느낌이라고 느꼈다.

그리고 이 models는 각 app을 생성할때마다 해당 app에 귀속되는 개념이고

이 models.py에 유의미한 변화 가 있을때, 즉 내가 변경한 사항을 실제로 반영하고 싶을때

python manage.py makemigrations를 해준다.

 

그러면 모델 생성을 해준것이다.

 

이어서 runserver를 해주기 전에

python manage.py migrate

를 해준다.

실질적으로 앞에서 했던 makemigraions를 적용하는 명령어인것 같고

이것을 안해주면 실질적으로 Photo모델에 데이터가 추가될때

no search ~~ 뭐 이런식으로 에러가 뜨더라.


2)

모델 생성을 했으니, admin 페이지에 적용을 해야겠다.

 

from django.contrib import admin
from .models import Photo

# Register your models here.
admin.site.register(Photo)

 

이런식으로 models의 모델을 만들때 클래스 이름을

Photo로 사용했을때 등록을 이렇게 해준다.

 

그러면 admin 페이지에서 봤을때 기본필드인 Grups과 Users필드외에

새로 Photo관리필드가 생길것이다.


#2 template

 

template는

MVT에서 T를 맡고 있는 기능이다.

html, css, javascript등의 기능을 서빙해주는 개념인것같다.

 

보통 app 단위의 폴더안에 templates라고 만들고, 추후 2개 이상의 app이

생성되어서 실행될 경우에 혼란을 방지하기 위해서 templates 폴더안에 다시 app의

이름과 동일한 폴더를 만들고, 거기에 html파일을 만들어 넣는다.


#3 views

 

views는

MVT에서 V를 맡고 있는 것이다.

 

1)

views는 템플릿과 모델 사이에서 이어주는 다리의 역할이라고 한다.


2)

views에서 작성을 한 후에는

app안에 urls.py를 (없으면 생성하고) 작성해준다.

보통은

from django.urls import path
from . import views

urlpatterns = [
    path('', views.photo_list, name = 'photo_list')
]

이런식으로 되며, views에 있는 photo_list 함수를 가져와 쓴다는 의미다.

name은 추후 html 코드작성시 url로 사용된다.


3)

app의 urls.py에 app의 views내용을 입력해주었다면

다음으로는 app urls.py를 프로젝트단위의 urls.py에 등록해주어야 한다.

 

거기는

 

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

urlpatterns = [
    path("admin/", admin.site.urls),
    path('', include('photo.urls'))
]

 

이런식으로 등록해주었다.

 

여기까지만 되어도 페이지 출력이 된다.

python manage.py runserver를 했을때 말이다.


위에까지가 기본 순서였고

더 나아가서는

 

1)

app 내에 있는 templates안의 html 파일을 사용할때

 

<html>
    <head>
        <title>Photo App</title>
    </head>
    <body>
        <h1><a href="">사진 목록 페이지</a></h1>
        <section>
            {% for photo in photos %}
            <div>
                <h2>
                    <a href="">{{ photo.title }}</a>
                </h2>
                <img
                    src="{{ photo.image }}"
                    alt="{{ photo.title }}"
                    width='300'
                />
                <p>{{ photo.price }}원</p>
            </div>
            {% endfor %}            
        </section>
    </body>
</html>

이런식으로 코드를 작성해줄 것이다.

 

그러면 위 html에서 반복문으로 가져오는 photos는 어디서 가져올 것인가?

 

2)

 

해답은 app 단위의 views.py에 코드를 작성해 주는 것으로 가져온다.

 

from django.shortcuts import render
from .models import Photo

# Create your views here.

# photo app안의 templates안에 존재하는 photo라는 html을 가져오라는 명령
# {}안에는 전체를 구성하는 '프로젝트'의 urls.py에서 설정후에 만져주는 것
def photo_list(request):
    # 여기서 쓰이는 photos는 return에 지정해준 html에 뿌려지게 된다.
    photos = Photo.objects.all()
    return render(request, 'photo/photo_list.html', {'photos': photos})