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 파일이 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를 설정해 주면 된다.