본문으로 바로가기

Django tutorial 끝내기 with mysql - 1

category Project/gist 2019. 6. 25. 23:38

Django를 사용해서 RESTful 방식의 API 서버를 구현해야 할 일이 생겼다. 구글에 Django로 REST 방식의 API 서버를 구축과 관련한 글을 읽어보면 REST Framework를 도입하면 편하게 API를 구현할 수 있다고 추천하고 있다. 하지만 나는 Django 처음 써보기도 하고,  .(Django를 설치한 후에 또 REST framework를 또 설치라니) REST framework를 적용해야 하는 명확한 이유를 찾지 못했다. Django로 개발하는 것과 Django REST Framework를 추가로 설치해 구현하는 차이를 직접 경험해보아야겠다는 생각이 들었다. 그래서 Django의 기본 tutorial를 진행해보고 Django REST framework의 Document를 살펴보면서 간간히 Django에 대해서 기록해둘 만한 내용과 개념들을 블로그에 정리해두기로 했다.


이 포스팅은 Django Document의 튜토리얼을 보면서 진행하였다. 다른 사람이 보고 따라하기 쉽도록 하기 위한 포스팅이 아니기 때문에,  튜토리얼에 명시된 내용은 곧 잘 생략할 예정이다. 대신 찾아보고 이해한 바에 대해서나 튜토리얼을 진행하면서 기록해두고 싶은 내용들을 추가할 예정이다. 예를 들면, Node.js의 Express나 Flask와의 차이점을 발견하면 기록하도록 하겠다.

Start

Virtualenv를 세팅하고 활성화 시켜준 상태에서 프로젝트를 진행한다.

프로젝트와 앱의 차이점을 명확히 알 필요가 있다. 프로젝트는 개발 대상이 되는 전체 프로그램을 말한다. 프로젝트 안에 몇 개의 기능 그룹으로 나누었을 때, 프로젝트 하위의 서브 프로그램을 애플리케이션이라고 말한다. 즉 서브 프로그램인 애플리케이션을 개발하고, 이들을 모아서 프로젝트를 구성하게 되는 것이다. 이런 개념으로 프로젝트 디렉토리와 애플리케이션 디렉토리를 구분하고, 코딩하는 파일도 프로젝트 파일인지 애플리케이션 파일인지 구분해서 적절한 위치에 저장해야 한다. 

...더보기

Django의 이런 개념에서 중요한 점은 하나의 애플리케이션이 여러 개의 프로젝트에 포함될 수 있기 때문에, 애플리케이션ㅇ르 한 번만 개발하고, 이를 다른 프로젝트에 재상요하여 개발의 생산성을 높일 수 있다는 것이다. 애플리케이션 단위로 모아서 프로젝트를 만들고, 프로젝트를 모아서 더 큰 프로젝트를 만들 수 있는 방식으로, 계층적인 웹 프로그램 개발이 가능하다는 장점이 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 가상 환경 세팅
virtualenv venv  
 
# 가상 환경 활성화
source venv/bin/activate 
 
# 장고 설치
pip3 install Django 
 
# Django 버전 확인
Python3 -m Django --version 
 
# app polls 생성하기
python manage.py startapp polls
 
# 파이썬 내장 서버로 실행
python manage.py runsuerver 8080
cs

polls 앱은 아래와 같이 프로젝트 구조가 잡힌다.

migrations는 데이터베이스 변경 사항을 관리하기 위한 디렉토리이다. 데이터베이스에 추가, 삭제, 변경 등이 발생하면 변경 내역을 기록한 파일들이 위치한다. 

1
2
3
4
5
6
7
8
9
polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py
cs

Database setup

Django는 많은 종류의 데이터베이스를 지원하려고 노력하고 있다. 문서에서 보면 Django는 데이터베이스 연결을 유지하고 관리함으로써 효율적으로 Database에 연결할 수 있도록 관리도 가능한 것으로 보인다. 

