개인 프로젝트/Django-mysite

#4 django 의 기본 요소 - Model 작성과 Migration

Scala0114 2021. 8. 11. 17:33

 django 에서는 데이터베이스를 활용하기 위해 ORM(Object Relational Mapping)과 모델(Model)을 사용한다.  ORM 방식을 사용하면 데이터의 모델과 데이터베이스의 데이터를 매핑, 자동으로 SQL문을 생성하는 것으로 사용자가 직접 쿼리문을 작성하지 않아도 데이터의 저장과 조회가 가능하다.  SQL문이 아니라 사용하는 언어의 메소드와 클래스 등을 통해 데이터베이스를 조작할 수 있기 때문에 사용도 편하고 코드의 가독성도 높아진다. 이러한 특성상 DBMS의 교체가 이루어지더라도 프로그램적인 리스크가 매우 적으며 쿼리문을 잘못 작성하여 성능상의 심각한 불이익이 생기는 경우도 줄어든다.  이번에는 django에서 모델과 ORM을 사용하여 데이터베이스를 활용하는 방법을 알아본다.

 

 

1. Migration

 config\settings.py 를 열어보면 위와같은 내용이 있다. 그중 붉은 테두리 안의 내용은 django 프로젝트를 생성하면 자동으로 설치되는 앱(app)들의 목록이다.  이 중 admin, auth, contenttypes, sessions 앱들은 데이터베이스가 필요한 앱이기 때문에 migration을 필요로 한다.  django 에서 migration 이란 모델의 변경 내역을 DB에 적용시키는 것을 의미한다.

모델이 추가/변경 된 후 migration을 실행할 때 마다 migrations 디렉토리에 migration 파일이 생성되고, 이는 그 migration이 발생한 시점의 모델의 구조에 대한 정보를 담고있다.  즉, 모델 구조의 버전관리 시스템이라고 볼 수 있다.

 

config\settings.py 를 좀더 살펴보면 위와같이 데이터베이스에 대한 내용도 있다.  디폴트 엔진은 파이썬에 내장된 SQLite용 모듈인 sqlite3으로 되어있는 것을 확인할 수 있다.  SQLite는 개발용 혹은 소규모 프로젝트용으로 사용되는 가벼운 파일기반 DB이다. 개발중에는 SQLite를 사용하여 빠르게 개발하고 실제 운영할때는 규모있는 DB로 전환하는 것이 일반적인 개발 패턴이라고 한다.  이 부분을 수정하면 사용할 데이터베이스를 변경하거나 패스워드를 설정하는 등이 가능하지만 개발단계이기에 아직은 디폴트로 사용하기로한다. 

 

이제 migrate를 실행하여 현재 데이터베이스를 사용하는 앱들을 위한 테이블을 만든다.

python manage.py migrate

 

 정상적으로 실행됐다면 Applying ~ 으로 시작하는 결과가 여러줄 출력될 것이다.  필자의 경우 이미 실행한 상태이기 때문에 migration이 발생하지 않았다.

 

 

2. 모델 작성

 이제 직접 모델을 만들어볼 시간이다.  먼저 pybo\models.py 에 모델 클래스를 정의한다.

Question 모델은 제목을 나타낼 최대길이 200자의 문자열필드와 내용을 나타낼 텍스트필드, 작성 일시를 나타낼 날짜/시간 필드를 가지며, Answer 모델은 외래키로 Question 모델을 가지며 Question이 삭제될 경우 함께 삭제되고 내용을 나타낼 텍스트 필드와 작성 일시를 나타낼 날짜/시간 필드를 가진다.  모델의 정의에 사용 가능한 다른 필드들에 대한 정보는 django 공식문서(https://docs.djangoproject.com/en/3.0/ref/models/fields/#field-types)에서 확인 가능하다.

 

다음은 데이터베이스 작업을 하기 위해 config\settings.py 파일에서 INSTALLED_APPS 리스트에 pybo.apps.PyboConfig 를 추가해준다.  이렇게 앱을 등록해줘야 데이터베이스 관련 작업을 할 수 있다.

 

 

모델을 작성하고 앱도 등록했으니 이제 pybo를 위한 테이블을 만들 차례이다.  모델이 새로 작성되거나 변경된 경우에는 migrate을 실행하기 전에 makemigrations 명령을 수행할 필요가 있다.

python manage.py makemigrations
python manage.py migrate

 

makemigrations의 경우 모델에 변경사항이 있을 때 실행하면 변경사항의 로그가 출력된다. migrate의 경우 위에서 설명했듯이 Applying~ 으로 시작되는 migration이 적용됐음을 알리는 로그가 출력된다.  필자의 경우 이미 끝나있는 상태이기에 변경사항이 없다는 메시지가 출력되었다.