시리즈: 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 연결을 직접 확인했습니다.

 

+ Recent posts