티스토리 뷰

BackEnd/Node.js

node.js env파일 분리하기

철철22 2019. 5. 30. 22:46
반응형

안녕하십니까

node js를 개발을 하면서 java에서 처럼 환경설정 값들을 따로 모아 관리를 해야 할 필요성을 느꼈습니다.

 

예를 들어 db connection 정보나 port 및 레디스 설정 등등 dev용 production용으로 관리를 하거나 할 때 config 파일들을 여러 개 만들어서 쉘 스크립트로 만들어서 따로 운용이 가능하게 할 수 있죠.

 

java spring boot에서는 properties를 여러 개 만들어서 따로 운용하거나 외부로 빼서 수정이 가능한 방법이 있었습니다.

 

node.js에서는 환경설정 파일로 만들어 관리하는 방법이 여러가지 있습니다.

 

대표적으로 이러한 파일들을 만들어 관리할 수 있습니다.

  • .env
  • *.yml (YAML files)
  • *.ini (normally Windows-only)
  • *.json

그리고 각각 장단점이 있어 뭐를 쓰는 게 더 우월하다 할 수가 없다고 합니다. 이 글을 참고해 주세요.

저는 여기서 json을 이용한 방법env파일을 이용한 환경설정 관리를 해봤습니다.

 

1. *.json을 이용한 방법

json 파일을 이용한 환경설정 관리입니다.

위의 사진처럼 dev용 prod용으로 따로 만들어서 관리하기 위해 두 개의 파일을 만들었습니다.

그리고 운영 환경에 따라서 파일을 적용하기 위해서 node js에서는 NODE_ENV라는 환경변수를 사용합니다.

 

json 파일은 각각 만들어 주시고 json 파일을 불러와야 하는데 node js에서 json 파일을 불러오는 법은 쉽습니다!

 

json파일 

  "db_server": {
    "host": "localhost",
    "user": "root",
    "password": "112233",
    "port": 3306,
    "database": "myDB"
  }

 

불러오는 건 다음과 같이 사용합니다. 

export const config =
  process.env.NODE_ENV === "prod"
    ? require("../../application.prod.json")
    : require("../../application.dev.json");
    
    
export const connection = mysql.createConnection({
  host: config.db_server.host,
  user: config.db_server.user,
  password: config.db_server.password,
  database: config.db_server.database
});

NODE_ENV를 이용해서 값이 prod면 application.prod.json파일을 불러오고 아니면 application.dev.json 파일을 불러와서 읽습니다.

 

위에서 require을 사용했지만 typescript를 사용하는 제 입장에서는 require을 사용하는 것은 별로 보기 좋지 않았습니다.

그래서 해결을 하고 싶었는데 dynamic import를 사용하려고 했으나 실패했습니다. 

 

선언을 하더라도 비동기로 처리하기 때문에 제일 처음에 global로 선언을 하려고 하던 저는 결국 require로 선언을 하게 되었습니다.

 // 실패한 코드
 export const config = async () =>
   process.env.NODE_ENV === "prod"
     ? await import("../../application.prod.json")
     : await import("../../application.dev.json");

 

2. .env 파일을 이용한 방법

두번째로 사용했던 방법은 .env파일을 이용한 방법입니다. node.js에서 .env파일을 사용하려면 dotenv라는 별도의 모듈을 설치 해주셔야합니다. 

npm install --save dotenv
npm install --save --dev @types/dotenv

그리고 위의 사진처럼 .env.dev   .dev.prod 파일들을 만들어서 json처럼 만들어 줍니다.

PORT=3300
DB_SERVER.HOST=localhost
DB_SERVER.USER=root
DB_SERVER.PASSWORD=123123
DB_SERVER.PORT=3306
DB_SERVER.DATABASE=mydb

그리고 json과 다르게 require이 아닌 dotenv를 이용한 설정을 해줘야 합니다.

import * as dotenv from "dotenv";

let path;
switch (process.env.NODE_ENV) {
  case "prod":
    path = `${__dirname}/../../.env.prod`;
    break;
  case "dev":
    path = `${__dirname}/../../.env.dev`;
    break;
  default:
    path = `${__dirname}/../../.env.dev`;
}
dotenv.config({ path: path }); // path 설정

console.log(process.env.PORT);

dotenv.config()를 설정 해주고 사용을 할 때는 process.env.PORT처럼 process.env를 붙여 주며 사용을 해야 합니다.

 

간단하게 이렇게 사용을 해봤는데 딱히 뭐가 더 좋다고 할 수는 없을거 같습니다.

하지만 제 개인적인 생각을 말씀드리면 json을 이용해서 관리를 해주는게 뭔가 가독성이 좋다(?)라고 느껴져서 저는 결국 json파일을 이용하여 환경 설정을 한거 같습니다.

 

그리고 이 둘 뿐만 아니라 yml 파일도 이용할 수 있고 방법을 많으니 직접 찾아보시는 것도 좋을거 같아요!

 

감사합니다.

 

부록 1

환경설정 파일은 .gitignore에 추가 후 다른 사람들이 보지 못하게 하는 것을 추천합니다.

 

부록 2

각각의 OS환경에서 NODE_ENV를 설정하는 방법은 다음과 같습니다.


window - cmd

    set NODE_ENV=prod

    echo %NODE_ENV%    // prod
window - power shell
    
$env:NODE_ENV='prod'   // quote를 해줘야 합니다.

    echo $env:NODE_ENV 

linux

    export NODE_ENV=prod

    echo $NODE_ENV // prod

 

2019-06-05 추가

제가 빼먹은게 있습니다.

json 파일을 import 하려면 

d.ts 파일같은거를 하나 만들고 다음과 같이 선언을 해줘야 합니다. 

// can import json file
declare module "*.json" {
  const value: any;
  export default value;
}

 

 

참고

dotenv
https://www.npmjs.com/package/dotenv
https://github.com/motdotla/dotenv 

config 비교

https://stackoverflow.com/questions/51937363/env-vs-config-json


동적 할당 
https://blog.seq.kr/2018/11/20/nodejs/dotenv-load-enviroment-file/


NODE_ENV 설정

https://stackoverflow.com/questions/9249830/how-can-i-set-node-env-production-on-windows

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함