Django개발 시작하기 (1), (2)에서는 프로젝트를 만들고 어플리케이션을 만들어 보았다.
테스트로 DBMS로 mysql을 사용할 것이고 django라는 이름의 schema를 사용할 것이므로 다음과 같이 설정하였다.
django에서 알아서 SQL을 만들어 준다. 자세히보면 relation에 관련된 테이블도 보인다.
그렇다면 이번에는 만들어진 어플리케이션에 구현하고 싶은 기능을 구현해보자.
여기서 구현해볼 기능은 웹프로그래밍할때 빼놓지 않고 등장하는 게시판 되겠다.
우선 게시판에 쓰일 DB를 설계해 보자. 매우 간단한 기능의 게시판에 Tag를 넣을 수 있게 한다고 가정하고 DB를 설계해 보았다.
title [제목]
content [내용]
created [생성일]
updated [수정일]
tags [Tag]
프레임워크를 쓰지 않는다면 설계된 DB를 가지고 자기가 사용할 DB에 Table을 만들고 DB의 엔티티에 해당하는 값들을 관리하기 위해 데이터 관리 클래스를 만들고 또 이를 DB에 넣고, 수정하고, 지우는 등의 기능을 하는 함수들을 만들어야 할 것이다. 하지만 Django에서는 모델을 만들어 놓고 DB를 설정해주면 테이블을 만들고 데이터를 관리하는 일들을 프레임워크에서 대신해준다. 프로젝트 핵심내용과 관련없는 일들을 대폭줄여주기 때문에 프로젝트에서 중요한 일들에 전념할 수 있게 해줘 개발속도를 빠르게 하고 버그를 줄여주는 것은 말하지 않아도 당연한 결과일 것이다. 그럼 모델링을 어떻게 하는가를 보도록 하자.content [내용]
created [생성일]
updated [수정일]
tags [Tag]
만들어 놓은 어플리케이션 폴더로 가면 models.py가 있다. 이 파일을 열어서 보면 다음과 같은 내용이 있다.
from django.db import models
# Create your models here.
여기서 from django.db import models는 django가 설치되어 있는 곳에 있는 곳의 django/db라는 폴더에서 models라는 디렉토리의 모든 Python파일을 가져오라는 뜻이다. models에는 django가 제공하는 DB관련된 라이브러리 들이 있고 이를 사용해서 Django에서 DB관련된 지원을 해주는 것이다. 이를 이용해서 위에서 설계한 DB를 django model로 만들어 보자.# Create your models here.
from django.db import models
# Create your models here.
class TagModel(models.Model):
class FreeBoard(models.Model):
# Create your models here.
class TagModel(models.Model):
title = models.CharField(maxlength=20, null=False)
class FreeBoard(models.Model):
title = models.CharField(maxlength=80, null=False)
content = models.TextField(null=False)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
tags = models.ManyToManyField(TagModel)
DB를 한 번이라도 설계 해보신 분이라면 Unique Key값을 하는 녀석이 없다는걸 눈치챌 것이다. 이는 Django에서 id라는 이름으로 일련번호를 자동으로 만들어 주기 때문이니 걱정하지 않아도 된다. 모델을 만들때에는 class 모델이름(models.Model)과 같이 선언하면 된다. TagModel은 우선 넘어가고 FreeBoard부터 살펴보도록 하자. FreeBoard의 처음에는 title을 선언했다. title은 models.CharField로 선언되어 있는데 일반적으로 django에서는 문자형을 CharField와 TextField로 나타낸다. CharField는 256byte이하의 문자열을 저장하고 TextField는 그보다 긴 문자열을 저장하는데 사용된다. 필드에 관해 자세히 알고 싶으면 이곳을 방문하면 된다. title속성은 256byte이상이 필요없기 때문에 CharField를 사용한다.
CharField의 파라미터로는 maxlength와 null이 있다. maxlength는 최대값을 설정하는 것이고 null은 해당 엔티티의 null허용 여부를 나타낸다. 예제에서 title은 null을 허용하지 않는 80자 제한의 문자열로 선언되었다. content는 null을 허용하지 않는 TextField로 선언 되었다. 그 다음은 created와 updated인데 이는 각각 생성된 시각과 최근 수정된 시각을 저장할 것이다. 이 둘은 DateTimeField로 선언되어 있고 이는 django에서 시간을 나타내기 위해 제공되는 자료형이다. 시간과 같은 엔티티는 별로의 데이터를 받아서 저장하는 것 보다는컬럼이 저장될때 자동으로 갱신되면 구현이 편해질 것이다. 그렇기 때문에 django에서는 자동으로 시간을 갱신하는걸 지원하는데 이게 DateTimeField의 옵션에 보이는 auto_now_add와 auto_now옵션이다.
auto_now_add: 데이터가 처음만들어 질 때(insert 할 때)
auto_now: 데이터가 저장될 때(update 할 때)
auto_now: 데이터가 저장될 때(update 할 때)
다음으로 오는 tags는 ManyToManyField라는 필드로 선언되어 있다. ManyToManyField는 무엇일까? 바로 DB를 배우다 보면 나오는 Entity-Relation Model에서 나오는 1:1, 1:N, N:N관계를 django에서 추상화하여 제공하는 것이다. django에서 제공하는 Relation모델은 다음과 같다.
OneToOneField: 1:1 Relation
ForeignKey: 1:N Relation
ManyToManyField: N:N Relation
ForeignKey: 1:N Relation
ManyToManyField: N:N Relation
우리가 만들 게시판에서 Tag는 N:N관계를 가지기 때문에 위에서는 ManyToManyField로 선언하였다.
그 다음은 쉽게 유추할 수 있을 것이다. tags = models.ManyToManyField(TagModel)은 위에서 선언한 TagModel모델과 FreeBoard모델을 N:N으로 묶어 주는 것이다. 물론 따로 테이블을 만들어서 관리를 해도 되지만 django에서는 ManyToManyField로 선언만 해주면 FreeBoard테이블과 TagModel테이블 그리고 FreeBoard테이블의 tags와 TagModel의 연결을 관리하는 테이블이 따로 생성이 된다. 우리는 이 테이블에 대해서 더 이상 신경쓰지 않고 django에게 관리는 맡기면 된다.
위에서 했던 내용을 잘 따라했다면 프로젝트에 DB를 설정하고 우리가 정의한 모델과 DB동기화를 시켜보자. 프로젝트에 DB를 설정하기 위해서는 프로젝트 폴더 아래에 있는 settings.py를 수정하여야 한다. settings.py 윗 부분을 보면 다음과 같은 항목들이 있다.
DATABASE_ENGINE = '' # oracle, mysql과 같은 DB Engine이름
DATABASE_NAME = '' # DB에서 사용할 Schema 이름
DATABASE_USER= '' # 사용자
DATABASE_PASSWORD = '' # 비밀번호
DATABASE_HOST = '' # DB의 IP주소 (공백으로 놔두면 localhost)
DATABASE_PORT = '' # DB의 port번호 (공백으로 놔두면 default port:3306)
DATABASE_NAME = '' # DB에서 사용할 Schema 이름
DATABASE_USER= '' # 사용자
DATABASE_PASSWORD = '' # 비밀번호
DATABASE_HOST = '' # DB의 IP주소 (공백으로 놔두면 localhost)
DATABASE_PORT = '' # DB의 port번호 (공백으로 놔두면 default port:3306)
DATABASE_ENGINE = 'mysql'
DATABASE_NAME = 'django'
...
DATABASE_NAME = 'django'
...
설정이 끝났으면 모델을 제대로 만들었는지 확인해보자. 확인하는 방법은 manage.py를 이용해서 SQL문을 만들어 봐서 에러없이 SQL이 잘 만들어지는지 확인하면 된다.
./manage.py sql FreeBoard
문제가 없다면 에러없이 SQL문이 생성되는걸 볼 수 있다. 난 자꾸에러가나서 확인해봤더니 mysql과 python을 연결해주는게 없어서 mysqldb관련 에러가 났었다. apt-get install python-mysqldb로 문제 해결.
위에서 했던 ./manage.py sql FreeBoard는 단지 SQL만 만들어주기 때문에 실제 DB에 테이블이 생성이 되는 것은 아니다. 그렇기 때문에 실제 DB와 동기화를 시키려면 다음과 같이 하면 된다.
./manage.py syncdb
위의 명령어를 입력하면 테이블이 실제 DB에 생성이 될 것이다. DB관리툴로 들어가서 확인해보면 Table이 생성된 것도 볼 수 있다. 만약 처음 syncdb를 실행한다면 다음과 같은 메시지가 나온다.
You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no)
내용 그대로 Diango의 인증 시스템에서 사용할 관리자를 만들거냐는 것이다. 다음에 사용할 일이 있으니 우선 계정을 하나 만들어 놓자.

