Django 기반 웹 앱에 PostgreSQL DB 연결하기

jayhwang·2024년 2월 29일
0

개요

장고는 기본 DB 로 sqlite 를 사용한다. 이 글에서는 장고 로컬 개발 환경에서 sqlite 서버를 postgres DB 로 전환하는 방법을 설명한다. 로컬 환경 설정은 다음과 같다. 로컬 환경의 OS 는 윈도우 기반이며, postgres 는 직접 설치하지 않고 도커 이미지를 사용한다. (이미 도커는 설치되어 있다고 가정한다.)

1. Postgres 컨테이너 띄우기

1.1. 도커 이미지 가져오기

docker pull postgres
docker images
  • 이미지가 잘 다운받아졌는지 확인한다.

1.2. 도커 이미지 실행하기

docker run --name test-postgres \
-p 5432:5432 \
-e POSTGRES_USER=testuser \
-e POSTGRES_PASSWORD=testpassword \
-d \
postgres
  • --name: 실행할 컨테이너 이름 \rightarrow test-postgres
  • -p: 호스트 포트 연결 hostPort:containerPort \rightarrow 5432:5432
    • 호스트의 포트 5432 로 접속하면 자동으로 컨테이너의 포트 5432로 포워딩 해준다.
  • -e: 환경 변수 설정
    • POSTGRES_USER: DB 루트 아이디 설정 \rightarrow testuser
      • 아이디 설정을 하지 않을경우 자동으로 postgres 로 설정된다.
    • POSTGRES_PASSWORD: DB 루트 비밀번호 설정 \rightarrow testpassword
  • -d: 컨테이너 실행을 백그라운드로 돌리고 호스트 쉘을 계속 사용할수 있도록 함 (detach)
  • postgres: 컨테이너가 참조할 도커 이미지 이름
  • 더 자세한 정보는 공식 페이지 에 자세히 나와있다.
docker start test-postgres
  • 맨위의 명령어는 처음에 이미지로부터 컨테이너를 생성할때만 사용해주면 되고, 이후 부터는 간단하게 컨테이너 이름만 지정해주면 된다.
docker ps {--all}
  • 실행중인 컨테이너 목록에 test-postgres 가 있는지 확인
  • --all 실행에 관계없이 모든 컨테이너 목록을 확인

2. DB 서버 접속 및 데이터 베이스 만들기

2.1. 실행중인 도커 컨테이너로 들어가기

docker exec -it test-postgres bash
  • test-postgres 컨테이너 내부에서 bash shell 을 실행

2.2. DB 서버 접속하기

root@id:/# psql -U testuser
  • 맨 처음에 설정한 username 인 testuser 로 DB 에 접속

컨테이너 shell 에서 나오고 싶다면 exit

2.2.a 현재 DB 서버 내에 존재하는 DB 확인하기

testuser=# \list
  • \list or \l: 클러스터 (서버) 내에 존재하는 DB 목록 확인

2.3. Django 프로젝트를 위한 새로운 DB 생성하기

testuser=# CREATE DATABASE djangotest OWNER testuser;
  • DB 이름은 djangotest 이고, 소유자는 서버 소유자와 동일한 testuser 로 설정하였다.

2.4. 생성한 DB 로 접속하기

testuser=# \c djangotest
You are now connected to database "djangotest" as user "testuser".
  • \c {db 이름}: DB 접속하기
testuser=# \dt
Did not find any relations.
  • \dt: 테이블 목록 출력
  • 아직 테이블을 생성하지 않았기 때문에 테이블 목록을 출력해도 아무것도 나오지 않는다.

postgres shell 에서 나오고 싶다면 \q 명령어를 사용하면 된다.

3. Django 앱과 DB 연결하기

3.1. psycopg2-binary 설치하기

psycopg2 는 장고 서버와 postgres 서버간 통신을 위해 필요한 드라이버라고 보면 된다. binary 버전을 설치하는 이유는 이미 바이너리화 되어있는 패키지 이므로 추가적으로 빌드할 필요가 없고, 따라서 플랫폼이나 OS 에 따른 의존성을 가지지 않기 때문이다.

pip install psycopg2-binary

3.2. 앱의 settings.py 수정하기

