
v1.0: 초기기능 구현 후 배포 과정(3월 14일~) 중의 내용(학습, 이슈)을 기술 함
이전 회사에서 MySQL 입문 강의를 듣고, Django를 학습하면서는 SQLlite3를 사용한 것 외에는 데이터베이스 지식이 없어 걱정했다.
다행히도 배포 과정에서는 단순히 sqllite3 처럼 데이터베이스를 Django 프로젝트에 연결하는 것 뿐이어서 깊은 지식은 필요하지 않았지만 앞으로 데이터 베이스에 대한 공부는 필요하고 특히 PostgreSQL은 Django와 함께 많이 사용되니
이번 배포를 계기로 PostgreSQL에 대한 기본적인 내용을 알아보고 배포과정과 겪었던 이슈들을 정리하겠다.
PostgreSQL을 Django와 함께 사용하는 이유 from GPT
PostgreSQL을 Django와 함께 사용하는 이유와 PostgreSQL의 특징은 다음과 같습니다:
관계형 데이터베이스: PostgreSQL은 관계형 데이터베이스 관리 시스템(RDBMS)으로, 데이터를 테이블 간의 관계로 구성합니다. Django는 ORM(Object-Relational Mapping)을 제공하여 데이터베이스와의 상호 작용을 추상화하므로, PostgreSQL과의 통합이 용이합니다.
확장성: PostgreSQL은 매우 뛰어난 확장성을 제공합니다. 대규모 응용 프로그램에서도 안정적으로 작동하며, 데이터베이스 크기 및 연결 수에 대한 제한이 적습니다.
완전한 기능 세트: PostgreSQL은 많은 고급 기능을 제공합니다. 이에는 다양한 데이터 형식, 트랜잭션, 외래 키, 뷰, 스토어드 프로시저, JSON 지원 등이 포함됩니다. 이러한 기능은 Django 프로젝트에서 데이터베이스 모델을 유연하게 정의하고 조작하는 데 도움이 됩니다.
신뢰성과 안정성: PostgreSQL은 ACID(원자성, 일관성, 고립성, 지속성) 트랜잭션을 준수하여 데이터 일관성과 안정성을 보장합니다. 이는 데이터의 무결성과 신뢰성을 유지하는 데 중요합니다.
확장성 및 고성능: PostgreSQL은 다양한 유형의 쿼리 및 작업 부하를 처리할 수 있는 고성능 데이터베이스입니다. 이는 Django 프로젝트가 성능이 중요한 응용 프로그램에서도 빠르게 실행될 수 있도록 도와줍니다.
오픈 소스 및 커뮤니티 지원: PostgreSQL은 오픈 소스 프로젝트이며, 많은 커뮤니티 멤버 및 지원이 있습니다. 이는 문제 해결, 업데이트 및 보안 패치의 지속적인 제공을 보장하며, Django와의 통합 및 호환성을 유지하는 데 도움이 됩니다.
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
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"),
}
}
SQL_ENGINE = django.db.backends.postgresql
SQL_DATABASE = poko_db_dev
SQL_USER = poko_db_user
SQL_PASSWORD = poko_db_password
docker-compose build
docker-compose up
docker-compose exec web python3 manage.py migrate
docker-compose exec web python3 manage.py supercreateuser
블로그에 다시 내용을 정리하고 보니 사실 대단한 이슈는 아니었는데
당시에는 엄청 머리 아팠던 이슈.
기존의 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 생성이 되지 않았다니까 컨테이너 과정 중 언제 데이터베이스가 생성되는지 생각해 봄.
database "poko_db_dev" does not exist 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 컨테이너를 다시 시작하면 새로운 이름
의 데이터베이스가 생성되고, 문제를 해결할 수 있습니다.