ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • dotenv 패키지로 Node.js에서 환경변수 사용하기
    소소한 IT 이야기 2020. 4. 30. 22:16
    반응형

    현재 기존의 Heroku 서버에서 AWS로 프로젝트를 이전하고 있는 작업을 하고 있습니다. (초기작업 글)

     

    가장 먼저해야 해야했던것이 기존 Heroku 서버에서 AWS로 이전작업을 했을때 문제없이 작동하는것을 확인해야했습니다. 이를 위해서 먼저 Heroku내의 Config Vars 즉 환경변수를 로컬로 다시 가져와야했는데 저는 모든 파일들을 Github에 업로드하기 때문에 환경변수를 로컬 코드내에 입력할수는 없다고 생각하였습니다.

     

    바로 Node.js에서 환경변수를 사용하는 방법에 대해서 검색해보니 dotenv 패키지가 나왔습니다. Weekly Downloads가 엄청난거보니 원래 많이 쓰이는 패키지였던건가봅니다. 아마 Heroku도 이 패키지를 활용하여 환경변수를 제어하지 않을까 싶었습니다.

     

     

    우선 사용법은 정말 단순합니다. 최상위 루트에 .env 파일을 생성하고 아래와 같이 변수명 = 값을 지정해주면 됩니다.

    AWS_ACCESS_KEY_ID=어쩌구저쩌구
    AWS_S3_BUCKET=어쩌구저쩌구2
    APPLE_KEY=1234567890
    
    # 이것은 주석처리

     

    처음에 이 패키지를 사용하면서 생겼던 문제점과 해결방법에 대해서 공유하고자합니다. 정말 단순한 문제이고 당연한건데, 왜 안되지 Stackoverflow에 질문하기 직전에 딱 문제점을 찾았었습니다.

     

    원래 아래처럼 코드가 작성되어있었습니다. 별다른 이유는 없었고 마지막에 패키지를 추가하였으니 코드도 마지막에 작성하였었구요.

    const express = require('express');
    const createError = require('http-errors');
    const path = require('path');
    const cookieParser = require('cookie-parser');
    const logger = require('morgan');
    const db = require("./lib/db");
    const request = require("request");
    const moment = require('moment-timezone');
    const http = require("http");
    const app = express();
    
    const dotenv = require('dotenv');
    dotenv.config();

    문제는 DB 연결에서 발생하였습니다. MySQL Workbench로도 잘 접속되고, 개인서버에서도 외부 접속이 잘 되는데, node 앱만 띄우면 db연결이 실패하는거였습니다. 이유는 당연히도.. dotenv 패키지가 db연결 이후에 선언되었고, db연결 코드에서는 아무런 데이터가 없었기때문에 연결이 되지 않는거였습니다. 그래서 처음에는 아래와 같이 코드를 수정해주었습니다.

    const express = require('express');
    const createError = require('http-errors');
    const path = require('path');
    const cookieParser = require('cookie-parser');
    const logger = require('morgan');
    
    // 수정된 부분
    const dotenv = require('dotenv');
    dotenv.config();
    
    const db = require("./lib/db");
    const request = require("request");
    const moment = require('moment-timezone');
    const http = require("http");
    const app = express();
    

     

    당연하게도 작동이 잘되었습니다. 하지만 이렇게 할경우에는 환경변수가 로드안될 가능성을 위해서 코드 맨앞줄에 작성을 하니 코드가 너무 보기가 싫어서 다른 방법이 없을까 문서를 찾아보니 역시 Preload하는 방법이 있었습니다.

     

    이 방법을 사용하면 코드내에서 dotenv 코드를 작성할 필요가 없습니다.

    node -r dotenv/config app.js

    물론 app.js에는 실행할 앱이름을 쓰면됩니다. 저의 경우에는 express 프로젝트라 ./bin/www로 대체하였습니다.

    반응형

    댓글

Designed by Tistory.