당신은 멋쟁이, 우리는 장고쟁이~

0%

Writing your first Django app, part2 - 1편

데이터베이스 셋업

첫번째 장고앱 만들기 part2 에 대한 포스팅 시작입니다.

튜토리얼은 part1 에서 이어지고, part2 에서는 데이터베이스 셋업과 첫번째 모델 생성 그리고 Django의 자동 생성 어드민 사이트에 대해 소개 합니다.



데이터베이스 셋업하기



mysite/settings.py 파일을 열어줍니다. settings.py 는 Django 설정들을 대표하는 모듈레벨의 변수들을 가지고 있는 일반 파이썬 모듈입니다.



기본값으로 설정되어 있는 데이터베이스는 SQLite 입니다.
만약 데이터베이스 초심자 혹은 그냥 Django 를 시도해 보고 싶은거라면, SQLite 가 가장 쉬운 데이터베이스 사용 선택지 입니다.


SQLite 는 파이썬에 포함되어 있습니다

따라서, 별도로 데이터베이스를 지원하기 위한 설치과정은 없습니다.



그렇지만, 첫번째 실전 프로젝트를 진행할때에는, PostgreSQL 같은 좀더 확장성이 있고 고도의 데이터베이스를 사용하고 싶어질지 모릅니다.


mysite/settings.py 파일을 열면,

아래와 같이 데이터베이스를 설정을 하는 부분이 있습니다.



1
2
3
4
5
6
7
8
9
# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}


데이터베이스 ENGINE 값



  • 사용하고 싶은 데이터베이스 설정에 따라 ENGINE 값을 바꿔줄수 있습니다.
ENGINE 값 데이터베이스
‘django.db.backends.sqlite3’ SQLite
‘django.db.backends.postgresql’ PostgreSQL
‘django.db.backends.mysql’ MySQL
‘django.db.backends.oracle’ Oracle

  • NAME 값은 데이터베이스 이름을 써줍니다. 만약 SQLite 를 사용한다면, 데이터베이스는 컴퓨터에 파일로 존재합니다. 이 경우에 NAME 은 절대 경로로 표시되어야 하고, 파일명을 포함하고 있어야 합니다. 기본값은 os.path.join(BASE_DIR, 'db.sqlite3')이고, 이 파일은 프로젝트 폴더 안에 저장됩니다.

SQLite 를 사용하고 있지 않다면,

USER, PASSWORD 그리고 HOST 같은

추가 설정들이 추가되어야만 합니다.



공식문서 튜토리얼에서는 데이터베이스를 SQLite 를 사용하고 있기 때문에. 다른 데이터베이스 설정에 대해서는 걱정할 필요가 없습니다.



데이터베이스 생성전 확인 사항


TIME_ZONE


튜토리얼에서는 mysite/settings.py 를 수정하는김에, TIME_ZONE 까지 설정하라고 합니다. settings.py 파일을 열면, TIME_ZONE 설정하는 부분이 있는데. 기본값으로 UTC 라고 되어 있습니다.


서울 시간인 Asia/Seoul 로 바꾸어 줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
# Internationalization
# https://docs.djangoproject.com/en/3.0/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Seoul'

USE_I18N = True

USE_L10N = True

USE_TZ = True


INSTALLED_APPS


INSTALLED_APPS 도 유의깊게 보고 가야 합니다. INSTALLED_APPS 는 현재 Django 인스턴스에서 활성화 되어 있는 Django 어플리케이션들의 이름들이 있습니다.


어플리케이션들은 여러 프로젝트들에서 사용될수 있고,

다른 사람들이 프로젝트에 사용할수 있도록 패키지화 해서 배포할수 있습니다.


기본값으로, INSTALLED_APPS는 아래 앱들을 가지고 있습니다.


  • django.contrib.admin - 관리자 사이트. 곧 사용하게 됩니다.
  • django.contrib.auth - 인증 시스템
  • django.contrib.contenttypes - 컨텐트타입을 위한 프레임워크
  • django.contrib.sessions - 세션 프레임워크
  • django.contrib.messages - 메시징 프레임워크
  • django.contrib.staticfiles - 정적파일들을 관리하기 위한 프레임워크

위 어플리케이션들은 공통적인 편의성을 위해 기본값으로 포함되어 있는 어플리케이션들 입니다.



이중 어떤 어플리케이션들은 적어도 하나의 데이터베이스 테이블을 사용합니다.

따라서, 이 앱들을 사용하기 위해서는, 데이터베이스 테이블이 먼저 생성이 되어 있어야 합니다.



데이터베이스 테이블을 생성하기 위해서, 아래 migrate 커맨드를 실행합니다.



데이터베이스 migrate 하기



이전 포스팅부터, 계속 서버를 실행시키면,


아래와 같이 17 unapplied migration 이 있다고 메시지가 뜹니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
python manage.py runserver

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you
apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

April 12, 2020 - 08:29:55
Django version 3.0.5, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.


이 메시지를 자세히 읽어보면, 아래와 같은 사항을 확인 할수 있습니다.


admin, auth, contenttypes, sessions 앱을 정상적으로 실행시키려면

python manage.py migrate 명령어를 실행 합니다.


python manage.py migrate 을 실행 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
python manage.py migrate 

Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying sessions.0001_initial... OK

migrate 커맨드는 mysite/settings.py에 INSTALLED_APPS 설정을 보고,

  • settings.py 파일에 설정된 데이터베이스 설정과,
  • 앱과 딸려온 데이터베이스 마이그레이션에 따라 필요한 데이터베이스 테이블들을 생성합니다.


각각의 마이그레이션의 적용에 따른 메시지들을 볼수 있습니다.

관심이 있으시다면, 커맨드라인에서 데이터베이스에 접속해서 테이블 조회를 할수도 있습니다.

SQLite 의 경우, SQLite 에 접속해서, .schema 라고 치면 조회가 되겠네요.


INSTALLED_APPS 에 있는 기본 앱들은

공통적인 사용을 위해 포함되어 있지만, 모든 사람들이 필요로 하는것들은 아닙니다.

만약 어떤것이든 혹은 전부 필요하지 않다면,

migrate 명령을 실행하기 전에, 해당 앱을 주석처리를 하거나, INSTALLED_APPS 에서 지워줍니다.

migrate 명령어는 오직 INSTALLED_APPS 에 등록된 앱들만 대상으로 migrations 를 실행합니다.



마치며..


  1. 데이터베이스 설정은 settings.py 에 DATABASE 값에 해준다.
  2. python manage.py migrate를 실행해서 INSTALLED_APPS 에 등록된 앱의 동작에 필요한 데이터베이스 테이블들을 생성해준다.

migrate 명령어를 끝내고, runserver를 해보면

이제까지 보였던 17 unapplied migrations 이 있다는 메시지는 더 이상 출력되지 않습니다.


1
2
3
4
5
6
7
8
9
10
python manage.py runserver

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
April 12, 2020 - 08:50:41
Django version 3.0.5, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.