dotenv와 .env 그리고 환경변수

Jindolph·2024년 8월 1일

환경 변수 관리와 설정: dotenv 패키지 사용 및 주의사항

Node.js 프로젝트를 개발하면서 환경 변수를 관리하고 설정하는 것은 매우 중요합니다.
이 글에서는 dotenv 패키지의 개념과 기본적인 사용방법, 시스템 환경변수와 .env 파일 간의 우선적용 순위, 그리고 상수 선언보다 dotenv.config()를 이후에 실행했을 때 나타나는 문제점에 대한 주의를 다루겠습니다.

1. dotenv 패키지의 개념 및 기본적인 사용방법

개념

dotenv 패키지는 .env 파일에 정의된 환경 변수를 Node.js 환경에 로드해주는 라이브러리입니다. 이는 개발, 테스트, 프로덕션 등 여러 환경에서 필요한 설정 값을 코드에 직접 포함하지 않고 환경 변수로 관리할 수 있도록 도와줍니다.

설치

npm install dotenv

사용방법

프로젝트 루트에 .env 파일을 생성하고 필요한 환경 변수를 정의합니다.

PORT=3000
JWT_SECRET=your_jwt_secret_key

애플리케이션 코드의 최상단에서 dotenv 패키지를 로드하여 환경 변수를 설정합니다.

// .env 파일에서 환경 변수를 로드합니다.
require('dotenv').config();

const express = require('express');
const app = express();

const PORT = process.env.PORT || 3000;
const jwtSecret = process.env.JWT_SECRET;

app.get('/', (req, res) => {
  res.send('Hello, World!');
});

app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
  console.log(`JWT Secret: ${jwtSecret}`);
});

2. 시스템 환경변수와 .env 파일 간 우선적용 순위

dotenv 패키지를 사용하면 .env 파일에 정의된 환경 변수를 Node.js 프로세스에 로드합니다. 그러나 시스템 환경 변수와 .env 파일 간의 우선적용 순위는 다음과 같습니다:

  1. 시스템 환경 변수: 시스템 환경 변수는 .env 파일보다 우선합니다. 즉, 동일한 키의 환경 변수가 시스템 환경 변수와 .env 파일 모두에 정의되어 있는 경우, 시스템 환경 변수 값이 사용됩니다.
  2. .env 파일: 시스템 환경 변수로 설정되지 않은 환경 변수는 .env 파일에서 설정된 값을 사용합니다.

예시:

# .env 파일
PORT=3000
JWT_SECRET=your_jwt_secret_key

시스템 환경 변수 설정:

export PORT=4000

Node.js 코드:

require('dotenv').config();

console.log('PORT:', process.env.PORT); // 4000
console.log('JWT_SECRET:', process.env.JWT_SECRET); // your_jwt_secret_key

3. 상수 선언보다 dotenv.config() 를 이후에 실행했을 때 나타나는 문제점에 대한 주의

dotenv.config()를 상수 선언 이후에 실행하면 환경 변수가 올바르게 로드되지 않아, 예상치 못한 동작이 발생할 수 있습니다. 이는 특히 상수를 환경 변수로 초기화하는 경우에 문제가 됩니다.

문제 상황

dotenv.config()가 상수 선언보다 나중에 실행되는 경우:

const express = require('express');
const { generateToken } = require('./middlewares/auth');

// .env 파일에서 환경 변수를 로드합니다.
require('dotenv').config();

const app = express();
const PORT = process.env.PORT || 3000;

app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

auth.js 파일:

const jwt = require('jsonwebtoken');

const jwtSecret = process.env.JWT_SECRET;

const generateToken = (user) => {
  return jwt.sign(user, jwtSecret, { expiresIn: '1h' });
};

module.exports = {
  generateToken
};

이 경우 generateToken 함수가 초기화될 때 process.env.JWT_SECRETundefined일 수 있습니다.

해결 방법

dotenv.config()를 최상단에 위치시켜야 합니다.

// .env 파일에서 환경 변수를 로드합니다.
require('dotenv').config();

const express = require('express');
const { generateToken } = require('./middlewares/auth');

const app = express();
const PORT = process.env.PORT || 3000;

app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

auth.js 파일:

const jwt = require('jsonwebtoken');

const jwtSecret = process.env.JWT_SECRET;

const generateToken = (user) => {
  return jwt.sign(user, jwtSecret, { expiresIn: '1h' });
};

module.exports = {
  generateToken
};

결론

환경 변수를 관리하는 것은 애플리케이션 개발에 있어 중요한 부분입니다. dotenv 패키지를 사용하여 환경 변수를 효율적으로 관리하고, 시스템 환경 변수와 .env 파일 간의 우선적용 순위를 이해하며, dotenv.config()를 최상단에 위치시켜 환경 변수가 올바르게 로드되도록 주의하는 것이 필요합니다. 이러한 원칙을 준수하면 애플리케이션의 설정 값을 더욱 안전하고 유연하게 관리할 수 있습니다.

profile
Hello World!

0개의 댓글