Loading...
나무위키 실시간 검색어 순위
실시간 영화 순위
1. 미키 17
2. 극장판 진격의 거인 완결편 더 라스트 어택
3. 콘클라베
4. 퇴마록
5. 침범
6. 위플래쉬
7. 노보케인
8. 에밀리아 페레즈
9. 이찬원 콘서트 찬가: 디어 마이 찬스
10. 초혼, 다시 부르는 노래

프로덕션 환경에서 개발 서버 분리하기: 장고(Django)와 도커(Docker)를 활용

프로덕션 환경에서 개발 서버 분리하기: 장고(Django)와 도커(Docker)를 활용에 대한 img

Releasing in staging then in production © Larry Garfield / Jaxenter

서론

개발 환경과 프로덕션 환경을 분리하는 것은 안정적인 애플리케이션 운영의 핵심 중 하나임. 특히, 프로덕션 서버에서 디버깅이나 테스트를 하다가 서버가 다운되는 문제를 경험하면, 이 분리의 중요성을 절실히 느끼게 됨. 필자의 경우, 장고(Django) 기반의 홈 서버를 운영하며 이러한 문제를 겪었고, 이를 해결하기 위해 개발 환경과 프로덕션 환경을 분리하는 작업을 진행함. 이 글에서는 필자의 경험을 바탕으로, 분리 과정과 적용 방법을 구체적으로 설명함.

본론

1. 개발 환경과 프로덕션 환경의 차이

  • 개발 환경(Development Environment): 새로운 기능 개발, 디버깅, 테스트 등을 수행하는 공간. 보통 로컬 머신에서 실행하며, 디버깅 모드가 활성화되어 있음.
  • 프로덕션 환경(Production Environment): 실제 사용자가 애플리케이션을 사용하는 공간으로, 안정성과 성능이 최우선. 디버깅 정보는 노출되지 않으며, 최적화된 설정이 필요함.

개발 환경과 프로덕션 환경이 동일한 설정을 공유하면 다음과 같은 문제가 발생할 수 있음:

  • 디버깅 코드나 테스트 데이터가 프로덕션에 노출될 위험.
  • 개발 중 서버 다운이나 오류 발생 시 사용자에게 직접적인 영향을 미침.

2. 장고 settings.py 파일 분리

장고 프로젝트에서 가장 먼저 손댄 부분은 settings.py 파일임. 기본적으로 하나의 파일로 모든 설정을 관리하지만, 이를 개발용과 프로덕션용으로 나누는 것이 핵심.

분리 과정:

  1. 기존 settings.py 파일을 다음과 같이 구조화:
myproject/
├── settings/
    ├── __init__.py
    ├── base.py
    ├── development.py
    ├── production.py

base.py: 공통 설정 작성

# base.py
import os


BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    # 기타 앱들...
]


MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    # 기타 미들웨어...
]

development.py: 개발 환경 전용 설정

from .base import *


DEBUG = True
ALLOWED_HOSTS = ['localhost', '127.0.0.1']


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

production.py: 프로덕션 환경 전용 설정

from .base import *


DEBUG = False
ALLOWED_HOSTS = ['your-production-domain.com']


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'prod_db',
        'USER': 'prod_user',
        'PASSWORD': 'secure_password',
        'HOST': 'db_host',
        'PORT': 5432,
    }
}


# 보안 관련 추가 설정
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

환경 변수로 설정 파일 선택:

manage.py와 WSGI/ASGI 파일에서 사용할 설정 파일을 지정.

# manage.py 예시
import os


os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.development')


# 프로덕션에서는 아래와 같이 변경:
# os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.production')


3. 도커(Docker)와 도커 컴포즈(Docker Compose) 활용

도커를 사용하면 개발 및 프로덕션 환경 간의 차이를 쉽게 관리할 수 있음.

로컬 개발용 docker-compose.yml:

version: "3.8"
services:
  web:
    build:
      context: .
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    environment:
      - DJANGO_SETTINGS_MODULE=myproject.settings.development

프로덕션용 docker-compose.prod.yml:

version: "3.8"
services:
  web:
    build:
      context: .
    ports:
      - "80:8000"
    environment:
      - DJANGO_SETTINGS_MODULE=myproject.settings.production
    restart: always


4. CI/CD 파이프라인 구축 필요성

개발 및 배포 과정을 자동화하기 위해 CI/CD(Continuous Integration/Continuous Deployment)를 도입할 필요성을 느꼈음.

  • CI/CD 도입 이유:
  • 코드 변경 사항이 자동으로 테스트되고 배포되도록 설정.
  • 수동 배포 과정에서 발생할 수 있는 실수를 방지.
  • 팀 협업 시 코드 품질 유지.

간단한 GitHub Actions 예시 (Django 프로젝트 배포):

name: Django CI/CD


on:
  push:
    branches:
      - main


jobs:
  deploy:
    runs-on: ubuntu-latest


    steps:
    - name: Checkout code
      uses: actions/checkout@v2


    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: 3.9


    - name: Install dependencies
      run: |
        pip install -r requirements.txt


    - name: Run tests
      run: |
        python manage.py test --settings=myproject.settings.development


    - name: Deploy to server (example)
      run: |
        ssh user@your-server "cd /path/to/project && git pull && docker-compose up --build -d"

사례·예시 및 응용

  • 사례: AWS EC2 인스턴스에서 운영 중인 Django 프로젝트에 위와 같은 구조를 적용하여 안정적인 배포 환경 구축.
  • 응용: 로컬에서는 SQLite를 사용하고, 프로덕션에서는 PostgreSQL을 사용하는 등 데이터베이스도 환경별로 구분 가능.


장단점 및 주의사항

장점

  • 개발 중 발생한 오류가 프로덕션에 영향을 미치지 않음.
  • 각 환경에 맞는 최적화된 설정 관리 가능.
  • CI/CD와 결합하면 배포 효율성과 안정성 극대화.


단점 및 주의사항

  • 초기 설정 작업이 다소 번거로움.
  • 환경 변수 관리가 중요하며, 민감한 정보는 .env 파일이나 비밀 관리 도구(AWS Secrets Manager 등)를 활용해야 함.
  • Docker와 같은 컨테이너 기술에 익숙하지 않다면 학습 곡선 존재.


결론 및 추가 학습 항목

개발 서버와 프로덕션 서버를 분리하는 과정은 안정성과 효율성을 동시에 확보할 수 있는 중요한 작업임. 특히 Django와 Docker를 활용하면 이러한 분리가 체계적으로 가능하며, CI/CD까지 결합하면 더욱 강력한 워크플로우를 구축할 수 있음.


추가 학습 항목 추천:

  1. Django 공식 문서의 배포 체크리스트
  2. Docker Compose 공식 문서 및 예제들.
  3. GitHub Actions 또는 Jenkins를 활용한 CI/CD 파이프라인 구축 방법.
  4. PostgreSQL 등 고성능 데이터베이스와 Django 연동 방법.

위 내용을 참고하여 본인의 프로젝트에도 적용해보길 추천!