자바스크립트에서 환경변수를 사용할 수 있도록 하는, npm 모듈 dotenv에 대해 알아보자.
npm i dotenv
명령어 export
로 적용한 환경변수는 현재 사용 중인 터미널에서만 임시로 사용이 가능하다.
환경변수를 Linux 운영체제에 저장하는 방법은 여러 가지가 있지만, Node.js에서는 파일 .env
를 만들어 저장하는 방법을 사용한다.
dotenv
라이브러리는 디폴트로 현재 디렉토리에 위치한 .env
파일로부터 환경 변수
를 읽어 낸다.
먼저 .env
파일을 생성하고, 사용하고자 하는 환경변수를 키=값
의 포맷으로 입력한 뒤 저장하면 된다.
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3
이렇게 .env
파일에 저장해놓은 환경 변수들을 dotenv
라이브러리를 이용해서 process.env
에 설정할 수 있다.
CommonJS 기반인지, ES 모듈 기반인지에 따라 라이브러리 사용법이 다르다.
애플리케이션을 구동할 때 제일 먼저 실행되는 자바스크립트 파일(index.js
, main.js
)의 최상위에 다음과 같이 dotenv
라이브러리를 임포트 해주고 config()
함수를 호출해주면 된다.
main.js
require('dotenv').config();
console.log("DB_HOST:", process.env.DB_HOST);
console.log("DB_USER:", process.env.DB_USER);
console.log("DB_PASS:", process.env.DB_PASS);
config()
함수를 호출하기 전에 process.env
를 읽으면 안되니까 주의하자.
.env
파일이 아닌 다른 경로에 있는 파일에 환경 변수를 저장해뒀다면 config()
함수를 호출할 때 path
옵션을 넘기면 된다.
require('dotenv').config({ path: '/path/to/.env.local });
require
대신에 import
키워드를 사용한다.
ES 모듈을 사용할 때는 좀 더 주의가 필요하다.
자주 발생하는 오류에 대해 살펴보자.
// db.js
export const db_host = process.env.DB_HOST;
export const db_user = process.env.DB_USER;
export const db_pass = process.env.DB_PASS;
// index.js
import dotenv from "dotenv";
import { db_host, db_user, db_pass } from "./db.js";
dotenv.config();
console.log("DB_HOST:", process.env.DB_HOST);
console.log("DB_USER:", process.env.DB_USER);
console.log("DB_PASS:", process.env.DB_PASS);
console.log({ db_host, db_user, db_pass });
코드를 보면, dotenv
라이브러리를 제일 먼저 임포트 하기 때문에 db.js
파일이 process.env
에 접근할 때 환경 변수가 설정이 되어 있을 거 같다.
DB_HOST: localhost
DB_USER: root
DB_PASS: s1mpl3
{ db_host: undefined, db_user: undefined, db_pass: undefined }
하지만 실제로 실행을 해보면 db.js
파일이 process.env
에 접근했을 시점에는 환경 변수가 설정이 되어 있지 않다.
이런 결과가 나온 이유는 dotenv.config()
함수가 db.js
파일이 임포트 된 이후에 호출되었기 때문이다.
dotenv
라이브러리를 임포트하는 코드를 별도의 파일로 빼고, config()
함수를 호출하면 해결할 수 있다.
env.js
import dotenv from 'dotenv'
dotenv.config();
index.js
import './env.js'
import { db_host, db_user, db_pass } from './db.js'
console.log('DB_HOST:', process.env.DB_HOST);
console.log('DB_USER:', process.env.DB_USER);
console.log('DB_PASS:', process.env.DB_PASS);
console.log({ db_host, db_user, db_pass });
CommonJS 기반인지 ES 모듈 기반인지 신경 쓰기 싫다 !
그럼 node 커맨드를 이용하면 된다.
애플리케이션을 구동할 때 node 커맨드의 -r
또는 --require
옵션으로 dotenv/config
를 넘겨준다.
$ node -r dotenv/config index.js
dotenv
라이브러리를 직접 임포트 하지 않아도 .env
파일에 저장된 환경 변수가 process.env
에 설정된다.
.env
가 아닌 다른 경로에 있는 파일에 환경 변수를 저장했다면 DOTENV_CONFIG_PATH
환경 변수를 사용하면 된다.
$ DOTENV_CONFIG_PATH=/path/to/.env.local node -r dotenv/config index.js
더 자세한 내용은 Github를 참고하자.