[Django] pgAdmin으로 데이터베이스 생성 및 postgreSQL로 ORM하기까지의 모든 여정

느려도 꾸준한 발걸음·2024년 6월 22일
1

Django Web dev

목록 보기
2/12

ORM의 개념을 모르시는 분들이 있을 수도 있으니, 간략히 설명하며 이번 포스팅을 시작하겠습니다. 다만, ORM의 개념을 모르신다면 이번 포스팅을 이해하기 위해 다음의 사항들을 공부하시면 좋습니다.

  • 데이터베이스 이론
  • SQL기본 문법
  • postgreSQL 및 pgAdmin 사용법

ORM이란?

ORM은 Object Relational Mapping의 줄임말이고,
쉽게 설명하면 models.py에 생성해둔 클래스들이 테이블이 되고,
views.py에서 생성한 인스턴스들이 테이블의 데이터가 되는 것입니다.

간단히 말해, 데이터를 데이터베이스에 집어 넣겠단 말입니다.
저희는 데이터를 객체 형태로 관리하고 있으니, 객체를 테이블로 관계사상 해주겠단 의미로 이해해주시면 됩니다.

테이블, 관계사상 등에 대한 사전 지식이 없다면, 데이터베이스 이론과 기본적인 SQL공부를 하고 돌아와주세요!

자 이제 본격적인 여정을 시작해보겠습니다!

[1] pgAdmin DB생성

먼저, pgAdmin에 practice라는 이름으로 데이터베이스를 하나 만들어주겠습니다.

practice라는 이름으로 데이터베이스가 잘 생성되었네요.

참고로, mac을 기준으로 DB 생성 절차는 다음과 같습니다

  • pgAdmin "Servers" 우클릭 후 register > 서버명, 호스트명(저는 localhost), 비밀번호 입력
  • postgreSQL서버 run활성화 여부 확인
  • pgAdmin 새로 등록된 서버 우클릭후 create DB

[2] settings.py파일 데이터베이스 연동 내역 수정

자, 이제 pdAdmin 패널에서 데이터베이스를 생성해주었다면,
생성한 이 데이터베이스를 우리의 Django프로젝트와 연결해줄 시간입니다.

이 연결은 settings.py파일에서 진행해주겠습니다.
settings.py에서 아래의 내용을 찾아주세요.

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

위의 코드는 장고 프로젝트를 생성하면 기본으로 입력되어있는 데이터베이스 관련 설정 코드입니다. Django프로젝트는, 개발자가 변경해주지 않으면 기본적으로 sqlite데이터베이스를 사용하도록 설정되어 있습니다.

저희는 postgresQL데이터베이스를 사용할 것이므로, 이 설정 코드를 다음과 같이 변경해주어야 합니다.

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": "practice",
        "USER": "postgres",
        "PASSWORD": os.getenv('PRACTICE_DB_PW'),
        "HOST": "localhost"
    }
}

데이터베이스 엔진을 postgresql로 바꿔주고,
NAME부분엔 연동할 데이터베이스의 이름을 적어주시면 됩니다!
저는 방금 생성한 practice를 써주었습니다.

USER, PW, HOST도 여러분이 서버를 생성할 때 입력했던 값들을 넣어주면 됩니다.
데이터베이스 비밀번호의 경우, 저는 환경변수에 넣어주었습니다.

[3] psycopg2 설치

Django와 postgreSQL을 연결하려면, psycopg2라는 모듈을 설치해야 합니다.
터미널에 다음과 같이 입력해주세요!
저희가 작업중인 가상환경 터미널에 다음과 같은 명령어를 입력해줍시다

pip install psycopg2

[4] models.py 파일 작성

이제, models.py파일에 있는 클래스를 테이블 형태로 만들어주어야 합니다.
클래스의 프로퍼티가 데이터베이스 테이블의 컬럼이 되게 하려면,
아래와 같이 작성해야 합니다.

참고로, 타입을 전달할 때 소괄호도 함께 적어주지 않으면 컬럼이 되지 않습니다.
저는 다음 포스팅에서 re-migration을 연습하기 위해 의도적으로 user_age와 description 컬럼은 소괄호를 주지 않겠습니다.

from django.db import models

class PremiumMembers(models.Model):
  user_name = models.CharField(max_length=30)
  user_age = models.IntegerField
  description = models.TextField
  profile_img = models.ImageField(upload_to='profile_imgs')

models.py파일의 클래스를 테이블로 매핑하기 위해서는,
클래스 이름 옆에 소괄호를 열고 models.Model을 전달해주어야 합니다.

또한, 일반적인 클래스 선언시와 달리, 프로퍼티와 속성 명을 콜론이 아닌 등호로 연결해야 하며, 타입 역시 CharField, IntegerField등을 사용해야 합니다.

기억하세요! 프로퍼티명과 프로퍼티 값을 등호로 연결해야 각 프로퍼티가 테이블의 컬럼이 된다는 사실!!

[5] ImageField사용을 위한 Pillow설치

컬럼 타입 중, 이미지필드는 Pillow라는 모듈이 없으면 동작하지 않습니다.
예전의 포스팅에서도 다뤘지만, 장고는 정적 자원에 참 박합니다 😅

어쨌든, 작업중인 가상환경 터미널에 빨리 설치를 해줍시다

pip install Pillow

[6] makemigrations 하기

이제 우리가 models.py에 테이블의 컬럼들도 적어주었고,
postgresql과 django를 연결하기 위한 psycopg2등의 도구들도 모두 준비해두었습니다.

이제 정말 우리의 클래스를 pgAdmin에 테이블로 옮길 시간입니다.

이를 위해, 터미널에 다음과 같이 입력해주세요

