100%를 한번에 바꾸는건 어려워도 1%를 100번 바꾸는건 쉽다.

생각정리 자세히보기

개발/Node.js(Express)

[Node.js] dotenv 적용하기

dc-choi 2021. 12. 24. 15:49
반응형

dotenv란

.env라는 파일에 정보를 저장하고, 그 안의 정보를 환경변수로 등록해주는 모듈이다. 요즘 진행하는 프로젝트에 dotenv를 적용했다.

 

dotenv를 적용한 이유

1. config폴더 밑에 db에 관련된 계정정보, 메일을 전송하기 위한 계정정보를 JSON형식으로 관리했다.

2. 나중에 더 민감한 정보를 다룰때에 환경변수로 등록해서 관리하면 보안이나 관리하는데에 용이하다고 판단하여 적용했다.

 

dotenv 적용 방법

우선, dotenv모듈을 설치해야한다.

npm i dotenv

설치를 하면 패키지가 추가된것을 확인할 수 있다.

 

패키지를 추가하면 .env 파일을 프로젝트 최상단에 추가한다. .env파일의 형식은 다음과 같다.

# Server Port
PORT=9000
# Connect DataBase
MYSQL_USERNAME=test
MYSQL_PASSWORD=test
MYSQL_DATABASE=slack
MYSQL_HOST=127.0.0.1
MYSQL_DIALECT=mysql
# Mail User Account
MAIL_USER=test@gmail.com
MAIL_PASSWORD=test
# Session Cookie Sign code
SECRET=mycode

#으로 주석을 달아주면 되고 Key=Value형식으로 정보를 저장해주면 된다.

 

다음으로 공통 모듈을 생성한다.

공통 모듈을 만드는 이유는 환경변수를 사용하는 파일마다 dotenv 모듈을 불러와야 한다.

const dotenv = require('dotenv');

dotenv.config(); // .env 파일을 읽어온다.

이렇게 되면 각각 파일마다 모듈을 불러오고 설정을 적용해야하니 코드에 중복이 발생한다.

해당 공통모듈을 생성하고 위의 소스코드를 붙여넣는다. 필자는 공통모듈의 이름을 env.js로 하였다.

 

사용 예제

메일을 보내는 객체와, Sequelize에 환경변수를 적용시켜봤다.

// mail.js

const nodemailer = require('nodemailer');
// const senderInfo = require('../config/email.json'); // 이전 소스코드
require('../config/env');

let mailSender = {
  sendGmail(param) {
    let transporter = nodemailer.createTransport({
      service: 'gmail',
      prot: 587,
      host: 'smtp.gmlail.com',  
      secure: false,  
      requireTLS: true ,
      auth: {
      	/* 이전 소스코드
        user: senderInfo.user,
        pass: senderInfo.pass
        */
        user: process.env.MAIL_USER,
        pass: process.env.MAIL_PASSWORD
      }
    });
    let mailOptions = {
      from: 'slock_clone_coding@coding.org',
      to: param.toEmail,
      subject: param.subject,
      text: param.text
    };
     
    transporter.sendMail(mailOptions, (error, info) => {
      if (error) {
        console.log(error);
      } else {
        console.log('Email sent: ' + info.response);
      }
    });

  }
}

module.exports = mailSender;
// models/index.js

const Sequelize = require('sequelize');
const initModels = require("./init-models");
/* 이전 소스코드
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config.json')[env];
*/
require('../config/env');

const config = {
	username: process.env.MYSQL_USERNAME,
	password: process.env.MYSQL_PASSWORD,
	database: process.env.MYSQL_DATABASE,
	host: process.env.MYSQL_HOST,
	dialect: process.env.MYSQL_DIALECT,
};
let db = {};

const sequelize = new Sequelize(config.database, config.username, config.password, config);

db.sequelize = sequelize;
db.models = initModels(sequelize);

module.exports = db;

 

지금까지 dotenv 모듈 적용시키는것에 대해서 알아보았다. 추가적으로 VSCode에서 작업을 진행한다면,

DotENV라는 플러그인을 설치하면 가독성이 조금 더 좋아진다.

 

하나하나 천천히 프로젝트 구조를 잡아나가야겠다!

반응형