앞선 포스팅에서 애플리케이션의 뼈대를 만들어 보았습니다. 이제부터는 실제 개발 대상인 애플리케이션을 추가해 나가도록 하겠습니다.
애플리케이션 파일들을 담을 디렉토리와 애플리케이션 개발에 필요한 파일은 이미 만들었습니다. 파일에 우리가 원하는 내용들을 채워주기만 하면 됩니다.
우리가 개발하게 될 애플리케이션의 내용은 설문에 해당하는 질문을 보여주고, 질문에 포함되어 있는 답변 항목에 투표한 후, 투표 결과를 알려주는 예제입니다.
1. Application 개발 - Model 설계
코딩을 시작하기 전, 애플리케이션의 로직을 설계해보도록 하겠습니다. 앞서 말씀드린 예제의 요구사항을 분석한 결과 3개의 페이지에 대한 개발이 필요하다고 생각했습니다.
1. index.html : 최근에 실시한 질문의 리스트를 표시합니다.
2. detail.html : 하나의 질문에 대해 투표할 수 있도록 답변 항목을 보여줍니다.
3. results.html : 질문에 따른 투표 결과를 표시합니다.
위와 같은 요구사항을 반영하여 필요한 테이블을 설계하였습니다.
- 모든 컬럼은 Null을 담을 수 없도록 했습니다.
- PK는 자동 증가 속성으로 저장하였습니다.
- Choice 테이블의 question_id 컬럼은 Question 테이블과 Foreign Key 관계로 연결되도록 했고, 또한 Index를 생성하도록 하였습니다.
< Question Table >
컬럼명 |
타입 |
제약 조건 |
설명 |
id |
integer |
NotNull, PK, AutoIncrement |
Primary Key |
question_text |
varchar(200) |
NotNull |
질문 문장 |
pub_date |
datetime |
NotNull |
질문 생성 시각 |
질문을 저장하는 테이블입니다.
< Choice Table >
컬럼명 |
타입 |
제약 조건 |
설명 |
id |
integer |
NotNull, PK, AutoIncrement |
Primary Key |
choice_text |
varchar(200) |
NotNull |
답변 항목 카운트 |
votes |
integer |
NotNull |
투표 카운트 |
question_id |
integer |
NotNull, FK(Question.id), Index |
Foreign Key |
질문별로 선택용 답변 항목을 저장하는 테이블입니다.
2. Application 개발 - Model 코딩
모델 작업은 데이터베이스에 테이블을 생성하도록 해주는 작업입니다. 다음 순서대로 진행합니다.
1. vi settings.py
2. vi models.py
3. vi admin.py
4. python manage.py makemigrations
5. python manage.py migrate
6. python manage.py runserver
데이터베이스 확인 (settings.py 파일 설정하기)
장고는 기본적으로 SQLite3 데이터베이스 엔진을 사용하도록 지정해줍니다. 만일 MySQL 이나 Oracle 등 다른 데이터베이스로 변경하고 싶다면 settings.py 파일에서 수정해주면 됩니다. settings.py 파일은 프로젝트의 전반적인 사항들을 설정해주는 곳으로, 루트 디렉토리를 포함한 각종 디렉토리의 위치, 로그의 형식, 프로젝트에 포함된 애플리케이션 등이 지정되어 있어서 그 내용에 익숙해질수록 장고의 모습을 이해하는 데 도움이 됩니다.
해당 예제에서는 변경없이 SQLite3 데이터베이스를 사용하여 진행하도록 하기 때문에 설정된 사항을 변경없이 확인만 해보도록 하겠습니다.
$ cd ch3/mysite/
$ vi settings.py
위의 명령어를 입력하여 settings.py 파일을 열고, 중간을 확인해보면 아래와 같이 SQLite3로 데이터베이스가 설정되어 있음을 확인할 수 있습니다.
추가적으로 몇 가지 더 설정하도록 하겠습니다. 첫 번째로, 프로젝트에 포함되는 애플리케이션들은 모두 설정 파일에 지정되어야 합니다. 따라서, 우리가 개발하고 있는 polls 애플리케이션도 다음과 같이 등록해야 합니다. settings.py 파일 중간에 위치한 INSTALLED_APPS 의 대괄호 안에 polls를 입력해줍니다.
INSTALLED_APPS = [
...,
'polls',
]
두 번째로, 타임존이 최초에는 세계표준시로 설정되어 있는데, 한국 시간으로 변경하도록 하겠습니다.
기존 설정 : TIME_ZONE = 'UTC'
바꾼 설정 : TIME_ZONE = 'Asia/Seoul'
테이블 정의 (models.py 파일 설정하기)
앞서 설계한 것처럼, polls 애플리케이션은 Question과 Choice 두 개의 테이블이 필요합니다. 테이블은 models.py 파일에 정의합니다.
$ cd ch3/polls
$ vi models.py
vi 명령을 사용하여 models.py 파일에 들어가면 아무 내용도 적혀 있지 않은 것을 확인할 수 있습니다. 그곳에 테이블을 설계한 내용에 따라 다음과 같이 입력합니다.
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length = 200)
pub_data = models.DateTimeField('data published')
def __str__(self):
return self.question_text # 이 함수는 객체를 스트링으로 표현할 때 사용하는 함수입니다.
나중에 보게 될 Admin 사이트나 장고 쉘 등에서 테이블명을 보여줘야 하는데,
이 함수를 정의하지 않으면 테이블명이 제대로 표시되지 않습니다.
class Choice(models.Model):
question = models.ForeignKey(Question)
choice_text = models.CharField(max_length = 200)
votes = models.IntegerField(default = 0)
def __str__(self):
return self.choice_text
장고에서는 테이블을 하나의 클래스로 정의하고, 테이블의 컬럼은 클래스의 변수(속성)로 매핑합니다. 테이블 클래스는 django.db.models.Model 클래스를 상속받아 정의하고, 각 클래스 변수의 타입도 장고에서 미리 정의된 필드 클래스를 사용합니다.
장고에서 테이블을 설계할 때 몇 가지 유의할 사항은 다음과 같습니다.
- PK는 클래스에 지정해주지 않아도, 장고는 항상 PK에 대한 속성을 Not Null 및 AutoIncrement로, 이름은 테이블명의 소문자를 접두어로하여 자동으로 생성합니다.
- DateTimeField() 필드 클래스에 정의한 date published는 pub_date 컬럼에 대한 레이블 문구입니다. 나중에 설명하는 Admin 사이트에서 해당 문구를 확인할 수 있습니다.
- FK는 항상 다른 테이블의 PK에 연결되므로, Question 클래스의 question_id까지 지정할 필요 없이 Question 클래스만 지정합니다.
Admin 사이트에 테이블 반영 (admin.py 파일 설정하기)
admin 사이트에 접속해보면 현재까지는 장고에서 기본적으로 제공하는 Users, Groups 테이블만 보입니다. 이제 앞서 models.py 파일에서 정의한 테이블도 Admin 사이트에 보이도록 등록하겠습니다.
$ cd ch3/polls
$ vi admin.py
models.py 모듈에서 정의한 Question, Choice 클래스를 import 하고, admin.site.register() 함수를 사용하여 임포트한 클래스를 Admin 사이트에 등록해주면 됩니다. 이와 같이 테이블을 새로 만들때는 models.py 와 admin.py 두 개의 파일을 함께 수정해야 합니다.
from django.contrib import admin
from polls.models import Question, Choice
admin.site.register(Question)
admin.site.register(Choice)
데이터베이스에 변경사항 반영
테이블의 신규 생성, 테이블의 정의 변경 등 데이터베이스에 변경이 필요한 사항이 있으면, 이를 데이터베이스에 실제로 반영해주는 작업을 해야 합니다. 아직까지는 클래스로 테이블 정의만 변경한 상태입니다. 다음 명령으로 변경사항을 데이터베이스에 반영합니다.
$ cd ch3/
$ python manage.py makemigrations # polls/migrations 디렉토리 하위에 마이그레이션 파일들이 생깁니다.
$ python manage.py migrate # migrate 명령이 데이터베이스에 테이블을 생성합니다.
migration 이라는 용어는 장고 1.7 버전부터 사용된 개념으로, 테이블 및 필드의 생성, 삭제, 변경 등과 같이 데이터베이스에 대한 변경사항을 알려주는 정보입니다. 물리적으로는 애플리케이션 디렉토리별로 마이그레이션 파일이 존재합니다. 즉, 우리 예제에서는 polls/migrations 디렉토리 하위에 마이그레이션 파일들이 존재합니다.
지금까지의 작업 확인
지금까지 데이터베이스 관련 사항을 작업하였습니다. 즉, models.py 파일에 테이블을 정의하고 이를 데이터베이스에 반영하는 명령을 실행하였습니다. 또한 테이블을 Admin 사이트에도 등록하였습니다. 지금까지의 작업이 정상적으로 잘 처리되었는지 확인하기 위해 Admin 사이트로 접속해보도록 하겠습니다.
만일 runserver가 실행되지 않았다면, 앞서 설명한 것처럼 runserver를 실행시키고, 브라우저 주소창에 다음과 같이 입력합니다.
$ cd ch3/
$ python manage.py runserver 127.0.0.1:8000
http://127.0.0.1:8000/admin
로그인 화면이 나오게 되는데, superuser를 생성하지 않았다면 다음과 같은 명령을 통해 슈퍼계정을 생성합니다.
$ cd ch3/
$ python manage.py createsuperuser
로그인 화면에서 createsuperuser 명령으로 만든 관리자 Username / Password를 입력하여 로그인하면 다음과 같이 Users, Groups 이외에 우리가 추가한 테이블이 생성되어 있는 것을 확인할 수 있습니다.