DB & EMAIL 환경변수 통합 관리 레시피

local / preview / production 환경별로 데이터베이스와 이메일 서비스를 안전하게 연결하기 위한 환경변수 관리 방법을 확인합니다.

구분 학습 내용
환경변수 코드 밖에서 주입하는 설정값
환경변수 스코프 preview, production 등 환경별로 다른 값을 넣는 단위
.env.example 필요한 키 이름만 기록하는 템플릿 파일
.env.local 로컬 개발에서만 사용하는 실제 값 파일
플랫폼 대시보드 preview / production 실제 비밀값의 원본 저장소
CI 시크릿 마이그레이션 같은 자동화 작업이 사용하는 비밀값 저장소
DB 분리 local / preview / production 데이터베이스를 서로 분리하는 정책
메일 분리 local은 발송 차단, preview와 production은 실제 발송하되 표식으로 구분하는 정책

1단계. 환경변수는 “코드 밖의 설정값”이다

환경변수는 코드 안에 직접 적으면 안 되는 값을 외부에서 주입하는 방식입니다. 예를 들어 다음 값들은 코드에 직접 넣지 않습니다.

이유
데이터베이스 주소 환경마다 다르고 비밀값이 포함될 수 있음
메일 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를 잘못 쓰는 사고를 줄일 수 있음

2단계. 세 환경의 역할을 분리한다

이 프로젝트는 세 가지 실행 환경을 사용합니다.

환경 코드 위치 데이터베이스 메일 발송 주 용도
local 개발자 PC, 작업 브랜치 로컬 컨테이너 DB 발송 안 함 구현, 자동화 테스트, 고객 화면 확인
preview dev 브랜치 배포
또는 staging preview 전용 DB 실제 발송 + [preview] 표식 관리자 포함 전체 시나리오 리뷰
production main 브랜치 배포 production DB 실제 발송, 표식 없음 실서비스

중요한 원칙은 다음과 같습니다.

preview는 production과 절대 같은 DB를 쓰지 않는다.

preview에서 테스트 데이터를 만들거나 관리자 기능을 검토할 때 production DB와 연결되어 있으면 실제 서비스 데이터가 오염될 수 있습니다.