python manage.py makemigrations 여러분이 생성한 app이름

여기서 app은 여러분이 DB로 옮기고자 하는 models.py파일이 속한 app(폴더) 이름을 적어주시면 됩니다.

그럼, 아마 이런 에러 메세지를 마주하게 되실 겁니다.
"No installed app with label" 이라고 장고 인터프리터가 불만을 토로하네요.

장고에서는 우리가 생성한 모든 app들을 settings.py파일에 등록해주어야 합니다.

[7] settings.py 파일에 마이그레이션 진행할 app등록하기

settings.py 파일을 열어주세요.
그 후에, 아래의 부분이 작성된 부분으로 이동해주세요

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

이 부분에, 여러분이 생성한 app의 이름을 따옴표에 감싸 적어주세요.
만약 이름이 app1이라 가정하면,

INSTALLED_APPS = [
	"app1",
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
]

이런 형태가 되면 됩니다.

이후 다시 터미널에

python manage.py makemigrations 앱이름

을 수행해주면..

다음과 같이 model이 생성되었다고 나오네요.

저는 app이름을 calc로 지었는데, 그냥 아무런 생각 없이 지었습니다.
실제 프로젝트에서는, 보다 구체적이고 무엇과 관련된 계산인지 동료 개발자들이 알 수 있도록 이름을 짓는 것이 중요하지만, 지금은 Django를 연습하는 중이니
네이밍 컨벤션은 잠시 넣어두고 최대한 간결히 하겠습니다.

[8] migration파일 확인

자! 이제 migrations폴더로 가보면, 0001이라는 이름으로 파이썬 파일이 잘 생성되었네요.
참고로 처음 프로젝트를 생성하면, migrations폴더에는 init파일만이 포함되어 있습니다.

파일을 열어 내용을 확인해보겠습니다.

# Generated by Django 5.0.6 on 2024-06-22 06:57

from django.db import migrations, models


class Migration(migrations.Migration):
    initial = True

    dependencies = []

    operations = [
        migrations.CreateModel(
            name="PremiumMembers",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True,
                        primary_key=True,
                        serialize=False,
                        verbose_name="ID",
                    ),
                ),
                ("user_name", models.CharField(max_length=30)),
                ("profile_img", models.ImageField(upload_to="profile_imgs")),
            ],
        ),
    ]

저희가 모델 클래스에 작성했던 컬럼 프로퍼티들이 컬럼으로 잘 들어간 것을 확인할 수 있습니다. 의도적으로 소괄호를 빼먹은 user_age와 description컬럼은 생성되지 않은 것도 확인할 수 있네요.

더불어, id는 migration작업 진행시 자동으로 생성되고, Primary key로 지정된 것을 확인할 수 있습니다.

하지만 아직 우리는 데이터베이스에 테이블을 생성하지 않았습니다.
몇 가지 작업을 더 해주어야 합니다.

[9] sqlmigrate

migration파일이 준비되었다면, 이제 해당 파일을 사용해 정말 DB로 우리의 클래스를 migrate해줄 시간입니다.

터미널에 다음과 같이 입력합니다

python manage.py sqlmigrate 앱이름 migration파일의_숫자

저같은 경우는 python manage.py sqlmigrate calc 0001 이 되겠습니다.

터미널을 확인해보니, 에러 없이 잘 동작한 것을 확인할 수 있습니다.

[10] migrate하기

이제 정말 마지막 단계입니다!
터미널에 다음 명령어를 입력합니다

python manage.py migrate

터미널에 아래와 같은 문구가 나온다면, 정상적으로 작업이 수행된 것입니다.

[11] pgAdmin 테이블 refresh

지금까지의 작업을 완료하고 pgAdmin에 들어가 table을 클릭해도,
우리가 생성한 테이블이 보이지 않습니다.

코딩을 때려칠 심각한 상황은 아니고,
테이블을 우클릭하여 refresh버튼을 눌러 업데이트를 반영해주기만 하면 됩니다.

refresh후 다시 드롭다운 해보면..

야 호! 테이블이 드디어 pgAdmin에 잘 나왔습니다.

그런데, 테이블을 클릭해도 테이블이 나타나지 않네요.
당황하실 필요 없습니다.

원하는 테이블을 우클릭하고, view Data > All Rows를 클릭해줍니다.
그럼 테이블이 나타날 것입니다.

클릭 해보면...

자동으로 생성된 id컬럼과, 저희가 클래스에 정의한 user_name 및 profile_img컬럼이 잘 생성되었네요. user_age와 description컬럼은 models.py 파일에 () 없이 작성했으니 테이블의 컬럼으로 변환되지 않고 있습니다. 이 친구들은 다음 포스팅에서 re-migration이라는 주제로 컬럼으로 마저 바꿔주겠습니다.

데이터 자체는 저희가 생성하지 않았으니 당연히 비어있어야 정상입니다.
생성된 테이블에 데이터를 추가 및 삭제하는 방법은 별도의 포스팅으로 다뤄봅시다.

마무리

드디어 Django프로젝트에 postgreSQL데이터베이스를 연동했습니다!
야 호!

이젠, 생성된 데이터베이스로 CRUD연산을 수행하는 방법만 공부하면 되겠네요.
글이 길어지니, 해당 내용은 다른 포스팅으로 찾아뵙겠습니다.

긴 글 읽어주셔서 감사합니다.

모든 내용은 제가 존경하는 telusko의 navin개발자님의 튜토리얼을 공부하며 익힌 내용입니다.

참고한 영상의 출처: https://www.youtube.com/watch?v=OTmQOjsl0eg

profile
웹 풀스택 개발자를 준비하고 있습니다. MERN스택을 수상하리만큼 사랑합니다.

0개의 댓글