base / local / production 으로 갈리는 이유와, 요청이 들어올 때 어떤 설정이 로드되는지 설명할 수 있다.로컬 컴퓨터와 서버 사이에 파일을 주고받는 방법부터.
ubuntu)에 standarda-template, standarda-core 폴더가 실제로 있다.cookiecutter 로 새 프로젝트를 만들 때는 보통 GitHub 의 standarda-template 레포를 당겨온다. (서버 로컬에 있는 것도 당길 수 있지만, 헷갈릴까 봐 로컬 사본은 지워뒀다.)push 한다. 변화가 생기면 자동으로 push 되게 해뒀기 때문에 항상 최신 버전이 유지된다.템플릿 구조 = 우리 프로젝트 구조다. (.claude/, GitHub 설정, 그리고 cookiecutter 의 {project_slug} 폴더)
accounts, export_web, emails, profiles, projects, sms — 이게 전부 Django 앱이다.export_web).settings 폴더를 가지고 있다.{프로젝트명}/ ← 루트 앱 (프로젝트 이름과 동일)
├── settings/ ← ★ 이 앱에만 있다
├── urls.py
├── wsgi.py
└── ...
accounts/ profiles/ projects/ emails/ sms/ export_web/ ← 일반 Django 앱들
settings.py 파일 하나다.__init__.py)로 만들었다. 폴더 안에는:settings/
├── __init__.py # 환경에 따라 무엇을 로드할지 고르는 곳
├── base.py # 공통 설정
├── local.py # 개발 환경
└── production.py # 운영 환경
__init__.py — 환경에 따라 무엇을 로드하나# {프로젝트명}/settings/__init__.py
if os.environ.get('{프로젝트명대문자}_PRODUCTION') == 'True':
load_dotenv(_BASE_DIR / '.env.production', override=True)
else:
load_dotenv(_BASE_DIR / '.env', override=True)
from .base import * # 공통을 먼저 다 가져옴
if os.environ.get('{프로젝트명대문자}_PRODUCTION') == 'True':
from .production import * # 운영이면 production 으로 덮어씀
else:
from .local import * # 아니면 local
base + production, 아니면 base + local._BASE_DIR: 파이썬 pathlib 의 Path 로 src/(루트) 폴더를 가리킨다. Path(__file__) 에서 부모를 세 번 거슬러 올라가면 src/ 다. src/ 가 항상 프로젝트의 루트(베이스) 폴더다.from .base import * 의 * 는 와일드카드 — 해당 모듈에 있는 모든 값을 다 가져온다는 뜻이다..env / .env.example.env.example: 템플릿을 당기면 같이 생성된다. "이 형식대로 채워 넣어라" 는 견본이다..env 를 만들고, API 키 · ALLOWED_HOSTS · 비밀번호 등을 쫙 채워서 쓴다..env.production.example 도 있다. 나중에 배포(deploy) 할 때 이걸 복사해 .env.production 을 만든다. (지금은 비어 있다.)비밀값(키·비번)은 settings 코드가 아니라
.env(개발) /.env.production(운영) 에 둔다.
.env 와 production 을 구분하는 이유는, 개발 환경과 운영 환경이 실제로 다르기 때문이다.
43.200.38.93, 앞으로 운영 서버는 52.79.132.206 에서 관리한다.ALLOWED_HOSTS 주소부터 달라진다.→ 그래서 환경마다 달라지는 값들을 따로따로 관리한다.
브라우저 (도메인 입력)
→ DNS 가 도메인 → IP 조회 (예: meetings.popupstudio.ai → 43.200.38.93)
→ 그 서버의 포트로 요청 도착 (현재 dev 서버에 배포됨, 예: :8024 에서 Django 가 대기)
→ Django 가 settings/__init__.py 를 "제일 먼저" 읽음
→ os.environ 에서 {프로젝트명대문자}_PRODUCTION 확인
→ 없으면 else → .env + base + local
→ 있으면(True) → .env.production + base + production
os.environ.get(...) 은 시스템(OS) 환경변수를 읽는다. 리눅스에서 그 값들은 /etc/environment 파일에 들어 있다.local, 운영 서버엔 {프로젝트명대문자}_PRODUCTION=True 가 박혀 있어서 production 으로 뜬다.base.py 의 모든 내용 + local.py 의 모든 내용base.py 의 모든 내용 + production.py 의 모든 내용base.py 에 들어가는 "공통" 설정두 환경이 똑같이 쓰는 것은 전부 base.py 에 한 번만 넣는다. 강의에서 짚은 항목:
admin, auth, sessions, messages, staticfilesrest_framework(DRF), django_extensions 등ROOT_URLCONF(루트 URL), 템플릿 엔진, WSGI 애플리케이션LANGUAGE_CODE, TIME_ZONE, USE_TZlocal 과 production 은 실제로 뭐가 다른가반대로 환경마다 달라져야 하는 것만 local.py / production.py 로 갈린다.
| 항목 | local.py (개발) |
production.py (운영) |
|---|---|---|
SECRET_KEY |
개발용 | 운영용 (달라야 함 — 지금 같은 건 나중에 수정 예정) |
DEBUG |
True (에러가 나면 메시지를 브라우저에 표시) |
False (운영에선 에러 메시지를 띄우면 안 됨) |
ALLOWED_HOSTS |
localhost + dev 서버 IP 43.200.38.93 + dev 도메인 |
운영 도메인 |
CSRF |
dev 주소 기준 | 운영 주소 기준 (주소에 따라 체크가 달라짐) |
DATABASES |
dev 서버의 PostgreSQL (포트 5432) |
운영 서버의 PostgreSQL |
Django 앱은 자기를 서빙하는 IP/도메인으로 들어오는 요청만 처리한다. 그래서
ALLOWED_HOSTS에 그 주소들이 들어가 있어야 한다.
local / production 으로 분리해두고, 처음 settings 가 로드될 때 환경변수(PRODUCTION 여부)에 따라 둘 중 하나를 불러온다.base + localbase + production