Django 기초 - MVC구조 란?

ID짱재·2021년 7월 13일
0

Django

목록 보기
2/43
post-thumbnail

🌈 MVC구조 란?

🔥 MVC 구조(MTV)

🔥 모델(Model) 이란?

🔥 뷰(View) 란?

🔥 템플릿(Template) 이란?


1. MVC 구조(MTV)

  • Django는 MVC(Model-View-Controller)를 기반으로 한 프레임워크이며, MVC 패턴을 MTV(Model-Template -View)라 부르기도함
  • MTV 패턴이라는 것은 M은 Model, T는 Template, V는 View의 약자를 뜻함
  • Model은 DB에 저장되는 데이터를 의미하고, SQL문을 통해 제어할 수 있으나 Django에서 제공하는 query set을 이용하여 손쉽게 DB를 다룰 수 있음
  • View는 사용자 인터페스와 관련된 부분으로 웹에서 기능하는 로직을 처리하는 역할을 함
  • Template은 사용자에게 보여지는 부분으로 templates 디렉토리에 html파일을 작성하여 제어함
  • 따라서 앱 생성 후 settings.py에 등록하면 Model(models.py)과 View(view.py)는 이미 존재하기 때문에 templates 디렉토리만 수동으로 생성하면, 기본 MVC 패턴을 구성한 것임

2. 모델(Model) 이란?

1) Field 속성

  • Model은 데이터베이스의 테이블을 구축하는 영역으로 class를 통해 각 필드가 가질 속성을 설계함
  • DB의 필드를 정의하기 위해 각 필드마다 어떤 종류의 데이터 타입을 가지는지, 데이터의 길이는 어떻게 제한할지 등의 옵션을 Django의 규칙에 따라 정의함
    • 🔍 models.CharField() : 글자 수가 제한된 텍스트를 정의할 때 사용(이름, 상품명 등..)
    • 🔍 models.TextField() : 글자 수가 제한되지 않은 텍스트를 정의할 때 사용(상품 설명, 내용 등)
    • 🔍 models.IntegerField() : 정수형 데이터 타입을 정의할 때 사용
    • 🔍 models.BooleanField() : 불리언 데이터 타입을 정의할 때 사용
    • 🔍 models.EmailField() : email 데이터 타입을 정의할 때 사용
    • 🔍 models.DateTieField() : 날짜와 시간을 정의할 때 사용
    • 🔍 models.ForeignKey() : 모델 간의 relationship이 필요할 때 사용(일대 다 관계)
# myuser/models.py
from django.db import models
# Create your models here.
class Myuser(models.Model):
    username = models.CharField(max_length=64, verbose_name='사용자명')
    password = models.CharField(max_length=65, verbose_name='비밀번호')
    registered_dttm = models.DateTimeField(auto_now_add=True, verbose_name='등록시간')
    class Meta:
        db_table = 'Community_user' # 테이블명 지정
        verbose_name = '사용자' # admin에서 나타날 별칭 설정
        verbose_name_plural = '사용자' # admin에서 나타날 별칭 설정

2) verbose_name & verbose_name_plural

  • verbose_name은 필드의 별칭을 정하는 것으로 admin에서 익숙한 명칭으로 데이터를 표시하고자 할 때 사용하는 Meta Class의 옵션이임
  • 특히, Django는 테이블명인 Myuser을 Admin Panel에서 자동으로 "s"를 붙여 Myusers로 반환하는데 아래 두 옵션은 별칭에 "s"를 붙여주는데 따라 차이가 존재
    • 🔎 verbose_name="지정할 별칭" 👈 "지정할 별칭 + s" 로 반환
    • 🔎 verbose_name_plural="지정할 별칭" : "지정할 별칭"을 그대로 반환

