• Home
  • About
    • Che1's Blog photo

      Che1's Blog

      Che1's Dev Blog

    • Learn More
    • Facebook
    • Instagram
    • Github
    • Steam
    • Youtube
  • Posts
    • All Posts
    • Django
    • Python
    • Front-end
    • Algorithm
    • etc
    • All Tags
  • Projects

[Django Tutorial] Blog 만들기 - 4. 모델 생성

30 Sep 2017

Reading time ~5 minutes

앱을 시작하였으니 이제 앱이 원하는 기능을 하도록 그 내부를 만들어 주어야한다. Django 의 앱은 크게 모델 (Model), 템플릿 (Template), 뷰 (View) 로 구성이 되어 있으며, 앱이 이렇게 구성되도록 하는 개발 패턴을 MTV 패턴이라고 한다. 이에 대해 좀 더 알아보자.


MVC 패턴

어떤 어플리케이션이 모델(Model), 뷰(View), 컨트롤러(Controller) 로 구성되도록 개발하는 방법을 MVC 패턴이라고 한다.

Model-View-Controller (MVC)

모델-뷰-컨트롤러(Model–View–Controller, MVC)는 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴이다. 이 패턴을 성공적으로 사용하면, 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있다. MVC에서 모델은 애플리케이션의 정보(데이터)를 나타내며, 뷰는 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소를 나타내고, 컨트롤러는 데이터와 비즈니스 로직 사이의 상호동작을 관리한다.
출처: 위키피디아

MVC 패턴은 웹 어플리케이션 개발에서 주로 사용되는 디자인 패턴 이다.

디자인 패턴

프로그램 개발에서 자주 나타나는 과제를 해결하기 위한 방법 중 하나로, 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이름을 붙여, 이후에 재이용하기 좋은 형태로 특정의 규약을 묶어서 정리한 것이다.
출처: 위키피디아

MVC 패턴은 웹 어플리케이션을 크게 모델, 뷰,컨트롤러 의 세 부분으로 구분한다.

  • 모델: 데이터베이스나 파일 등의 데이터 소스를 제어한다.
  • 뷰: 모델로부터 제공된 데이터를 반영하여 사용자에게 보여주게 되는 부분이다.
  • 컨트롤러: 사용자의 요청을 파악하여 그에 맞는 데이터를 모델에 의뢰하고, 그것을 뷰에 반영하여 사용자에게 제공한다.

사용자가 컨트롤러 를 조작하면, 컨트롤러 는 모델 을 통해 데이터를 가져오고 그 정보를 뷰 에 반영하여 다시 사용자에게 돌려주게 된다.
웹 어플리케이션이 이와 같은 동작 과정을 가지도록 개발하는 방법론을 MVC 패턴이라고 한다. 이러한 방식으로 개발을 하면 유지보수가 용이하며, 개발 참여자들 간 효율적인 커뮤니케이션이 가능해진다는 이점이 있다.


MTV 패턴

Django 에서는 일반적인 웹 프레임워크들의 MVC 패턴과는 조금 다른 MTV 패턴을 따른다.
MTV 패턴은 모델(Model), 템플릿(Template), 뷰(View) 로 구성되어 있으며, 템플릿이 MVC 의 뷰 역할을 하고, 뷰가 MVC 의 컨트롤러 역할을 담당한다.

  • 모델은 데이터를 표현하는데 사용되며, Python 클래스 형식으로 정의된다. 하나의 모델 클래스는 데이터베이스에서 하나의 테이블로 표현된다.
  • 템플릿은 사용자에게 보여지는 부분만을 담당한다.
  • 뷰는 HTTP Request를 받아 HTTP Response를 리턴하는 컴포넌트로, 모델로부터 데이터를 읽거나 저장할 수 있다.

모델 만들기

먼저 블로그 앱의 모델을 만들어보자.

Models

A model is the single, definitive source of information about your data. It contains the essential fields and behaviors of the data you’re storing. Generally, each model maps to a single database table.
출처: Django 공식 문서

모델은 데이터에 대한 정보를 담고 있으며, 데이터베이스와 직접적으로 연결된다.

  • 모델은 Python 클래스이며, django.db.models.Model 클래스를 상속받는 서브클래스이다.
  • 모델 클래스의 속성들은 데이터베이스의 필드가 된다.
  • Django 는 모델 클래스를 통해 데이터베이스에 접근할 수 있는 API 를 자동적으로 생성해준다.

모델은 blog 폴더 내의 models.py 파일에 클래스 객체를 생성하여 만들 수 있다.

우리가 만들려는 블로그에는 어떤 모델이 필요할까? 블로그가 다루는 데이터에 대해 잠깐 생각해보자.
자신이 쓴 글을 등록하여 열람할 수 있게 하는 것이 블로그의 기본 기능일 것이다. 그렇다면 이 때 데이터는 자신이 쓴 글들이 될 것이다.

그럼 하나의 글은 어떤 구조를 가져야할 까?

  • 가장 기본적으로 글의 제목과 내용이 있어야할 것이다.
  • 또, 글쓴이가 누구인지를 표시해주면 좋을 것 같다.
  • 언제 작성된 글인지 표시해주면 유용할 것이다.

