시리즈: Hot Item 프로젝트 구축기
태그: Django django-environ PostgreSQL Redis migrate
이 글에서 다루는 내용
- django-environ으로 settings.py의 민감한 값을 .env에서 읽어오기
- 기본 DB(SQLite3)를 PostgreSQL로 교체하기
- migrate로 DB 연결 확인하기
- Redis 캐시 설정 추가하기
- Django shell로 Redis 연결 상태 직접 확인하기
1. 왜 settings.py를 .env로 분리하나요?
Django 프로젝트를 생성하면 settings.py에 SECRET_KEY가 평문으로 적혀 있습니다.
# 기본 생성된 상태 (위험!)
SECRET_KEY = 'django-insecure-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
DEBUG = True
이 상태로 GitHub에 올리면 SECRET_KEY가 공개됩니다. DEBUG = True도 실수로 그대로 배포했다가는 서버 내부 오류가 브라우저에 그대로 노출됩니다.
django-environ 라이브러리를 사용하면 이런 값들을 .env 파일에서 읽어와 settings.py를 안전하게 관리할 수 있습니다.
2. .env에 필요한 값 추가하기
settings.py에서 읽어올 값들을 .env에 추가합니다.
# .env
# Django
DJANGO_SECRET_KEY=your-secret-key-here
DEBUG=True
# PostgreSQL
POSTGRES_DB=hot_item_db
POSTGRES_USER=hot_item_user
POSTGRES_PASSWORD=your_password_here
# Redis
REDIS_URL=redis://redis:6379/0
💡 redis://redis:6379/0에서 redis는 뭔가요?
URL 안의 redis는 IP 주소가 아니라 docker-compose.yml에 정의된 서비스 이름입니다. Docker Compose 네트워크 안에서는 서비스 이름이 곧 호스트명으로 동작합니다. 마지막 /0은 Redis의 데이터베이스 번호(0번)를 의미합니다.
3. settings.py 수정하기
3-1. django-environ 초기화
파일 상단에 environ을 임포트하고, .env 파일을 읽도록 설정합니다.
from pathlib import Path
import environ
import os
BASE_DIR = Path(__file__).resolve().parent.parent
# environ 객체 생성 (DEBUG의 기본값을 False로 지정)
env = environ.Env(
DEBUG=(bool, False)
)
# BASE_DIR 기준으로 .env 파일 읽기
environ.Env.read_env(os.path.join(BASE_DIR, '.env'))
environ.Env(DEBUG=(bool, False))는 .env에 DEBUG 값이 없을 경우 기본값을 False로 쓰겠다는 의미입니다. 실수로 .env에 DEBUG를 빠뜨려도 프로덕션에서 안전하게 동작합니다.
3-2. SECRET_KEY와 DEBUG 교체
# 기존
SECRET_KEY = 'django-insecure-xxxxxx'
DEBUG = True
# 변경 후
SECRET_KEY = env('DJANGO_SECRET_KEY')
DEBUG = env('DEBUG')
env('키 이름')으로 .env 파일의 값을 가져옵니다.
4. DB를 SQLite3에서 PostgreSQL로 교체하기
Django가 기본으로 제공하는 DB 설정은 SQLite3입니다.
# 기본 생성된 상태
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
SQLite3는 파일 기반 DB로 간단한 테스트엔 편리하지만, 동시 접속이 많은 환경에서는 적합하지 않습니다. Hot Item 프로젝트는 동시 트래픽 처리가 핵심이므로 PostgreSQL로 교체합니다.
# 변경 후
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': env('POSTGRES_DB'),
'USER': env('POSTGRES_USER'),
'PASSWORD': env('POSTGRES_PASSWORD'),
'HOST': 'db',
'PORT': '5432',
}
}
HOST를 'db'로 지정한 것에 주목합니다. 앞서 REDIS_URL과 같은 이유로, docker-compose.yml에서 PostgreSQL 서비스의 이름이 db이기 때문입니다.
5. migrate로 DB 연결 확인하기
Redis 설정은 아직 추가하지 않은 상태입니다. 문제가 생겼을 때 DB 문제인지, Redis 문제인지 헷갈리지 않도록, 먼저 DB만 연결된 상태에서 migrate를 실행해 PostgreSQL 연결을 검증합니다.
Dev Container 터미널에서 실행합니다.
python manage.py migrate
아래처럼 마이그레이션이 순서대로 적용되면 PostgreSQL 연결이 정상입니다.
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
...
💡 migrate가 하는 일
Django의 기본 앱(auth, admin, sessions 등)이 필요로 하는 테이블들을 DB에 생성합니다. 이 명령이 오류 없이 완료됐다면 Django ↔ PostgreSQL 연결이 올바르게 동작하고 있다는 증거입니다.
6. Redis 캐시 설정 추가하기
DB 연결이 확인됐으니 이제 settings.py에 Redis 설정을 추가합니다.
# Cache
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': env('REDIS_URL'),
}
}
django.core.cache.backends.redis.RedisCache는 Django 4.0부터 기본 내장된 Redis 캐시 백엔드입니다. 별도의 서드파티 라이브러리 없이 requirements.txt에 추가한 redis 패키지만으로 동작합니다.
LOCATION은 .env의 REDIS_URL 값인 redis://redis:6379/0을 읽어옵니다.
7. Django shell로 Redis 연결 확인하기
설정을 마쳤다면 실제로 Redis에 값이 저장되고 조회되는지 확인합니다. Django shell을 사용합니다.
python manage.py shell
shell이 열리면 아래 코드를 순서대로 입력합니다.
from django.core.cache import cache
# Redis에 값 저장 (키: 'test', 값: 'hello redis', 만료: 30초)
cache.set('test', 'hello redis', 30)
# Redis에서 값 조회
cache.get('test')
아래처럼 저장한 값이 그대로 반환되면 Redis 연결이 정상입니다.
>>> cache.get('test')
'hello redis'
만약 None이 반환된다면 Redis 서비스가 실행 중인지, REDIS_URL이 올바른지 확인합니다.
확인이 끝나면 exit()로 shell을 종료합니다.
>>> exit()
8. 최종 settings.py 핵심 변경 요약
항목 변경 전 변경 후
| SECRET_KEY | 평문 하드코딩 | env('DJANGO_SECRET_KEY') |
| DEBUG | True 하드코딩 | env('DEBUG') |
| DATABASES | SQLite3 | PostgreSQL + .env 값 |
| CACHES | 없음 | Redis 캐시 백엔드 추가 |
9. 정리
오늘 한 작업을 요약하면:
- django-environ으로 SECRET_KEY, DEBUG, DB/Redis 접속 정보를 모두 .env에서 읽어오도록 분리했습니다.
- DB를 SQLite3에서 PostgreSQL로 교체하고, migrate로 연결 상태를 먼저 검증했습니다.
- Redis 캐시 설정을 추가하고, Django shell의 cache.set / cache.get으로 Redis 연결을 직접 확인했습니다.
'Hot Item' 카테고리의 다른 글
| [Hot Item] 트러블슈팅 #1. AUTH_USER_MODEL 변경 후 migrate 실패 — InconsistentMigrationHistory (0) | 2026.03.09 |
|---|---|
| [Hot Item] #5. DRF + Swagger 문서 자동화, 커스텀 User 모델, JWT 인증 설정 (0) | 2026.03.09 |
| [Hot Item] #3. Dev Container로 VS Code 개발 환경 컨테이너 안으로 옮기기 (0) | 2026.03.06 |
| [Hot Item] #2. requirements.txt, Dockerfile, docker-compose.yml 작성하기 (0) | 2026.03.06 |
| [Hot Item] #1. 한정판 선착순 구매 시스템, 프로젝트 환경부터 제대로 잡기 (0) | 2026.03.05 |