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단계 이상 중첩 참조는 지양하고 있다.

Node.js 환경변수 관리 개선 - dotenv-expand 도입기