Django의 기본 Database는 SQLite이다. 앞서 말한 것처럼 다양한 DBMS를 사용하여 프로젝트를 진행할 수도 있다. 튜토리얼을 진행하면서 쓰는 글이지만,  API 서버를 구축 할 때에 MySQL을 사용할 예정이므로 튜토리얼에서도 MySQL을 설치해서 진행하도록 하겠다. (SQLite는 다른 데이터베이스와 많은 차이가 있으므로 상당한 양의 작업을 수행하는 경우, 프로젝션 환경에서 사용할 데이터베이스와 동일한 데이터베이스로 개발하는 것이 좋다.) 현재 Django에서는 MySQL 5.6 이상을 제공하고 있다. (API 서버의 스펙은 Python 3.6.5, Django 2.2.2, MySQL 5.6이 될 예정인 듯 하다.)

MySQL은 여러가지 storage engines가 있는데 기본적으로 InnoDB를 사용한다. InnDB를 가장 추천하는데 이 엔진은 완전 트랜잭션 방식이며 외래키 참조를 지원한다. 그렇지만 자동 증가 카운터는 Auto increment의 값을 기억못하기 때문에 MySQL을 재시작 할 경우에는 다음 id 값은 (가장 큰 ID 값 + 1)이 된다. 이로 인한 실수로 제거된 row의 id값을 재사용하는 일이 생길 수 있으므로 주의해야 한다. (지금 내가 고려할 사항은 아닌듯)

Django에서 MySQL을 사용하려면 DB API driver인 mysqlclient가 필요하다. mysqlclient은 native한 드라이브다. 이 드라이브는 스레드로부터 안전하며 연결 풀링을 제공한다.Django는 DB API driver 외에도 ORM에서 데이터베이스 드라이버에 액세스하기 위한 어댑터가 필요하다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Django 프로젝트에서 Polls라는 앱의 설정사항을 가져올 수 있도록 설정
# mysite/settings.py에서 PollsConfig 추가
INSTALLED_APPS = [
    'polls.apps.PollsConfig',  # 추가
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
 
 
# mysql 설치
brew install mysql
 
# mysql 접속(password 방식으로 사용자 접속)
mysql -u root -p
 
# mysql에서 DATABASE 생성
CREATE DATABASE <dbname> CHARACTER SET utf8;
 
# Django mysql driver 설치
pip3 install mysqlclient
 
# models.py 작성 -> 튜토리얼의 Question, Choice 클래스 작성
 
# polls에게 변경사항을 알려줌
python manage.py makemigrations polls
 
# 변경 사항을 반영함
python manage.py migrate
 
cs

mysql을 설치하고 접속하여 Database를 생성한다. 나는 tutorial로 지었다. settings.py의 DATABASES 변수에서 defalut 값을 sqlite에서 mysql로 DB로 변경한다. 그 다음으로 어떤 database를 사용하는지, user, password, host, port, default_character-set 등을 mysql.cnf 파일에 별도로 저장하고 settings.py에서 읽어와 사용하도록 만든다.( password 처럼 중요한 값들은 별도의 파일에 몰아두고 .gitignore에 따로 저장소에 올라가지 않도록 설정해두면 귀중한 정보가 만천하에 공개되는 위험을 줄일 수 있다)

ㄴ settings.py에서 mysql을 기본으로 설정하고,  OPTIONS을 cnf 파일에서 불러오도록 설정
ㄴ mysql.cnf 파일에 기본 정보들 설정

Django administration

장고에서는 기본적인 Admin 환경을 제공한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Django admin superuser 생성
python manage.py createsuperuser
 
 
# admin.py에 Model 정보 추가
admin.site.register(Question)
admin.site.register(Choice)
 
# 서버 실행
poython manage.py runserver
 
 
# admin 페이지 접속
https://127.0.0.1:8000/admin
cs

Admin 사이트에 접속해보면 Users, Groups 테이블과 내가 생성한 Question, Choice 테이블이 모두 보인다. Django가 왜 풀스택 프레임워크인지 알것 같다. Django가 뭐든 가져다 먹을 수 있는 뷔페라면, flask는 뭐든 사가지고 와서 먹을 수 있는 푸드코트 같다.