local / preview / production 환경별로 데이터베이스와 이메일 서비스를 안전하게 연결하기 위한 환경변수 관리 방법을 확인합니다.
| 구분 | 학습 내용 |
|---|---|
| 환경변수 | 코드 밖에서 주입하는 설정값 |
| 환경변수 스코프 | preview, production 등 환경별로 다른 값을 넣는 단위 |
.env.example |
필요한 키 이름만 기록하는 템플릿 파일 |
.env.local |
로컬 개발에서만 사용하는 실제 값 파일 |
| 플랫폼 대시보드 | preview / production 실제 비밀값의 원본 저장소 |
| CI 시크릿 | 마이그레이션 같은 자동화 작업이 사용하는 비밀값 저장소 |
| DB 분리 | local / preview / production 데이터베이스를 서로 분리하는 정책 |
| 메일 분리 | local은 발송 차단, preview와 production은 실제 발송하되 표식으로 구분하는 정책 |
환경변수는 코드 안에 직접 적으면 안 되는 값을 외부에서 주입하는 방식입니다. 예를 들어 다음 값들은 코드에 직접 넣지 않습니다.
| 값 | 이유 |
|---|---|
| 데이터베이스 주소 | 환경마다 다르고 비밀값이 포함될 수 있음 |
| 메일 API 키 | 외부 서비스 호출 권한이 있는 비밀값 |
| 발신자 이메일 | 환경마다 다를 수 있음 |
| 관리자 이메일 | 운영 중 교체될 수 있음 |
| 파일 스토리지 키 | 외부 저장소 접근 권한이 있음 |
좋지 않은 예시는 다음과 같습니다.
const DATABASE_URL = "postgres://user:password@host:5432/app";
const MAIL_API_KEY = "re_xxxxxxxxx";
좋은 방식은 다음과 같습니다. (외부 값을 읽어와라! 라고 써있으면 됩니다!)
const DATABASE_URL = process.env.DATABASE_URL;
const MAIL_API_KEY = process.env.MAIL_API_KEY;
이 방식의 장점은 다음과 같습니다.
| 장점 | 설명 |
|---|---|
| 보안 | 비밀값이 코드 저장소에 들어가지 않음 |
| 환경 분리 | local, preview, production이 서로 다른 값을 쓸 수 있음 |
| 운영 편의 | 코드 수정 없이 설정값을 바꿀 수 있음 |
| 사고 예방 | preview가 production DB를 잘못 쓰는 사고를 줄일 수 있음 |
이 프로젝트는 세 가지 실행 환경을 사용합니다.
| 환경 | 코드 위치 | 데이터베이스 | 메일 발송 | 주 용도 |
|---|---|---|---|---|
| local | 개발자 PC, 작업 브랜치 | 로컬 컨테이너 DB | 발송 안 함 | 구현, 자동화 테스트, 고객 화면 확인 |
| preview | dev 브랜치 배포 |
|||
또는 staging |
preview 전용 DB | 실제 발송 + [preview] 표식 |
관리자 포함 전체 시나리오 리뷰 | |
| production | main 브랜치 배포 |
production DB | 실제 발송, 표식 없음 | 실서비스 |
중요한 원칙은 다음과 같습니다.
preview는 production과 절대 같은 DB를 쓰지 않는다.
preview에서 테스트 데이터를 만들거나 관리자 기능을 검토할 때 production DB와 연결되어 있으면 실제 서비스 데이터가 오염될 수 있습니다.