v1.2.0: 배포_PostgreSQL

김의석 ·2024년 3월 21일

Hello! Poko Ver.1

목록 보기
4/20
post-thumbnail

v1.0: 초기기능 구현 후 배포 과정(3월 14일~) 중의 내용(학습, 이슈)을 기술 함

3월 15일

이전 회사에서 MySQL 입문 강의를 듣고, Django를 학습하면서는 SQLlite3를 사용한 것 외에는 데이터베이스 지식이 없어 걱정했다.
다행히도 배포 과정에서는 단순히 sqllite3 처럼 데이터베이스를 Django 프로젝트에 연결하는 것 뿐이어서 깊은 지식은 필요하지 않았지만 앞으로 데이터 베이스에 대한 공부는 필요하고 특히 PostgreSQL은 Django와 함께 많이 사용되니
이번 배포를 계기로 PostgreSQL에 대한 기본적인 내용을 알아보고 배포과정과 겪었던 이슈들을 정리하겠다.

PostgreSQL

PostgreSQL을 Django와 함께 사용하는 이유 from GPT

PostgreSQL을 Django와 함께 사용하는 이유와 PostgreSQL의 특징은 다음과 같습니다:

  1. 관계형 데이터베이스: PostgreSQL은 관계형 데이터베이스 관리 시스템(RDBMS)으로, 데이터를 테이블 간의 관계로 구성합니다. Django는 ORM(Object-Relational Mapping)을 제공하여 데이터베이스와의 상호 작용을 추상화하므로, PostgreSQL과의 통합이 용이합니다.

  2. 확장성: PostgreSQL은 매우 뛰어난 확장성을 제공합니다. 대규모 응용 프로그램에서도 안정적으로 작동하며, 데이터베이스 크기 및 연결 수에 대한 제한이 적습니다.

  3. 완전한 기능 세트: PostgreSQL은 많은 고급 기능을 제공합니다. 이에는 다양한 데이터 형식, 트랜잭션, 외래 키, 뷰, 스토어드 프로시저, JSON 지원 등이 포함됩니다. 이러한 기능은 Django 프로젝트에서 데이터베이스 모델을 유연하게 정의하고 조작하는 데 도움이 됩니다.

  4. 신뢰성과 안정성: PostgreSQL은 ACID(원자성, 일관성, 고립성, 지속성) 트랜잭션을 준수하여 데이터 일관성과 안정성을 보장합니다. 이는 데이터의 무결성과 신뢰성을 유지하는 데 중요합니다.

  5. 확장성 및 고성능: PostgreSQL은 다양한 유형의 쿼리 및 작업 부하를 처리할 수 있는 고성능 데이터베이스입니다. 이는 Django 프로젝트가 성능이 중요한 응용 프로그램에서도 빠르게 실행될 수 있도록 도와줍니다.

  6. 오픈 소스 및 커뮤니티 지원: PostgreSQL은 오픈 소스 프로젝트이며, 많은 커뮤니티 멤버 및 지원이 있습니다. 이는 문제 해결, 업데이트 및 보안 패치의 지속적인 제공을 보장하며, Django와의 통합 및 호환성을 유지하는 데 도움이 됩니다.

컨테이너에서 PostgreSQL 사용 설정하기

docker-compose.yml 수정

  • PostgreSQL 컨테이너를 실행하기 위해 docker-compose.yml을 수정
version: '3'

services:
  web:
    depends_on:
    - db

  db:
    image : postgres:12.0-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=poko_db_user
      - POSTGRES_PASSWORD=poko_db_password
      - POSTGRES_DB=poko_db_dev
  • web이라는 컨테이너는 db 컨테이너가 실행된 이후에 시작해야 하기 때문에 depends_on을 db로 설정한다.
  • volumes를 설정해서 컨테이너가 중단되어도 db 데이터가 사라지지 않게 한다.
  • enviroment에 생성할 db 컨테이너에서 PostgreSQL 사용한기 위한 user,pwd,db_name 지정한다.

settings.py와 .env.dev 파일 수정

DATABASES = {
    "default": {
        "ENGINE": os.environ.get("SQL_ENGINE", "django.db.backends.sqlite3"),
        "NAME": os.environ.get("SQL_DATABASE", os.path.join(BASE_DIR / "db.sqlite3")),
        "USER": os.environ.get("SQL_USER", "user"),
        "PASSWORD": os.environ.get("SQL_PASSWORD", "password"),
        "HOST": os.environ.get("SQL_HOST", "localhost"),
        "PORT": os.environ.get("SQL_PORT", "5432"),
    }
}
  • settings.py가 컨테이너 내에 PostgreSQL을 사용하도록 변경
