본문 바로가기

Programming👩🏻‍💻/Web framework

[Django] 공식문서로 익혀보기 part2 - 데이터베이스 설치

https://docs.djangoproject.com/ko/5.1/intro/tutorial02/

 

1. 데이터베이스 설치

 

프로젝트 디렉토리 mysite/setting.py 파일을 열어보면 일반적인 Python 파일로 Django의 모든 설정들이 Python 변수들로 저장되어 있는 것을 확인하실 수 있습니다.

# settings.py
DEBUG = True
INSTALLED_APPS = [
    'django.contrib.admin',
    'polls',
]
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'db.sqlite3',
    }
}

mysite/settings.py를 편집할 때 현지 시간에 맞춰 TIME_ZONE 값을 설정합니다.

# settings.py

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Seoul'  # 한국 시간 적용 

USE_I18N = True

USE_L10N = True

USE_TZ = False  # False 로 설정해야 DB에 변경 된 TIME_ZONE 이 반영 됨
💡USE_TZ 기본 값은 True로 되어 있는데, False로 변경하는 이유는 models의 datetime 필드에도 변경된 TIME_ZONE 값을 적용 시키기 위함입니다.

 

 

INSTALLED_APPS는 기본적으로 Django에 내장되어 있는 앱들이 정의되어 있습니다.

# settings.py

INSTALLED_APPS = [
    "django.contrib.admin", # Django 관리용 사이트
    "django.contrib.auth", # 인증 시스템
    "django.contrib.contenttypes", # 컨텐츠 타입을 위한 프레임워크
    "django.contrib.sessions", #세션 프레임워크
    "django.contrib.messages", # 메세징 프레임워크
    "django.contrib.staticfiles", # 정적 파일을 관리하는 프레임워크
]

 

INSTALLED_APPS에 기본 어플리케이션들 중에 몇몇은 최소한 하나 이상의 데이터베이스 테이블을 사용하는데, 그러기 위해서 데이터베이스 테이블을 미리 만들어줄 필요가 있습니다. 이 명령어를 실행하지 않으면 no such table에러가 발생하게 됩니다.

터미널에서 아래 명령어를 실행하여 테이블을 생성합니다.

$ python manage.py migarate

 

💡해당 명령어는 INSTALLED_APP에 등록된 각 앱들을 확인하고 settings.py의 migrations 파일들을 참고해서 필요한 데이터베이스 테이블을 실제로 만드는 작업을 수행합니다.

 

2. 모델 만들기

설문 조사 앱에서 Question, Choice 두 가지 모델을 만들어 보겠습니다.

Question에는 질문과 발행일을 위한 두 개의 필드를, 

Choice는 선택 텍스트와 투표 집계를 위한 두 개의 필드를 가집니다.

 

2.1 ORM

이러한 모델 개념은 Python 클래스로 표현합니다.

모델(Model)은 Django와 데이터베이스를 연결시켜주는 코드이며 일반적으로 각각의 모델은 데이터베이스 테이블과 맵핑됩니다.

- 클래스를 사용하는 이유는 데이터베이스 테이블을 Python객체로 표현합니다. (ORM 핵심 특징)

- 파이썬 클래스를 사용하고 모든 모델 클래스는 django.db.models.Model 클래스를 상속받습니다.

- 데이터를 쉽게 생성,수정,삭제할 수 있습니다.

- Django ORM을 통해 SQL없이도 데이터베이스 조작이 가능합니다.

 

💡ORM은 데이터베이스의 테이블을 Python 클래스로 테이블 행을 객체로 컬럼을 클래스 속성으로 매핑합니다. 이것으로 SQL대신 Python 코드로 데이터베이스를 다룰 수 있게 됩니다.

 

데이터베이스 Python 코드의 관계를 예시로 설명하자면,

 

기존 SQL 방식 DB 테이블 정의는

CREATE TABLE Question (
    id INT,
    question_text VARCHAR(200),
    pub_date DATETIME
);

 

ORM에선 Python 클래스에 정의합니다.

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField()

 

 

테이블 행(ROW)은 Python 객체로 정의합니다.

question = Question(
	question_text = "좋아하는 색깔은?",
    	pub_date = datetime.now()
)

 

이렇게 ORM 데이터베이스 구조를 Python 코드로 자연스럽게 변환해줍니다.

 

자, 이제 다시 Question, Choice 테이블을 정의 해보도록 하겠습니다.

 

polls/models.py 파일을 아래와 같이 정의합니다.

# polls/models.py 
from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField("date published")


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

 

Question, Choice는 Django Model 클래스를 상속받아 DB 테이블 구조를 정의합니다.

 

Django에서 models.Model은 모든 데이터베이스 모델의 기본이 되는 클래스로 아래와 같이 기본적인 기능들을 자동으로 사용 가능합니다.

 

  • 데이터베이스 연결
  • CRUD(생성, 읽기, 수정, 삭제) 기능
  • 데이터베이스 쿼리 기능

 

2.2 Field 클래스

모델에 적합한 변수(필드)를 정의합니다.

question_text 필드에서 정의된 models.CharField(max_length=200)와 같은 데이터 타입들은 데이터베이스 컬럼의 타입과 제약 조건을 지정합니다.

models.CharField는 django.db 에서 import한 models 모듈 안에 별도로 정의된 클래스입니다.

 

