장고는 기본 DB 로 sqlite 를 사용한다. 이 글에서는 장고 로컬 개발 환경에서 sqlite 서버를 postgres DB 로 전환하는 방법을 설명한다. 로컬 환경 설정은 다음과 같다. 로컬 환경의 OS 는 윈도우 기반이며, postgres 는 직접 설치하지 않고 도커 이미지를 사용한다. (이미 도커는 설치되어 있다고 가정한다.)
docker pull postgres
docker images
docker run --name test-postgres \
-p 5432:5432 \
-e POSTGRES_USER=testuser \
-e POSTGRES_PASSWORD=testpassword \
-d \
postgres
--name
: 실행할 컨테이너 이름 test-postgres-p
: 호스트 포트 연결 hostPort:containerPort
5432:5432-e
: 환경 변수 설정POSTGRES_USER
: DB 루트 아이디 설정 testuserPOSTGRES_PASSWORD
: DB 루트 비밀번호 설정 testpassword-d
: 컨테이너 실행을 백그라운드로 돌리고 호스트 쉘을 계속 사용할수 있도록 함 (detach)postgres
: 컨테이너가 참조할 도커 이미지 이름docker start test-postgres
docker ps {--all}
test-postgres
가 있는지 확인--all
실행에 관계없이 모든 컨테이너 목록을 확인docker exec -it test-postgres bash
test-postgres
컨테이너 내부에서 bash
shell 을 실행root@id:/# psql -U testuser
testuser
로 DB 에 접속컨테이너 shell 에서 나오고 싶다면 exit
testuser=# \list
\list
or \l
: 클러스터 (서버) 내에 존재하는 DB 목록 확인testuser=# CREATE DATABASE djangotest OWNER testuser;
djangotest
이고, 소유자는 서버 소유자와 동일한 testuser
로 설정하였다.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
명령어를 사용하면 된다.
psycopg2-binary
설치하기
psycopg2
는 장고 서버와 postgres 서버간 통신을 위해 필요한 드라이버라고 보면 된다.binary
버전을 설치하는 이유는 이미 바이너리화 되어있는 패키지 이므로 추가적으로 빌드할 필요가 없고, 따라서 플랫폼이나 OS 에 따른 의존성을 가지지 않기 때문이다.
pip install psycopg2-binary
settings.py
수정하기기존 settings.py
의 DATABASES
부분은 다음과 같이 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 namePORT
: docker run
할때 설정했던 호스트 포트 번호[주의]
- DB 서비스 자체를 바꾸는 것이기 때문에 기존에
sqlite
DB 내부에 있던 데이터는 옮겨와지지않는다. 따라서 기존에 존재하던 데이터 (글, 유저 등) 없이 새로 시작하게된다.- 기존과 동일하게 각 세부 app 의
models.py
내부에 정의된 스키마를 바탕으로 테이블이 생성된다.
# 장고 프로젝트 폴더 내에서
python manage.py makemigrations
python manage.py migrate
makemigrations
: DB, 모델 세팅에서 변경된 코드를 반영하여 migration 파일 을 생성models.py
에 변경이 없고, settings.py
만 변경된 경우라면 하지 않아도 무방하다.migrate
: 생성한 migration 파일을 실제 DB 에 반영새로운 DB 로 넘어오면서 장고 기본 user 테이블에 있던 admin 계정 정보가 없으므로 더이상 사용할수 없다. Django admin 을 사용하기 위해서는 새로 superuser 를 만들어 주어야 한다.
python manage.py createsuperuser
Username: test
Email address: test@email.com
Password:
Password (again):
Superuser created successfully.
createsuperuser
: 장고 어드민 패널 사용이 가능한 관리자 권한 유저 생성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)
username
이 test
였기 때문에 그에 맞는 row 만 가져온 것이다.python manage.py runserver
localhost:8000/admin
에 접속해서 방금 생성한 superuser 의 username 과 password 로 로그인 하면 성공이제 연동이 완료되었으므로 데이터가 자동으로 postgres DB 에 저장 및 관리될 것이다.
개발을 하지않을때는 컨테이너를 중지 (start
의 반대) 시켜놓는 것이 리소스 관리에 좋다.
docker stop {컨테이너 이름}
시스템 (Linux, WSL 포함) 에서 도커 자체를 끄는것도 가능하다.
sudo systemctl stop docker.socket
sudo systemctl stop docker
반대로 도커 자체를 킬때는 이 명령어를 사용하면 된다.
sudo systemctl enable docker
sudo systemctl start docker