환경 변수와 설정
어떤 값들은 코드 안에 적어 넣을 수 없습니다: 비밀 키, 데이터베이스 비밀번호, 어떤 서비스의 주소 같은 것들이죠. 그리고 어떤 값들은 앱이 어디서 도는가에 따라 바뀌어야 합니다. 여러분이 노트북에서 테스트하는 코드(dev 환경)는 테스트용 데이터베이스와 대화해야 하고, 사용자들이 실제로 쓰는 살아있는 앱(prod, 즉 프로덕션 환경)은 진짜 데이터베이스와 대화해야 합니다 — 같은 코드를 쓰면서요.
그 답이 환경 변수(흔히 "env vars"라고 부르죠)입니다: 코드 바깥에 머물다가 코드가 실행될 때 코드에 공급되는, 이름 붙은 값들입니다. 코드는 "DATABASE_URL을 줘"라고 말하고, 환경이 어느 것을 건네줄지 결정합니다.
# 설정 파일 (예: .env) — 값은 코드가 아니라 여기에 산다
DATABASE_URL=postgres://localhost/myapp_dev
STRIPE_SECRET_KEY=sk_test_51H... # dev = 테스트용 키
SEND_REAL_EMAILS=false # 테스트 중에는 진짜 사용자에게 이메일 보내지 말 것
두 가지 규칙이 진짜 고통을 덜어줄 겁니다:
- 비밀은 절대 코드에 넣지 마세요. 코드 안에 있는 것은 무엇이든 공개될 수 있습니다(특히 공유된 저장소에서요). 그리고 유출된 결제 키나 데이터베이스 비밀번호는 진짜 비상사태입니다. 비밀은 env vars에 속하며, 버전 관리 바깥에 둬야 합니다.
- dev와 prod는 다릅니다. 핵심은 같은 코드가 양쪽 모두에서 올바르게 동작한다는 것입니다. 어느 데이터베이스와 키를 쓸지 결정하는 것이 코드가 아니라 환경이기 때문이죠.
같은 코드, 두 개의 집 — 다른 것은 env vars뿐입니다:
SAME CODE
/ \
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ DEV │ │ PROD │
│ 내 노트북 │ │ 클라우드 호스팅│
│ 테스트 DB │ │ 실제 DB │
│ 테스트 API 키 │ │ 실제 API 키 │
│ 가짜 이메일 │ │ 진짜 이메일 │
└─────────────────┘ └─────────────────┘
나만 본다 사용자들이 본다