💡CharField, DateTimeField 클래스는 Field 클래스를 상속받은 자식 클래스이지만, 모두 models 모듈 안에 있어 모듈 전체 임포트를 하였을 때 models.클래스명으로로 접근합니다.

 

이렇게 정의된 필드명은 python 코드에서 객체 속성으로 사용할 수 있으며, DB에서 해당 필드 이름 그대로 데이터베이스 컬럼명으로 사용할 수 있습니다.

💡Field 클래스 생성자에서 첫 번째 인수로 전달되는 값은 인간이 읽기 좋은 텍스트 형태로 표시될 이름입니다. 이 값은 필드 이름을 좀 더 직관적으로 보여줄 필요가 있을 때 사용되며 Django가 해당 필드를 UI(Django 어드민페이지/ Django Form/ 에러 메세지 표기)에서 표현할 때 지정한 텍스트로 표시되게 합니다.
몇몇 Field 클래스들은 "필수 인수"가 필요합니다. 
예를 들어 CharField의 경우 max_length를 입력해 주어야합니다. 이것은 데이터 스키마에서만 필요한 것이 아니라 값을 검증할때도 쓰이는 요소입니다.

 

 

아래와 같이 pub_date의 첫번째 인자에 'date published'라고 정의하였을때

# polls/models.py
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

 

 

admin.py Django 어드민 페이지에 Question 모델에 필드 구조를 명시하고 싶다면 클래스를 생성하여 admin.ModelAdmin을 상속 받아 'list_display'에 필드명을 전달 해주어, admin.site.register에 해당 모델과 모델에 대한 관리자 설정을 담은 클래스를 등록합니다.

# admin.py
from django.contrib import admin
from .models import Question

class QuestionAdmin(admin.ModelAdmin):
    list_display = ('question_text', 'pub_date')  # 리스트에서 표시할 필드 지정

admin.site.register(Question, QuestionAdmin)  # 커스터마이징 설정으로 등록

 

소스코드를 저장 후, 장고 어드민 페이지에서 Questions 모델을 확인 해보면 pub_date에 지정한 라벨이 적용된 것을 확인하실 수 있습니다.

 

2.3 model 클래스의 __str__ 메서드

__str__ 함수는 장고 모델에서 객체를 인간이 읽기 좋은 '문자열' 형태로 표현하기 위해서 사용되는 메서드입니다.

Python의 기본 메서드로 객체를 문자열로 변환할 때 호출되며 장고에서는 특히 관리자 페이지나, 셀에서 모델 인스턴스 출력할 때 __str__메서드를 사용해 객체를 설명합니다.

 

 

Question 모델에서 __str__ 메서드는 아래와 같이 정의되어 있습니다.

# polls/models.py

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

 

이렇게 정의하면 Question 객체가 "문자열"로 변환할 때 question_text 필드 내용으로 반환합니다.

즉, Question 모델의 인스턴스를 출력할 때 question_text 필드 값이 출력됩니다.

 

q = Question(question_text="What's new?", pub_date="2023-01-01")
print(q)  # 출력: What's new?

 

__str__메서드가 사용되는 케이스는 주로 아래와 같습니다.

  • Django 관리자 어드민 페이지
  • 디버깅 및 Django shell
  • print() 함수

3. 모델 활성화

앱을 현재 프로젝트에 포함 시키기 위해서는, 앱의 구성 클래스에 대한 참조를 INSTALLD_APPS 설정에 추가해야 합니다.

PollConfig 클래스는 polls/app.py 파일 내에 존재합니다.

따라서 .으로 구분된 경로는 'polls.apps.PollsConfig'가 됩니다.

mysite/setting.py 파일내 INSTALLED_APPS 설정에 해당 경로를 추가해주시면 됩니다.

 

INSTALLED_APPS = [
    "polls.apps.PollsConfig",
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
]

 

 

이제 polls 앱을 포함하였으니, 터미널에 아래 명령어로 새로 생성된 모델, 혹은 변경된 모델을 migration으로 저장 시키는 것을 django에게 알려줍니다.

 

 $ python manage.py makemigrations polls

 

 

그리고 migrate 명령어로 데이터베이스에 모델과 관련된 테이블을 생성합니다.

$ python manage.py migrate

 

migrate 명령은 아직 적용되지 않은 마이그레이션을 모두 수집해 실행합니다. 변경 사항들과 데이터베이스 스키마 동기화 작업입니다.

데이터베이스를 업데이트 하실 때 아래 3가지 단계를 기억하시면 편할 것 같습니다.

  • (models.py 에서) 모델을 변경합니다.
  • python manage.py makemigrations을 통해 이 변경사항에 대한 마이그레이션을 만드세요.
  • python manage.py migrate 명령을 통해 변경사항을 데이터베이스에 적용하세요.

 

4. Django 어드민

관리자 사이트에 로그인 할 수 있는 사용자를 생성합니다.

$ python manage.py createsuperuser

 

username, email adress (이메일 생략하고 싶을 때는 그냥 엔터를 치시면 됩니다), password 입력으로 계정이 완료됩니다.

 

 

runserver로 서버를 실행하고, 로컬 도메인에 '/admin/'으로 url 이동하면 어드민 페이지를 확인하실 수 있습니다.

$ python manage.py runserver

 

 

 

part 3에서 계속..