본문으로 건너뛰기

dotenv 파일의 환경 변수는 왜 사용하는 걸까?

 · reading-time-plural · 

연결정보는 결국 텍스트 혹은 숫자의 형태로 되어있을 텐데 .json, Object 등 사용하지 않고 왜 굳이 .env 를 사용해 관리하는 걸까?

왜 굳이 .env?

이에 대해서는 장점과 단점이 숨겨져 있다.

express 를 사용한다는 가정으로 .json vs .env 을 비교해보겠다.

.json 단점

  1. 파싱작업이 들어가야함
  2. express에서 set과 get 형식으로 작업해야함
  3. 모듈이라 스코프가 동일하지 않아서 해야 하는 작업임
  4. 데이터가 추가될 때마다 set 해줘야함
  5. 함수에서 쓸려면 req 파라미터 넘겨줘서 req.app.get 패턴으로 사용해야 하며 req 파라미터 없는 함수에선 require 를 해야 함

.env 장점

  1. 배포 시 Shell으로 변경이 가능 하여 수정이 용이하고 ShellScript를 이용해 SSH , CI/CD 에서 활약을 기대할 수 있다.
  2. express 에서는 NODE_ENV 는 환경변수를 통해 개발환경과 운영환경에 따른 설정정보를 다르게 가져올 수 있다.

이외 비밀 설정 정보 관리

DB connection, API Key 등 SCM(source code management)으로 공유되면 비밀 정보가 노출되므로 별도의 저장이 필요한데 이럴 때 사용할 수 있다.

관리 방법은?

매우 간단하다 연결정보가 포함 된 파일을 분리하고 해당 파일을 .gitignore 을 통해 버전관리를 하지 않도록 하면 된다.

적용 방법

디렉토리를 생성한다.

해당 디렉토리로 이동 후 npm init -y 을 해주도록 한다.

dotenvexpress 를 설치하도록 한다.

프로젝트 루트 경로에 .env .env.dev 를 생성한다.

데이터를 작성한다.

.env
id = 리얼환경
password = hi
.env.dev
id = 개발환경
password = hello

app.js 를 생성하고 아래의 코드를 작성합니다.

app.js
const express = require("express");
const dotenv = require("dotenv");
const path = require("path");

const app = express();

dotenv.config({
path: path.resolve(
process.cwd(),
process.env.NODE_ENV == "production" ? ".env" : ".env.dev"
),
});

app.get("/", (req, res) => {
res.send(`아이디: ${process.env.id}\n비밀번호: ${process.env.password}`);
});

app.listen(3000, () => {
console.log(`NODE_ENV: ${process.env.NODE_ENV}`);
console.log("Express Server Start");
});

node app 으로 실행 해보면 process.env.NODE_ENVundefined 으로 출력된다. 이 때문에 .env.dev 의 값을 끌어오고 있다.

환경 변수 값을 바꾸기 위해서는 해당 프로젝트 경로에서 set NODE_ENV=production 을 지정해주면 된다.

서버를 재실행하니 환경변수 NODE_ENV 가 변경되고 지정된 .env 를 불러오는걸 확인할 수 있다.

.gitignore 에 추가

.env 은 암호화된 파일이 아닙니다! 이 때문에 조회/수정이 모두 가능합니다.

.gitignore 으로 해당 파일은 버전 관리 되지 않도록 설정합니다.

config 디렉터리

관심사의 분리(Separation of Concerns) 원칙을 적용하여 설정 정보와 코드는 분리되는것이 좋다.

제품 전략에 따라 다르지만 설정에 대한 정보를 하나의 디렉터리로 모으는게 어떨까? 아마 팀원을 위해 좋은 선택일 것이다.

이 때문에 config 디렉터리에 설정 파일을 모두 밀어넣도록 해보겠다.

.env 파일의 기본 위치는 프로젝트의 루트 디렉토리이다.

하지만 dotenv.config(); 에 path를 지정하면 다른 위치에 있거나 기본 이름이 다른 .env 파일을 참조할 수도 있다.

Reference

  1. 개발과 운영 환경 구분하기
  2. 논리적인 설명
  3. 실제 만드는 사진이 있음
  4. 연결 예제 코드

parkgang