기존 settings.pyDATABASES 부분은 다음과 같이 sqlite 기반으로 설정되어있다.

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

이 설정을 postgres 에 맞춰서 바꿔주기만 하면 된다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'djangotest',
        'USER': 'testuser',
        'PASSWORD': 'testpassword',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}
  • NAME: 위에서 만든 DB 이름
  • USER, PASSWORD: docker run 할때 환경 변수로 설정했던 유저이름과 비밀번호
  • HOST: 도커를 장고앱과 동일한 기기에서 띄웠다면 localhost, 외부 클라우드 인스턴스를 사용한다면 그것의 public ip 또는 domain name
  • PORT: docker run 할때 설정했던 호스트 포트 번호

3.3. Django DB 마이그레이션 하기

[주의]

  • DB 서비스 자체를 바꾸는 것이기 때문에 기존에 sqlite DB 내부에 있던 데이터는 옮겨와지지않는다. 따라서 기존에 존재하던 데이터 (글, 유저 등) 없이 새로 시작하게된다.
  • 기존과 동일하게 각 세부 app 의 models.py 내부에 정의된 스키마를 바탕으로 테이블이 생성된다.
# 장고 프로젝트 폴더 내에서
python manage.py makemigrations
python manage.py migrate
  • makemigrations: DB, 모델 세팅에서 변경된 코드를 반영하여 migration 파일 을 생성
    • models.py 에 변경이 없고, settings.py 만 변경된 경우라면 하지 않아도 무방하다.
  • migrate: 생성한 migration 파일을 실제 DB 에 반영

3.4. superuser 만들기

새로운 DB 로 넘어오면서 장고 기본 user 테이블에 있던 admin 계정 정보가 없으므로 더이상 사용할수 없다. Django admin 을 사용하기 위해서는 새로 superuser 를 만들어 주어야 한다.

python manage.py createsuperuser
Username: test
Email address: test@email.com
Password: 
Password (again): 
Superuser created successfully.
  • createsuperuser: 장고 어드민 패널 사용이 가능한 관리자 권한 유저 생성

3.4.a. 유저가 잘 생성 되었는지 확인하기

Django 에서는 auth_user 라는 테이블에 유저정보를 저장한다. 따라서 위에서 생성했던 djangotest DB 로 연결한 후, 쿼리를 전송하면 유저정보를 볼 수 있다.

# DB 연결
testuser=# \c djangotest

# 쿼리
testuser=#  select id, is_superuser, username from auth_user where username = 'test';

# 결과
 id | is_superuser |  username
----+--------------+-------------
  1 | t            |  test
(1 row)
  • 생성한 usernametest 였기 때문에 그에 맞는 row 만 가져온 것이다.
    결과가 잘 나왔다면 유저가 잘 생성된 것이다.

3.4.b. Django admin panel 에서 확인하기

python manage.py runserver
  • 개발서버를 돌리고
  • localhost:8000/admin 에 접속해서 방금 생성한 superuser 의 username 과 password 로 로그인 하면 성공

이제 연동이 완료되었으므로 데이터가 자동으로 postgres DB 에 저장 및 관리될 것이다.

Appendix

도커 컨데이너 끄는 법

개발을 하지않을때는 컨테이너를 중지 (start 의 반대) 시켜놓는 것이 리소스 관리에 좋다.

docker stop {컨테이너 이름}

시스템 (Linux, WSL 포함) 에서 도커 자체를 끄는것도 가능하다.

  • 도커 자체를 끄기 전에는 당연히 모든 running 컨테이너 들을 중지해야한다.
sudo systemctl stop docker.socket
sudo systemctl stop docker

반대로 도커 자체를 킬때는 이 명령어를 사용하면 된다.

sudo systemctl enable docker
sudo systemctl start docker

GUI 로 쉽게 하려면?

  • docker desktop 을 설치해서 사용하면, GUI 환경에서 이미지를 받고 컨테이너 생성 및 관리를 직관적으로 할수 있다.
  • pgAdmin 을 사용하면 명령어와 쿼리 없이도 GUI 기반 데이터 베이스 관리가 가능하다.

출처

profile
hot and warm

0개의 댓글