본문 바로가기
IT

[프로그래밍] Chap 2. 장고 기본 요소 학습#2 (DB:테이블생성)

by 밤고래 2021. 4. 29.
반응형

안녕하세요. 밤고래에요 :)

이번 페이지에서는 Django의 ORM을 이용해 데이터베이스 베이스 제어하는 법을 다루겠습니다.

최종적으로는 아래와 같이 질문/답변이 가능한 게시판 웹사이트를 구현하고자 합니다.

 

* Django의 ORM(Object Relational Mapping)

ORM은 파이썬으로 데이터 작업을 할 수 있게 해주는 기능이다.

즉, 장고에서는 쿼리문을 몰라도 파이썬을 안다면 데이터를 다룰 수 있다.

쿼리문을 사용하는 전통적인 방식에는 몇 가지 단점이 있다.

 

일반적인 DB 쿼리문

1. 쿼리문은 같은 목적으로 작성해도 개발자마다 다양한 쿼리문이 만들어지므로 통일성이 깨진다

2. 개발자가 쿼리문을 잘못 작성하게 되면 시스템의 성능이 저하될 수 있다.

3. DB를 변경하면(MySQL->오라클) 특정 DB에 의존하는 쿼리문을 모두 수정해야 하므로 유지 보수의 어려움이 있다.

 

하지만 장고의 ORM은 DB의 테이블을 모델화하여 사용하기 때문에 위의 단점이 모두 사라진다.

 

2-2 데이터를 관리하는 모델(p48)

장고는 모델로 데이터를 관리한다.

보통 웹 개발에서는 데이터의 저장/조회를 위해 SQL 쿼리문을 이용하지만,

장고는 SQL 쿼리문을 몰라도 '모델'을 이용하여 데이터를 저장/조회 할 수 있다.

 

[실습] migrate 와 테이블 알아보기(p48)

Step 1. 장고 개발 서버 구동 시 나오는 경고 메시지 살펴보기

모델을 알아보기 위해 python manage.py runserver 명령 실행 시 나오는 경고메시지를 살펴보자.

중간쯤에 있는 경고메시지를 보면 ' 아직 적용되지 않은 18개의 migration이 있다'라고 나와있다.

(You have 18 unapplied migration(s).)

 

이 오류를 해결하려면 python manage.py migrate를 실행해야 한다는 안내가 있다.

 

Step 2. config/settings.py 열어 기본으로 설치된 앱 확인하기

파일을 열어 INSTALLED_APPS 항목을 보자. INSTALLED_APPS는 현재 장고 프로젝트에 설치된 앱이다.

 

 

Step 3. config/settings.py에서 데이터베이스 정보 살펴보기

config/settings.py 파일에는 설치된 앱 뿐만 아니라 사용하는 데이터베이스에 대한 정보도 정의되어 있다.

DATABASES설정 중 default의 'ENGINE' 항목을 보면 데이터 베이스 엔진이 django.db.backends.sqlite3로 정의되어있다.

그리고 'NAME'항목을 보면 데이터베이스는 BASE_DIR에 있는 db.sqlite3이라는 파일에 저장되어있는 것도 알 수 있다.

 

 

Step 4. migrate 명령으로 앱이 필요로 하는 테이블 생성하기

migrate 명령을 실행하여 경고 메시지에 있던 앱들이 필요로 하는 테이블들을 생성하자.

runserver를 중지하고, 'python manage.py migrate'를 입력하면 아래와 같이 출력된다.

 

 

요약은 migrate를 통해 admin, auth, contenttypes, sessions 앱이 사용하는 테이블이 생성된다.

 

Step 5. DB Browser for SQLite로 테이블 살펴보기

SQLite의 GUI 도구인 'DB Brower for SQLite'를 설치하면 데이터베이스의 테이블을 확인할 수 있다.

sqlitebrowser.org/dl에 접속하여 다운로드

 

Step 6. DB Browser for SQLite 살펴보기

