NodeJs에서 환경 변수 또는 설정파일을 이용하여 서버 속성 구성하기

Posted by , November 09, 2021
NodeJS
Series ofNodeJS

Node에서 환경 변수를 사용하는 법? (설정 파일로 관리하기)

내가 Spring boot로 개발할 때는 application.yml에 설정을 넣고 개발을 했다.
그러다가 설정에 넣은 값에 변경이 필요할 경우 서버를 내렸다가 올려야 하는 문제가 생겼다.
(물론 이중화 되어 있다 하더라도 이렇게 하는건 비효율적..)

그래서 Spring config server를 사용해서 처리하였다.
Node.js는 이런 비슷한게 있나 찾아보다가...
아주 똑같지 않지만 설정 파일을 외부에 두고 사용할 수 있는 것을 찾았다.
(Node를 첨 다뤄보니 이런게 있는줄 몰랐다)


dotenv

먼저 설치를 진행한다.
(yarn 을 사용하였는데 npm도 똑같다)

yarn add dotenv


설정 내용을 선언

설정 파일을 만드는 형태는 두 가지가 있다.

여기서는 ES6 문법으로 설명한다. (CommonJS 는 간략하게만 표기..)

1. .env 파일 사용

프로젝트 내에 (보통은 자신 프로젝트 루트에) .env 파일을 생성한다
그리고 아래와 같이 설정을 기재한다.

#SERVER CONFIG

SERVER_PORT = 3001
SERVER_NAME = HELLO_SERVER
SERVER_DIS = 'HELLO_SERVER';

그리고 불러올 js에서는 아래와 같이 사용한다

//CommonJS
//require("dotenv").config();

//ES6
import dotenv from "dotenv";
dotenv.config(); //1 -> config 호출

const port = process.env.SERVER_PORT;

function checkTest() {
  console.log('SERVER_NAME = '  + process.env.SERVER_NAME);
  console.log('SERVER_DES = '  + process.env.SERVER_DES);
}
...

주의할 점은 1번 config() 호출 전에 process.env를 사용하면 에러가 난다. (ES6, CommonJS 둘다 동일)
그리고 .env 파일의 경로가 다른 곳에 있는 경우 아래와 같이 config 함수를 수정하면 된다.

//CommonJS
//require("dotenv").config({path:'/your/env/path/.env.dev'});

//ES6
import dotenv from "dotenv"
dotenv.config({ path: "/your/env/path/.env.dev" })

단 .env 파일이 존재하는 경우 위 내용은 적용이 안된다. (기존 .env 파일 따라감)

참고로 SERVER_DIS 출력해보면 SERVER_DES = 'HELLO SERVER'; 와 같이 따옴표가 같이 출력된다.

console.log('SERVER_NAME = '  + typeof process.env.SERVER_NAME);
console.log('SERVER_DES = '  + typeof process.env.SERVER_DES);

console.log('SERVER_NAME = '  + process.env.SERVER_NAME);
console.log('SERVER_DES = '  + process.env.SERVER_DES);

///Output

SERVER_NAME = string
SERVER_NAME = string

SERVER_NAME = HELLO SERVER
SERVER_DES = 'HELLO SERVER';

2. config.js 등 js 파일로 사용

이건 .env 랑 비슷하지만 사용법은 약간 다른데 먼저 원하는 곳에 config.js 파일을 생성해주고 그곳에 설정을 담는다.

let configData

configData = {
  SERVER_PORT: 3001,
}

//ES6 방식
export default { configData }

//Common JS 방식
// module.exports = configData;

그리고 필요한 곳에서 다음과 같이 사용한다.

//ES6
import secondConfig  from "./config.js"

....

console.log('process.env.PORT = ' + secondConfig.configData.SERVER_PORT)

만약 Babel을 사용한 ES6 사용을 한다면 js 확장자는 무시해도 되지만, 미 사용시 .js 확장자를 붙여줘야 한다.

그리고 저기 나온 예제에 있는 export 방식 말고도 여러 방식이 있다.
본문 하단의 링크를 참고하자.

참고

Import와 export