Post

Django DRF 프로젝트 초기 설정 가이드

Django REST Framework(DRF) 프로젝트를 설정할 때 보안과 유지보수를 고려하여 환경 변수를 활용하는 방법을 설명합니다. 이 가이드는 `django-environ` 패키지를 사용하여 환경 변수를 설정하고, CORS 설정 및 DRF 인증 설정을 포함합니다.

Django DRF 프로젝트 초기 설정 가이드

Django REST Framework(DRF) 프로젝트를 설정할 때 보안과 유지보수를 고려하여 환경 변수를 활용하는 것이 중요합니다. 이를 위해 django-environ 패키지를 사용하여 SECRET_KEY, DEBUG, ALLOWED_HOSTS, DATABASE_URL, CACHE_URL, REDIS_URL 등의 설정을 환경 변수로 관리하는 방법을 설명합니다.

1. 환경 변수 설정 (django-environ 활용)

1.1 django-environ 패키지 설치

Django에서 환경 변수를 쉽게 로드할 수 있도록 django-environ 패키지를 설치합니다.

1
pip install django-environ

설치 후 requirements.txt에 반영하여 프로젝트의 종속성을 관리합니다.

1
pip freeze > requirements.txt

1.2 환경 변수 로드 설정 (settings.py 수정)

Django 프로젝트에서 환경 변수를 사용하려면, settings.py 파일에서 django-environ을 활용하여 .env 파일을 로드하는 설정을 추가해야 합니다.

1
2
3
4
5
6
7
8
9
10
11
import environ
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

# 환경 변수 로드
env = environ.Env(
    DEBUG=(bool, False)  # `DEBUG` 값을 boolean 타입으로 변환, 기본값은 False
)

environ.Env.read_env(BASE_DIR / ".env")  # `.env` 파일을 읽어서 환경 변수로 로드

1.3 SECRET_KEY 환경 변수 설정

Django의 SECRET_KEY 값은 중요한 보안 정보이므로 환경 변수에서 로드하는 것이 좋습니다.

1
SECRET_KEY = env("DJANGO_SECRET_KEY", default="fallback-secret-key")

이제 .env 파일에서 SECRET_KEY 값을 설정합니다.

1
DJANGO_SECRET_KEY="your_secret_key_here"

1.4 DEBUG 설정

DEBUG 모드는 개발 환경에서는 활성화되지만, 운영 환경에서는 반드시 비활성화해야 합니다. 환경 변수를 통해 이를 제어할 수 있습니다.

1
DEBUG = env("DEBUG")

.env 파일에서는 다음과 같이 설정할 수 있습니다.

1
DEBUG=True

1.5 ALLOWED_HOSTS 설정

운영 환경에서는 특정 도메인만 허용해야 하므로, 환경 변수에서 ALLOWED_HOSTS를 로드하여 설정합니다.

1
2
3
ALLOWED_HOSTS = (
    ["localhost", "127.0.0.1"] if DEBUG else env.list("ALLOWED_HOSTS", default=[])
)

개발 환경에서는 localhost127.0.0.1만 허용되며, 운영 환경에서는 .env 파일에서 설정한 도메인이 적용됩니다.

.env 파일 예시:

1
ALLOWED_HOSTS=example.com,api.example.com

1.6 데이터베이스 설정 (DATABASE_URL)

개발 환경에서는 SQLite를 사용하고, 운영 환경에서는 PostgreSQL과 같은 데이터베이스를 사용할 수 있도록 설정합니다.

1
2
3
4
5
6
7
8
9
10
DATABASES = {
    'default': (
        {
            "ENGINE": "django.db.backends.sqlite3",
            "NAME": BASE_DIR / "db.sqlite3",
        }
        if DEBUG
        else env.db("DATABASE_URL")
    )
}

개발 환경에서는 SQLite를 기본으로 사용하고, 운영 환경에서는 .env 파일에서 지정한 데이터베이스를 사용합니다.

.env 파일 예시:

1
DATABASE_URL=psql://user:password@127.0.0.1:5432/mydatabase

1.7 캐시 및 Redis 설정

Django에서 캐싱을 활용하면 성능을 향상시킬 수 있습니다. DEBUG 값에 따라 로컬 메모리 캐시를 사용하거나, 운영 환경에서는 Memcached 또는 Redis를 사용할 수 있도록 설정합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CACHES = {
    "default": (
        {"BACKEND": "django.core.cache.backends.locmem.LocMemCache"}
        if DEBUG
        else {
            "BACKEND": "django.core.cache.backends.memcached.MemcachedCache",
            "LOCATION": env("MEMCACHED_URL", default="127.0.0.1:11211"),
        }
    ),
    "redis": (
        {"BACKEND": "django.core.cache.backends.locmem.LocMemCache"}
        if DEBUG
        else {
            "BACKEND": "django.core.cache.backends.redis.RedisCache",
            "LOCATION": env("REDIS_URL", default="redis://127.0.0.1:6379/1"),
        }
    ),
}

운영 환경에서는 Memcached 또는 Redis를 사용하여 성능을 최적화할 수 있습니다.

.env 파일 예시:

1
2
CACHE_URL=memcache://127.0.0.1:11211
REDIS_URL=redis://127.0.0.1:6379/1

2. CORS 설정 (django-cors-headers 활용)

CORS(Cross-Origin Resource Sharing) 설정을 통해 특정 도메인에서 API 요청을 허용할 수 있습니다.

2.1 패키지 설치

1
pip install django-cors-headers

2.2 settings.py 설정

1
2
INSTALLED_APPS += ["corsheaders"]
MIDDLEWARE.insert(1, 'corsheaders.middleware.CorsMiddleware')

2.3 환경 변수에서 CORS 허용 도메인 로드

1
2
3
4
5
CORS_ALLOWED_ORIGINS = (
    ["http://localhost:3000", "http://127.0.0.1:3000"]
    if DEBUG
    else env.list("CORS_ALLOWED_ORIGINS", default=[])
)

3. DRF 설정 (JWT + 세션 인증)

Django REST Framework(DRF) 설정을 추가하여 API 인증 방식을 정의합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
INSTALLED_APPS += [
    'rest_framework',
    'rest_framework_simplejwt',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}

JWT(JSON Web Token) 설정을 추가하여 보안성을 강화할 수 있습니다.

1
2
3
4
5
6
7
8
from datetime import timedelta

SIMPLE_JWT = {
    "ACCESS_TOKEN_LIFETIME": timedelta(days=1),
    "REFRESH_TOKEN_LIFETIME": timedelta(days=7),
    "ROTATE_REFRESH_TOKENS": True,
    "BLACKLIST_AFTER_ROTATION": True,
}
This post is licensed under CC BY 4.0 by the author.