설치 후 실행, '데이터베이스 열기 > C:\projects\mysite\db.sqlite3 파일 선택'을 수행하면

아래와 같이 앞에서 만든 테이블을 확인할 수 있다.

 

 

[실습] 모델 만들기

질문/답변 게시판 사이트 'pybo'에서 사용할 모델을 만들어 보자.

 

Step 1. 모델 속성 구상하기

질문 모델에는 다음 속성이 필요하다

 

답변 모델에는 다음 속성이 필요하다

 

Step 2. pybo/models.py에 질문 모델 작성하기

질문 모델은 Question 클래스로 만든다. 

모델을 만들기 전에 pybo/models.py에는 아무런 모델이 정의되어 있지 않다.

 

이 파일에 Question 클래스를 정의해보자

 

 

subject(제목)는 최대 글자수 200자까지 제한하도록 설정하였으며, 

글자수 제한을 하기 위해서는 CharField 함수를 사용해야 한다.'

content(내용)는 글자수 제한이 없는 데이터이다.

create_date와 같은 날짜,시간 관련 속성은 DateTimeField를 사용한다.

 

Step 3. pybo/models.py에 답변 모델 작성하기

 

Anser 모델은 어떤 질문에 대한 답변이므로 Question 모델을 속성으로 가져야 한다. 

이처럼 어떤 모델이 다른 모델을 속성으로 가지면 ForeignKey를 이용한다. 

ForeignKey는 쉽게 말해 다른 모델과의 연결을 의미하며, on_delete=models.CASCADE는 답변에 연결된 질문이 삭제되면 답변도 함께 삭제하라는 의미이다.

 

Step 4. config/setting.py를 열어 pybo 앱 등록하기

Step 1~3 에서 만든 모델을 이용하여 테이블을 생성하자.

테이블 생성을 하려면 config/setting.py 파일에서 INSTALLED_APPS 항목에 pybo 앱을 추가해야 한다.

 

위에서 추가한 pybo.apps.PyboConfig 클래스는 pybo/apps.py 파일에 있는 클래스이다.

 

Step 5. pybo/apps.py 열어 살펴보기

pybo/apps.py 파일을 열어 보자. 이 파일은 pybo 앱을 만들 때 자동으로 생성된 것이다.

 

Step 6. migrate 로 테이블 생성하기

테이블 생성을 위해 migrate 명령을 실행하자

 

Step 7. makemigrations로 테이블 작업 파일 생성하기

그런데 migrate 명령이 제대로 수행되지 않는다...

왜냐하면 모델이 생성되거나 변경된 경우 migrate 명령을 실행하려면 테이블 작업 파일이 필요하고, 

테이블 작업 파일을 만들려면 makemigrations 명령을 실행해야 하기 때문이다.

makemigrations 명령을 먼저 실행하자

 

makemigrations 명령은 장고가 테이블 작업을 수행하기 위한 파일들을 생성한다.

많은 장고 학습자가 makemigrations 명령을 실제 테이블 생성 명령으로 오해하나,

실제 테이블 생성명령은 migrate 이다.

 

Step 8. makemigrations 로 생성된 파일 위치 살펴보기

위 명령을 수행하면, 아래와 같이 0001_initial.py 파일이 자동으로 생성된다.

 

Step 9. makemigrations한번 더 실행해 보기

모델의 변경사항이 없다면, 'No changes detected'라는 메시지만 뜬다.

 

Step 10. migrate 실행하기

이 명령을 실행하면 장고는 등록된 앱에 있는 모델을 참조하여 실제 테이블을 생성한다.

이번 예시로는 생성한 모델 Question 와 Answer 의 실제 테이블이 생성되는 시점이다.

 

Step 11. DB Browser for SQLite 로 생성된 테이블 확인하기

기존에 열려있던 SQLlite 프로그램을 새로고침하려면 F5 키를 누르면된다. 

그러면 위에서 생성한 테이블이 조회가된다!!

 

반응형

댓글