dotenv vs env-cmd
js 환경에서 환경변수를 설정하여 코드로 전달하는 방법으로 dotenv 가 가장 많이 쓰입니다.
그런데, test 용도로 별도의 환경변수를 전달하기에 dotenv 가 적절하지가 않더군요.
dotenv
.env 파일을 읽어서 process.env 변수에 추가한다
예를 들어 .env 가 아닌 .env.test 를 사용하게 하려면 코드에 다음과 같이 넣어야 했습니다.
require('dotenv').config({path: '.env.test'})
const express = require('express')테스트 용도로 코드 수정을 한다는 건 이해가 되지 않아서 찾아보니, 이런 문제를 보완하는 목적으로 dotenv-flow 라는 패키지가 있더군요.
dotenv-flow
NODE_ENV 라는 변수가 정의되어 있으면 .env.{NODE_ENV} 를 읽는다.
정의되어 있지 않으면 .env 를 읽어 process.env 변수에 추가한다
dotenv-flow 에서는 production이건 test이건 코드는 다음과 같이 변하지 않습니다.
require('dotenv-flow').config();
node 실행시에 (package.json에서) 다음과 같이 변수지정을 하여 호출합니다.
"scripts": {
"dev": "nodemon src/index.js",
"test": "NODE_ENV=test jest"
},근사해 보이는데, windows에서 동작을 잘 안합니다. 윈도우에서 이것저것 해 보다가 결국 env-cmd로 넘어갔습니다.
env-cmd
env-cmd — <command> 의 형식으로 실행하면 .env 를 읽어들여 process.env 에 더한 후 command를 실행한다.
env-cmd -f <envfile> — <command> 로 실행하면 .env 대신에 envfile을 읽어들인다
소스 코드에서는 아예 env-cmd의 존재 자체를 몰라도 됩니다.
"scripts": {
"dev": "env-cmd -- nodemon src/index.js",
"test": "env-cmd -f .env.test -- jest"
},env-cmd가 개념적으로 훨씬 깔끔하다고 생각하는데, dotenv 가 대세인 것을 보면 뭔가 비장의 장점이 있나 봅니다.