이를 정리하면 다음과 같다.

[글] 
 ├─ 글쓴이  
 ├─ 글 제목  
 ├─ 글 내용  
 └─ 글 생성 시간

블로그 앱의 글 이라는 데이터는 위와 같은 구조를 가진다.
이 내용을 가지고 모델을 작성해보자.

blog 폴더의 models.py 파일을 열어 아래와 같이 작성한다.

from django.conf import settings
from django.db import models


class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL)
    title = models.CharField(max_length=100)
    content = models.TextField(blank=True)
    created_date = models.DateTimeField(auto_now_add=True)
    published_date = models.DateTimeField(blank=True, null=True)

작성글을 뜻하는 Post 라는 이름의 클래스를 하나 생성하였다.
이 클래스는 django.db.models.Model 을 상속받아 모델 클래스가 되었다. 그리고 그 클래스 안에 author (작성자), title (제목), content (글 내용), created_date (글 작성날짜), published_date (글 게시날짜) 라는 속성을 정의하였다. 모델 클래스의 속성은 데이터베이스에서 하나의 필드가 된다.

Post 클래스에 정의된 필드들을 하나씩 살펴보자.


  • author: 작성자
    author = models.ForeignKey(settings.AUTH_USER_MODEL)
    

models.ForeignKey 는 필드를 외래키로 만들며, 이는 다른 테이블과 연결됨을 뜻한다.
models.ForeignKey 는 기본적으로 일 대 다 (many-to-one) 관계이며, 연결 대상이 되는 테이블을 인자로 받는다.
그 외에 다른 여러 옵션을 인자로 전달하여 관계에 대한 자세한 정의를 내릴 수 있다.
settings.AUTH_USER_MODEL 은 Django 에 기본적으로 내장된 유저 모델이다. 글들이 작성자 목록 테이블에 연결되도록 settings.AUTH_USER_MODEL 를 외래키의 인자로 전달하였다.


  • title: 글 제목
    title = models.CharField(max_length=100)
    

models.CharField 는 글자 수가 제한된 텍스트 필드를 뜻한다. 글 제목과 같이 짧은 문자열 정보를 저장할 때 사용한다. 필수적으로 제한할 최대 글자 수인 max_length 를 인자로 받는다. max_length=100은 100자까지 허용하도록 설정한 것이다.


  • content: 글 내용
    content = models.TextField(blank=True)
    

    models.TextField 는 많은 양의 문자열을 저장하는 필드를 뜻한다.
    blank 옵션은 필드가 비어 있는 경우를 허용하는가에 대한 옵션이다.


  • created_date: 글 작성 날짜
  • published_date: 글 게시 날짜
created_date = models.DateTimeField(auto_now_add=True)
published_date = models.DateTimeField(blank=True, null=True)

models.DateTimeField는 날짜와 시간 필드를 뜻한다. Python의 datetime.date 의 인스턴스로 생성되며 몇 가지 옵션을 인자로 전달할 수 있다.
auto_now_add 옵션은 객체가 처음 생성될 때의 시간을 자동으로 저장하는 옵션이다. 이 옵션은 settings.py 에 설정되어 있는 타임존의 시간을 따른다.
null 은 비어있는 값을 데이터베이스에 NULL 으로 저장할지에 대한 옵션이다.


이리하여 블로그에 필요한 핵심 데이터인 작성글 에 대한 모델을 만들었다. 다음 과정에서는 이 데이터 구조를 사용할 수 있도록 모델을 데이터베이스에 테이블로 적용시켜 보도록 하자.


Tutorial 목차

  • [Django Tutorial] Blog 만들기 - 15. 마무리
  • [Django Tutorial] Blog 만들기 - 14. 기능 추가하기
  • [Django Tutorial] Blog 만들기 - 13. 템플릿 상속
  • [Django Tutorial] Blog 만들기 - 12. 자세히 보기 페이지
  • [Django Tutorial] Blog 만들기 - 11. 스테틱 파일
  • [Django Tutorial] Blog 만들기 - 10. 템플릿 언어
  • [Django Tutorial] Blog 만들기 - 9. ORM
  • [Django Tutorial] Blog 만들기 - 8. 템플릿
  • [Django Tutorial] Blog 만들기 - 7. 뷰
  • [Django Tutorial] Blog 만들기 - 6. 관리자 페이지
  • [Django Tutorial] Blog 만들기 - 5. 데이터베이스
  • [Django Tutorial] Blog 만들기 - 4. 모델 생성
  • [Django Tutorial] Blog 만들기 - 3. 앱
  • [Django Tutorial] Blog 만들기 - 2. 프로젝트 시작
  • [Django Tutorial] Blog 만들기 - 1. 환경설정

Reference

이한영 강사님 강의자료
Djangogirls: https://tutorial.djangogirls.org/ko/
Django 공식문서: https://docs.djangoproject.com/en/1.11/topics/db/models/
예제로 배우는 Python 프로그래밍: http://pythonstudy.xyz/python/article/308-Django-%EB%AA%A8%EB%8D%B8-Model



DjangoTutorialModel Share Tweet +1