Django

GreenBean·2021년 4월 23일
post-thumbnail

Django

✔ Django App이란?

Django App은 Django에서 사용하는 "파이썬 패키지"이다.

  • Django App 패키지는 그 안에 자신의 모델(model), 뷰(view), 템플릿(template), URL 매핑 등을 독자적으로 가지고 있으며, 일반적으로 하나의 Django 프로젝트는 하나 이상의 Django App으로 구성되어 있다.
  • 규모가 큰 Django 프로젝트는 보통 여러 개의 Django App들을 모듈화하여 구성하는데, 모듈화된 App들로 구성하면 개발 및 유지 보수가 효율적이기 때문이다. 또한 잘 모듈화된 App은 여러 웹 프로젝트에서 쉽게 재사용할 수도 있다.

✔ MTV 패턴

  • Django는 Model, Template, View라는 MTV 패턴을 따르고 있는데, MTV은 MVC (Model View Controller)와 유사한 점이 많다.

  • Django는 Controller의 역활을 Django Framework 자체에서 한다고 보고 있으며, 따라서 MVC와 약간 다른 미묘한 차이를 MTV로 설명하고 있다.

  • MTV에서의 Model데이타를 표현하는데 사용되며, 하나의 모델 클래스는 DB에서 하나의 테이블로 표현된다.

  • MTV의 ViewHTTP Request를 받아 그 결과인 HTTP Response를 리턴하는 컴포넌트로서, Model로부터 데이타를 읽거나 저장할 수 있으며, Template을 호출하여 데이타를 UI상에 표현하도록 할 수 있다.

  • MTV의 Template은 Presentation Logic만을 갖는데 HTML을 생성하는 것을 목적으로 하는 컴포넌트이다.

✔ Django 뷰 (View)

View필요한 데이타를 모델 (혹은 외부)에서 가져와서 적절히 가공하여 웹 페이지 결과를 만들도록 컨트롤하는 역활을 한다.

  • View들은 Django App 안의 views.py 라는 파일에 정의하게 되는데, 각 함수가 하나의 View를 정의한다. 각 View는 HTTP Request를 입력 파라미터로 받아들이고, HTTP Response를 리턴한다.
from django.http import HttpResponse
 
def index(request):
    return HttpResponse("<h1>Hello, World!</h1>")
  • 위의 예제는 하나의 View 함수를 표현한 것인데, 이 함수는 입력으로 항상 request를 받아들이고, response를 리턴하게 된다. View(1) 웹페이지 내용을 갖는 HttpResponse 객체를 리턴하거나 (2) Http404 같은 Exception을 리턴한다. 여기서는 간단한 HTML Text를 포함한 HttpResponse() 객체를 리턴하고 있다. 일반적으로 Django 에서는 좀 더 복잡한 HTML을 처리하기 위해 뷰 템플릿(Template)을 사용한다.
rom django.http import Http404, HttpResponseNotFound
 
def error(request):
    #return HttpResponseNotFound('<h1>not found</h1>')
    raise Http404("Not Found")
  • 또 다른 예제로서 위는 Http404 Exception을 일으키는 것을 예시한 것으로 return이 아닌 raise를 사용함에 주목하자. 비슷한 효과를 내기 위해 HttpResponseNotFound를 사용할 수 있지만, Http404이 좀 더 편리한 기능이다.

✔ Django 템플릿 (Template)

