[Node.js] dotenv module

민수·2023년 1월 10일
0

.env 파일

DB의 포트나 비밀번호 등을 외부에 노출하게 되면 안되기 때문에 이전까지 DB의 비밀번호를 환경변수에 저장해서 사용하고 있었는데 이번에 .env 파일을 알게 되었다.

echo "export DB_PASS='*'" >> ~/.zshrc
source ~/.zshrc

.env 파일을 사용하면 직접 환경변수를 등록하지 않고 파일로 변수들을 관리할 수 있고 수정이 편리하다.

형태

.env

# key=value
PORT=3306
HOST=127.0.0.1

위와 같이 key=value 형태로 적어줘야 한다.

사용 방법

node.js 기준으로 dotenv 모듈을 다운로드 해준다.

npm init -y
npm install dotenv

.env

# key=value
PORT=3306
HOST=127.0.0.1

index.js

require("dotenv").config();

console.log(process.env.PORT); // 3306
console.log(process.env.HOST); // 127.0.0.1

.env 파일의 위치가 다를때


기본 경로는 파일을 실행한 절대경로에서 .env 파일을 찾기 때문에 .env 파일이 다른 곳에 있으면 원하는 값이 나오지 않을 수 있다.

.env 파일이 config 디렉토리 안에 있다면 다음과 같이 경로를 지정해 줄 수 있다.

require("dotenv").config({path: "./config/.env"});

console.log(process.env.PORT); // 3306
console.log(process.env.HOST); // 127.0.0.1

예제

다음과 같은 디렉토리 구조와 파일이 있다고 가정한다.

|-- 📁test
|    |-- 📁config
|    |    |-- .env
|    |-- 📁models
|    |    |-- index.js
|    |-- config.js

config/.env

# key=value
PORT=3306
HOST=127.0.0.1

config.js

require("dotenv").config({ path: "./config/.env" });

const port = process.env.PORT || 1234;
const host = process.env.HOST || "0.0.0.0";

const config = {
  port,
  host,
};

console.log(config.port); // 3306
console.log(config.host); // 127.0.0.1

module.exports = config;

models/index.js

const config = require("../config");

console.log(config.port); // 1234
console.log(config.host); // 0.0.0.0

위와 같이 exports한 객체를 불러와서 출력해보면 원하는 값이 나오지 않는다.
dotenv 모듈을 불러올 때 경로 설정에서 상대경로로 .env 파일의 위치를 지정해 주었기 때문이다.
index.js 파일이 실행될 때 config.js 파일을 불러오면서 dotenv 모듈이 .env 파일로부터 환경변수를 읽게되는데 index.js 파일이 위치한 models 디렉토리에 config/.env가 존재하지 않기 때문에 or 연산자의 마지막 값이 들어간 것으로 보인다.

해결

config.js

require("dotenv").config({ path: "/test/config/.env" });

const port = process.env.PORT || 1234;
const host = process.env.HOST || "0.0.0.0";

const config = {
  port,
  host,
};

console.log(config.port); // 3306
console.log(config.host); // 127.0.0.1

module.exports = config;

위와 같이 절대경로로 path를 설정해 주면 된다.

참고

dotenv Github

0개의 댓글