SQL_ENGINE = django.db.backends.postgresql
SQL_DATABASE =  poko_db_dev
SQL_USER = poko_db_user
SQL_PASSWORD = poko_db_password
  • sttings.py가 참조할 데이터베이스 환경변수를 작성한다.
  • web의 settings.py보다 db 컨테이너가 먼저 실행되어서PostgreSQL의 user,pwd,db_name가 이미 생성 된 상태임을 잊지말자
  • 참고 build 전 python에서 PostgreSQL을 사용할 수 있게 해주는 psycopg2를 install하고 requirements.txt에 추가할 것.

PostgresSQL로 만든 데이터베이스 migration

docker-compose build
docker-compose up
docker-compose exec web python3 manage.py migrate
  • docker-compose.yml, settings.py, .env.dev에 수정이 이루어졌으니 다시 build 후 up 한다.
  • 실행 중인 web 컨테이너를 외부에서 접속한 후 migrate를 통해 django가 PostgreSQL 데이터베이스 테이블을 사용할 수 있게 한다.

데이터베이스 관리 admin 계정생성

docker-compose exec web python3 manage.py supercreateuser

이슈 1

블로그에 다시 내용을 정리하고 보니 사실 대단한 이슈는 아니었는데
당시에는 엄청 머리 아팠던 이슈.
기존의 volume 데이터가 원인이었고
덕분에 db 컨테이너가 어느 시점에 생성되고 settings.py와 연결되는지 생각해 볼 수 있었던 이슈.

database "poko_db_dev" does not exist 에러
2024-03-15 14:47:07.930 UTC [49]
FATAL:  database "poko_db_dev" does not exist
  • web, db 컨테이너는 성공적으로 실행되었으나 database가 존재하지 않다고 함.

  • database 생성이 되지 않았다니까 컨테이너 과정 중 언제 데이터베이스가 생성되는지 생각해 봄.

    • 컨테이너 생성과 동시? 아니면 생성 초기?
    • poko-db-1 컨테이너에 접속하여 조회한 결과
      database "poko_db_dev" does not exist 
    • docker-compose.yml을 통해 psql 컨테이너 생성과 settings.py에서 환경변수를 가져오는 사이의 문제인가?
      • settings.py는 환경변수를 참조하여 db와 연결하는 역할이라 이 오류와 상관없음
      • 그럼 사용자가 지정하는 database 생성 설정에 관여하는 docker compose 파일의 문제일 가능성이 크다.
  • GPT의 답변
    네, 일반적으로 Docker Compose 파일을 사용하여 PostgreSQL 컨테이너를 시작하고 데이터베이스를 생성한 다음, Django 애플리케이션에서 이 데이터베이스에 연결합니다. 이 과정에서는 Docker Compose 파일에 정의된 서비스 이름을 사용하여 데이터베이스에 연결합니다. 그러나 여러 이유로 데이터베이스가 제대로 생성되지 않았을 수 있습니다.

  • 하지만 이슈의 원인은 기존 db의 volume 데이터
    참고 : https://stackoverflow.com/questions/63047392/django-db-utils-operationalerror-fatal-database-library-does-not-exist

이 메시지는 PostgreSQL 컨테이너가 처음 시작될 때 데이터가 없는 경우, POSTGRES_DB 환경 변수에 지정된 이름의 데이터베이스를 생성한다는 것을 설명하고 있습니다.

그러나 이미 볼륨에 데이터베이스가 존재하는 경우(아마도 sqllite3 volumes와 충둘한 듯 보인다.), 새로운 이름의 데이터베이스를 만들어야 합니다.

그래서 이전에 만든 데이터베이스가 저장된 볼륨을 삭제하고, 새로운 이름의 데이터베이스를 생성하기 위해 Docker 컨테이너를 다시 시작해야 합니다.

이를 위한 명령어는 다음과 같습니다:

docker-compose down -v
docker-compose up -d

docker-compose down -v : 현재 실행 중인 Docker 컨테이너를 중지하고 관련된 볼륨도 삭제합니다. "-v" 옵션은 볼륨까지 삭제하도록 지시합니다.

docker-compose up -d : 이 명령어는 Docker Compose 파일에 정의된 서비스를 다시 시작하고, "-d" 옵션은 백그라운드에서 실행하도록 지시합니다.

이러한 명령어를 사용하여 PostgreSQL 컨테이너를 다시 시작하면 새로운 이름
의 데이터베이스가 생성되고, 문제를 해결할 수 있습니다.

이슈 2-models.py의 설계수정

models.py의 수정

profile
널리 이롭게

0개의 댓글