Template은 MVC Framework에서의 View와 비슷한 역활을 한다. 템플릿(Template)은 View로부터 전달된 데이타를 템플릿에 적용하여 Dynamic한 웹페이지를 만드는데 사용된다.

  • Template은 HTML 파일로서 Django App 폴더 밑에 "templates" 라는 서브폴더를 만들고 그 안에 템플릿 파일(*.html)을 생성한다. 이는 단일 App이거나 동일 템플릿명이 없는 경우 사용할 수 있다.
    • 하지만, Django 개발 가이드라인은 "App폴더/templates/App명/템플릿파일" 처럼, 각 App 폴더 밑에 templates 서브폴더를 만들고 다시 그 안에 App명을 사용하여 서브폴더를 만든 후 템플릿 파일을 그 안에 넣기를 권장한다 (예: /home/templates/home/index.html ).
    • 이는 만약 복수의 App들이 동일한 이름의 템플릿을 가진 경우, View에서 잘못된 템플릿을 가져올 수 있기 때문인데, 예를 들어, App1에 create.html이 있고, App2에 동일한 create.html 템플릿이 있는 경우, App2의 View에서 create.html를 지정하면, 처음 App1의 create.html을 사용하게 된다. 이는 템플릿을 찾을 때 자신의 App 내의 템플릿을 먼저 찾는 것이 아니라, 전체 App들의 템플릿 폴더들을 처음부터 순서대로 찾기 때문이다. View에서 "App2/create.html" 과 같이 템플릿명을 지정하면 이런 혼동은 없어진다.
  • 템플릿은 물론 순수하게 HTML로만 쓰여진 Static HTML 파일일 수는 있지만, 거의 대부분의 경우 View로부터 어떤 데이타를 전달받아 HTML 템플릿 안에 그 데이타를 동적으로 치환해서 사용한다.
  • 템플릿 셋팅 : Django에서는 여러 템플릿 엔진을 선택하여 사용할 수 있으며, 이 셋팅은 Django 프로젝트의 settings.py에서 할 수 있다. 디폴트 Django 템플릿 엔진을 사용하기 위해서는 settings.py 파일의 TEMPLATES 섹션에서 BACKEND를 django.template.backends.django.DjangoTemplates 로 설정한다 (기본으로 설정되어 있다).

✔ Django 모델 (Model)

