dotenv로 환경 변수 관리하기

yezo cha·2021년 7월 19일
0
post-thumbnail

자바스크립트에서 환경변수를 사용할 수 있도록 하는, npm 모듈 dotenv에 대해 알아보자.

설치

npm i dotenv

.env 파일 작성

명령어 export 로 적용한 환경변수는 현재 사용 중인 터미널에서만 임시로 사용이 가능하다.
환경변수를 Linux 운영체제에 저장하는 방법은 여러 가지가 있지만, Node.js에서는 파일 .env를 만들어 저장하는 방법을 사용한다.
dotenv 라이브러리는 디폴트로 현재 디렉토리에 위치한 .env 파일로부터 환경 변수를 읽어 낸다.

먼저 .env 파일을 생성하고, 사용하고자 하는 환경변수를 키=값의 포맷으로 입력한 뒤 저장하면 된다.

DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3

이렇게 .env파일에 저장해놓은 환경 변수들을 dotenv 라이브러리를 이용해서 process.env에 설정할 수 있다.

CommonJS 기반인지, ES 모듈 기반인지에 따라 라이브러리 사용법이 다르다.

CommonJS에서 환경 변수 불러오기 (require)

애플리케이션을 구동할 때 제일 먼저 실행되는 자바스크립트 파일(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 });

ES 모듈에서 환경 변수 불러오기 (import)

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 });

node 커맨드 -r 옵션 사용하기

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를 참고하자.

profile
(ง •̀_•́)ง

0개의 댓글