3) makemigrations & migrate

  • Model을 구성하였으면, 터미널에서 migration을 해주어야 DB에 반영되어 Django가 인식함
  • makimigrations는 Django에서 제공하는 모델의 변경사항들을 감지하고 기록하는 역할을 하고, migrate는 그러한 기록된 파일들과 설정값들을 읽어서 그 변경사항을 db에 저장하는 역할함
  • makemiagrations 뒤에 앱 이름을 적으면 해당 앱만 Model이 변경사항을 감지할 수도 있음
    • 🔍 python manage.py makemigrations
    • 🔍 python manage.py migrate
  • 단, 이미 데이터가 저장된 이후에 필드값이 추가(ex.email)된다면, 이미 저장된 데이터들의 해당 필드를 어떻게 처리할지 결정 필요
  • 위에 처럼 makemigrations를 하면, 2가지 선택사항이 나타나는데 1번은 직접 CLI에서 기본값을 입력해주는 것이고, 2번은 다시 vscode로 돌아가 옵션을 지정해주는 것임

3. 뷰(View) 란?

1) App 별로 urls.py 관리

  • View는 url로 어떠한 요청(request)이 들어왔을 때 해당 url에 해당되는 views.py의 함수가 실행된 해당 로직을 작동시킴
  • 즉, urls.py에 rquest에 따른 views.py의 함수를 지정해두고, views.py 에서는 해당 url이 요청되었을 때 작동할 기능을 구현
  • 프로젝트 생성할 때, url 파일이 settings.py와 같은 레벨에 기본적으로 생성되지만, 여기에 모든 앱에 필요한 url을 선언해두면 유지 보수가 어려움
  • 이에 최초 생성된 urls.py에는 각 요청을 각 App 내의 urls.py로 연동시켜 App별로 관리할 수 있도록 함
# community/community/urls.py
from django.contrib import admin
from django.urls import path, include # 👈 include 가져오기
urlpatterns = [
    path('admin/', admin.site.urls),
    # myuser로 오는 모든 요청은 myuser.urls에서 관리
    path('myuser/', include('myuser.urls')), 
]

2) 해당 Apps의 urls.py에서 처리

  • App을 생성할 때 urls.py가 자동으로 생성되지 않기 때문에 직접 생성 후, views.py의 함수와 연결
# community/myuser/urls.py
from django.urls import path 
from . import views # 👈 현재 디렉토리에서 views.py 가져오기
urlpatterns = [
    # /myuser/register/로 요청이 들어오면, views.py에 register 함수 실행
    path('register/', views.register),
]

3) request에 따른 views.py의 작동

  • 이에 templates 디렉토리에 post_list.html을 생성 후 작성하면, url이 요청되었을 때 화면에 해당 html 결과가 나타나도록 처리함
# myuser/views.py
from django.shortcuts import render
# Create your views here.
def regitser(request): # 👈 register 함수를 요청받으면, 'register.html'를 사용자에게 반환
    return render(request, 'register.html')

4. 템플릿(Template) 이란?

  • 템플릿이란 사용자에게 보여지는 부분으로 templates 디렉토리에 HTML 파일을 만들어 관리
  • Django에 내장된 template 엔진이 templates 디렉토리에 있는 html파일을 계속 주시하다가 request가 요청되 View의 로직이 실행되면 html 파일을 return함
  • form 통해 사용자에게 입력을 받을 때는 보안을 목적으로 form에 "{% csrf_token%}"이 필요
  • method의 경로인 action 값이 .인 이유는 현재 페이지에 전달하기 때문이고, 비어두어도 됨
<!-- community/myuser/register.html -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Register</title>
  </head>
  <body>
    <div class="container">
      <div class="row mt-5">
        <div class="col-12 text-center">
          <h1>회원가입</h1>
        </div>
      </div>
      <div class="row mt-5">
        <div class="col-12">
          <form method="POST" action=".">
            {% csrf_token%}
            <div class="form-group">
              <label for="usrname">사용자 이름</label>
              <input type="text" class="form-control" id="usrname" placeholder="사용자 이름" name="username" />
            </div>
            <div class="form-group">
              <label for="password">비밀번호</label>
              <input type="password" class="form-control" id="password" placeholder="비밀번호" name="password" />
            </div>
            <div class="form-group">
              <label for="re-password">비밀번호 확인</label>
              <input
                type="password"
                class="form-control"
                id="re-password"
                placeholder="비밀번호 확인"
                name="re-password"
              />
            </div>
            <button type="submit" class="btn btn-primary">등록</button>
          </form>
        </div>
      </div>
    </div>
  </body>
</html>

profile
Keep Going, Keep Coding!

0개의 댓글