Model데이타 서비스를 제공하는 Layer이다. Django의 Model은 각 Django App안에 기본적으로 생성되는 models.py 모듈 안에 정의하게 된다. models.py 모듈 안에 하나 이상의 모델 클래스를 정의할 수 있으며, 하나의 모델 클래스는 데이타베이스에서 하나의 테이블에 해당된다.

  • Django 모델은 "django.db.models.Model" 의 파생 클래스이며, 모델의 필드클래스의 Attribute로 표현되며 테이블의 컬럼에 해당한다.
    • Primary Key가 지정되지 않으면, 모델에 Primary Key 역활을 하는 id 필드가 자동으로 추가되며 DB 테이블 생성시 자동으로 id 컬럼이 생성된다
  • 모델 클래스는 필드를 정의하기 위해 인스턴스 변수가 아닌 클래스 변수를 사용하는데, 이는 그 변수가 테이블 컬럼의 내용을 갖는 것이 아니라, 테이블의 컬럼 메타 데이타를 정의하는 것이기 때문이다. 필드를 정의하는 각각의 클래스 변수는 models.CharField(), models,IntegerField(), models.DateTimeField(), models.TextField() 등의 각 필드 타입에 맞는 Field 클래스 객체를 생성하여 할당한다. Field 클래스는 여러 종류가 있는데, 생성자 호출시 필요한 옵션들을 지정할 수 있다. 각 Field 클래스마다 반드시 지정해주어야 하는 옵션이 있을 수 있는데, 예를 들어 CharField (와 그 서브클래스들)은 필드의 최대 길이를 나타내는 max_length를 항상 지정해 주어야 한다.

  • 필드 타입 : 모델의 필드에는 다양한 타입들이 있는데, 모든 필드 타입 클래스들은 추상클래스인 "Field" 클래스의 파생클래스들이다. 아래는 주요 필드 타입에 대한 간단한 요약이다.

    • CharField : 제한된 문자열 필드 타입. 최대 길이를 max_length 옵션에 지정해야 한다. 문자열의 특별한 용도에 따라 CharField의 파생클래스로서, 이메일 주소를 체크를 하는 EmailField, IP 주소를 체크를 하는 GenericIPAddressField, 콤마로 정수를 분리한 CommaSeparatedIntegerField, 특정 폴더의 파일 패스를 표현하는 FilePathField, URL을 표현하는 URLField 등이 있다.
    • TextField : 대용량 문자열을 갖는 필드
    • IntegerField : 32 비트 정수형 필드. 정수 사이즈에 따라 BigIntegerField, SmallIntegerField 을 사용할 수도 있다.
    • BooleanField : true/false 필드. Null을 허용하기 위해서는 NullBooleanField를 사용한다.
    • DateTimeField : 날짜와 시간을 갖는 필드. 날짜만 가질 경우는 DateField, 시간만 가질 경우는 TimeField를 사용한다.
    • DecimalField : 소숫점을 갖는 decimal 필드
    • BinaryField : 바이너리 데이타를 저장하는 필드
    • FileField : 파일 업로드 필드
    • ImageField : FileField의 파생클래스로서 이미지 파일인지 체크한다.
    • UUIDField : GUID (UUID)를 저장하는 필드
  • 위와 같은 필드 타입 클래스 이외에, Django 프레임워크는 테이블 간 혹은 필드 간 관계(Relationship)을 표현하기 위해 ForeignKey, ManyToManyField, OneToOneField 클래스를 제공하고 있다. 특히 ForeignKey는 모델 클래스간 (혹은 Underlying 테이블 간) Many-To-One (혹은 One-To-Many) 관계를 표현하기 위해 흔히 사용된다.
  • 필드 옵션 : 모델의 필드는 필드 타입에 따라 여러 옵션(혹은 Argument)를 가질 수 있다. 예를 들어, CharField는 문자열 최대 길이를 의미하는 max_length 라는 옵션을 갖는다. 필드 옵션은 일반적으로 생성자에서 아규먼트로 지정한다. 다음은 모든 필드 타입에 적용 가능한 옵션들 중 자주 사용되는 몇가지를 요약한 것이다.
    - null (Field.null) : null=True이면, Empty 값을 DB에 NULL로 저장한다. DB에서 Null이 허용된다. 예: models.IntegerField(null=True)
    - blank (Field.blank) : blank=False이면, 필드가 Required 필드이다. blank=True이면, Optional 필드이다. 예: models.DateTimeField(blank=True)
    - primary_key (Field.primary_key) : 해당 필드가 Primary Key임을 표시한다. 예: models.CharField(max_length=10, primary_key=True)
    - unique (Field.unique) : 해당 필드가 테이블에서 Unique함을 표시한다. 해당 컬럼에 대해 Unique Index를 생성한다. 예: models.IntegerField(unique=True)
    - default (Field.default) : 필드의 디폴트값을 지정한다. 예: models.CharField(max_length=2, default="WA")
    - db_column (Field.db_column) : 컬럼명은 디폴트로 필드명을 사용하는데, 만약 다르게 쓸 경우 지정한다.

✔ DB Migration

DB Migration : Django에서 Model 클래스를 생성하고 난 후, 해당 모델에 상응하는 테이블을 데이타베이스에서 생성할 수 있다. Python 모델 클래스의 수정(및 생성)을 DB에 적용하는 과정Migration이라 부른다. 이는 Django가 기본적으로 제공하는 ORM (Object-Relational Mapping) 서비스를 통해 진행된다.

  1. settings.py 파일 안의 INSTALLED_APPS 리스트에 (만약 이미 추가되지 않았다면) 해당 Django App (예: feedback)을 추가한다.
  1. 모델 클래스로부터 테이블 스키마를 생성 혹은 수정하기 위하여 아래 명령을 실행한다. 이 명령이 실행되면 해당 Django App 안에 migrations 라는 서브폴더를 만들고 테이블 생성 및 수정을 위한 파이썬 마이크레이션 파일들을 생성한다.
    • $ ./manage.py makemigrations
  1. 모델 클래스로부터 실제 DB에 테이블을 생성하거나 수정하기 위해 아래 명령을 실행한다. 이는 실제 Migration을 DB에 적용하는 명령이다.
    • $ ./manage.py migrate
profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 댓글