Node.js 환경변수 관리 개선 - dotenv-expand 도입기
문제 상황
마이크로서비스 구조로 전환하면서 환경변수가 급격히 늘어났다. 특히 각 서비스별 URL을 조합해야 하는 경우가 많았는데, dotenv만으로는 변수 간 참조가 불가능했다.
# .env
BASE_URL=https://api.example.com
USER_SERVICE_URL=https://api.example.com/users
ORDER_SERVICE_URL=https://api.example.com/orders
중복이 많고, BASE_URL 변경 시 모든 서비스 URL을 수정해야 하는 구조였다.
dotenv-expand 도입
환경변수 간 참조를 지원하는 dotenv-expand를 추가했다.
// config/env.js
const dotenv = require('dotenv');
const dotenvExpand = require('dotenv-expand');
const myEnv = dotenv.config();
dotenvExpand.expand(myEnv);
이제 변수 참조가 가능해졌다.
# .env
BASE_URL=https://api.example.com
USER_SERVICE_URL=${BASE_URL}/users
ORDER_SERVICE_URL=${BASE_URL}/orders
PAYMENT_SERVICE_URL=${BASE_URL}/payments
# 환경별 설정도 조합 가능
ENV=production
LOG_LEVEL=${ENV == 'production' ? 'error' : 'debug'}
환경변수 검증 추가
환경변수 누락으로 인한 런타임 에러를 방지하기 위해 검증 로직을 추가했다.
// config/validate.js
const requiredEnvs = [
'BASE_URL',
'DATABASE_URL',
'REDIS_URL',
'JWT_SECRET'
];
requiredEnvs.forEach(key => {
if (!process.env[key]) {
throw new Error(`Missing required environment variable: ${key}`);
}
});
결과
환경변수 관리가 훨씬 체계적으로 변했다. 중복이 줄어들고, 환경별 설정 변경이 용이해졌다. 특히 개발/스테이징/프로덕션 환경 간 전환이 간편해져서 배포 프로세스가 안정화되었다.
다만 변수 참조가 복잡해지면 디버깅이 어려워질 수 있으니, 2단계 이상 중첩 참조는 지양하고 있다.