Django : python으로 웹서비스 개발하기(4) - 데이터베이스 연동하기

harry jang·2023년 7월 5일
0

Django

목록 보기
4/12
post-thumbnail

데이터베이스 설치

데이터베이스를 연동하려면 test_project/settings.py 파일을 수정해야 합니다.
이 파일은 Django 설정을 모듈 변수로 표현한 Python 모듈입니다.
아래 코드와 같이 디폴트로 SQLite를 사용하도록 구성되어 있습니다.

...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
...

실습용으로는 SQLite를 그대로 사용해도 무방하지만, 실제 프로젝트를 시작할 때에는 PostgreSQL, MariaDB, MySQL등의 좀 더 확장성 있는 데이터베이스를 사용하는 것이 좋습니다.
다른 데이터베이스를 사용해보고 싶다면 데이터베이스에 맞는 각 데이터베이스 바인딩을 설치하고, settings.py의 DATABASES 'default' 항목의 값을 다음의 키 값으로 바꿔줍니다.

  • ENGINE : 'django.db.backends.sqlite3', 'django.db.backends.postgresql', 'django.db.backends.mysql', 또는 'django.db.backends.oracle'. 그외에 서드파티 백엔드 참조
  • NAME : 데이터베이스의 이름으로 SQLite를 사용하는 경우에는 컴퓨터의 파일을 데이터베이스로 사용하므로, 이 경우에는 파일 이름을 포함한 해당 파일의 전체 절대 경로로 입력해줘야 합니다.

SQLite 외의 DB를 사용하는 경우 아래 예시와 같이 USER, PASSWORD, HOST와 같은 추가 설정이 반드시 필요합니다.
자세한 내용은 해당 페이지를 참고바랍니다.

# postgresql 사용할 경우
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": "mydatabase",
        "USER": "mydatabaseuser",
        "PASSWORD": "mypassword",
        "HOST": "127.0.0.1",
        "PORT": "5432",
    }
}

스키마 생성
SQLite를 사용한다면 필요할 때마다 자동으로 데이터베이스 파일이 생성됩니다.
하지만 SQLite 이외의 데이터베이스를 사용한다면 별도로 데이터베이스를 미리 생성해 놓아야 합니다.
사용하는 데이터베이스에 접속하여 아래 명령으로 데이터베이스를 생성할 수 있습니다.

CREATE DATABASE database_name;

또한 test_project/settings.py에 설정된 데이터베이스 사용자가 create database권한이 있는지 확인해야 합니다.
권한이 있어야 테스트 데이터베이스를 자동으로 생성할 수 있습니다.

필자는 MySQL을 연동하여 개발을 진행해 보겠습니다.
먼저 MySQL 워크벤치 등의 프로그램을 통해 DB에 접속한 후 사용할 데이터베이스를 생성해 줍니다.

CREATE SCHEMA `testdb` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin ;

다음으로 MySQL DB와 Django를 연결하려면 mysqlclient가 필요합니다. 다음 명령으로 mysqlclient를 설치해 줍니다.

$ pip install mysqlclient
Collecting mysqlclient
 Downloading mysqlclient-2.2.0.tar.gz (89 kB)
    >━━━━━━━━━━━━━━━━━━━━━━━━━━━━━>━━━━━━━━━━━ 89.5/89.5 kB 1.6 MB/s eta >0:00:00
 Installing build dependencies ... done
 Getting requirements to build wheel ... error
 error: subprocess-exited-with-error
 
 × Getting requirements to build wheel did not > run successfully.
 │ exit code: 1
 ╰─> [24 lines of output]
     /bin/sh: 1: pkg-config: not found
     /bin/sh: 1: pkg-config: not found
     Trying pkg-config --exists mysqlclient
     Command 'pkg-config --exists mysqlclient' > returned non-zero exit status 127.
     Trying pkg-config --exists mariadb
     Command 'pkg-config --exists mariadb' returned non-zero exit status 127.

만약 이런 에러가 발생했다면 필요한 패키지들이 없어서 발생하는 것이므로 다음 패키지들을 설치해 줍니다.

$ sudo apt-get install python3-dev libmysqlclient-dev build-essential pkg-config -y

mysqlclient 설치가 완료되었다면 settings.py를 수정해줍니다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'testdb',
        'USER': 'root',
        'PASSWORD': 'xxxx',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

수정을 마치고 연결이 잘 되는지 Django 서버를 실행해 봅시다.

$ python manage.py runserver
❯ python manage.py runserver
 Watching for file changes with StatReloader
 Performing system checks...

System check identified no issues (0 silenced).

You have 18 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.
July 05, 2023 - 22:52:45
Django version 4.2.2, using settings 'test_project.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

DB연결이 제대로 되지 않으면 runserver 명령어 실행시 에러가 발생하므로, 위와 같은 프롬프트가 뜨고 브라우저에서http://127.0.0.1:8000/로 접근 시 로켓 이미지가 표시된다면 정상적으로 연결이 된 것입니다.

데이터베이스 정상 연동이 확인되었으므로 계속해서 migrate 명령으로 DB 초기화 작업을 시켜줍니다.

$ python manage.py migrate

migrate 명령은 INSTALLED_APPS 설정을 탐색하여, test_app/settings.py의 데이터베이스의 설정과 app 과 함께 제공되는 database migrations에 따라, 필요한 데이터베이스 테이블을 생성합니다.

INSTALLED_APPS
현재 Django 인스턴스에서 활성화된 모든 Django 앱(어플리케이션)의 이름을 담고 있습니다.
앱들은 다수의 프로젝트에서 사용될 수 있고, 다른 프로젝트에서 쉽게 사용될 수 있도록 패키징하여 배포할 수 있습니다.
현재 생성된 Django 프로젝트는 여러 기본 제공되는 앱이 등록되어 있으나 해당 앱들이 불필요하다면 migrate 명령을 실행하기 전에 settings.py내의 INSTALLED_APPS에서 제거할 앱을 주석처리하거나 삭제하시면 됩니다.

migrate 작업 완료 후 다시 서버를 실행하여 정상 연결 여부를 확인합니다. 마찬가지로 에러가 나지 않고 브라우저로 접속시에 로켓 이미지가 노출된다면 정상적으로 연결된 것입니다.

추가로 MySQL 워크벤치 등으로 MySQL DB에 접근하여 기본구성에 필요한 테이블들이 잘 생성되어 있는지 확인하실 수도 있습니다.

다음 포스팅에서는 실제로 테이블에 데이터를 읽고 쓰는 방법에 대해 알아보겠습니다.

profile
software engineer

0개의 댓글