TIL

TIL 7: 환경변수와 빌드

셈인 2023. 8. 23. 22:47

들어가며

최근 DR 시스템을 구축해야 하는 이슈가 있었는데 배포 환경에 DR을 추가하고 세팅하는 작업을 맡게 되었다.
작업 중 angular를 사용하는 client와 nest를 사용하는 middleware의 빌드 코드가 다른 것을 보고 의문을 가지게 되었다.

 

* DR(Disaster Recovey)란? 재난 또는 각종 요인으로 인해 서비스나 시스템이 중단됐을 경우, 이를 정상화시키는 행위

 

문제의 코드

// Angular package.json
"build:prod": "ng build --configuration=prod"

// NestJs package.json
"build": "nest build"

왜 nest는 빌드할 때 환경변수를 사용하지 않을까? 🤔

 

Angular의 경우

프로젝트를 빌드할 때 --configuration 옵션이 있으면, angular.json에 정의되어 있는 환경 파일로 교체되어 빌드된다.
즉, 빌드 시점에 환경 변수가 정해진 값으로 교체된다.

// angular.json
"configurations": {
  "prod": {
    "fileReplacements": [
        {
          "replace": "src/environments/environment.ts",
          "with": "src/environments/environment.prod.ts"
        }
      ],
      …

 

NestJs의 경우

우리 팀의 server(middleware)는 현재 PM2를 사용하고 있으며, PM2는 ecosystem.config.js에 정의된 환경 변수를 보고 알맞은 .env를 적용한다.
즉, PM2에서 애플리케이션이 실행되는 런타임에 환경 변수가 정해진 값으로 교체된다.

 

* PM2란? node.js용 프로세스 매니저

// pm2 start
pm2 start ecosystem.config.js --env prod

// ecosystem.config.js
// NODE_ENV에 정의된 값과 동일한 env 파일을 사용한다.
module.exports = {
    apps: [{
        name: 'app',
        script: './dist/main.js',
        env_prod: {
            NODE_ENV: 'prod'
        }
    }]
};

 

마치며

로그 확인 외에는 서버 쪽을 다룰 일이 거의 없다 보니 기본적인 개념도 많이 부족하고, 자주 사용을 안 하니까 알던 것도 까먹는 것 같다.

지금 사용하거나 배운 개념을 정리해서 잊어버리지 않도록 노력해야겠다.

 

출처

https://angular.kr/guide/build
https://pm2.keymetrics.io/docs/usage/environment/