본문 바로가기
BackEnd/NestJS

[NestJS] 동적 모듈 사용 시 환경 변수 파일이 복사가 안 되는 문제

by famo1245 2023. 11. 20.

문제 상황


NestJS로 배우는 백엔드 프로그래밍 도서를 이용하여 동적 모듈 관련 공부를 진행 중
/src/config/env/ 디렉토리 하위에 환경 변수 파일들을 관리하도록 했는데
앱 구동 시 환경 변수 파일을 읽지 못해 예상하지 못한 에러가 발생했다...

 

  • nest-cli.json
{
  "$schema": "https://json.schemastore.org/nest-cli",
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "assets": [{
      "include": "./config/env/*.env",
      "outDir": "./dist"
    }]
  }
}

위와 같이 .ts 파일 이외에 .env 파일을 포함하라고 적었음에도 */dist 디렉토리에 .env 파일들이 복사되지 않았던 것이다.

해결 과정


일단 문제를 해결하기 위해 2가지 방법을 시도했다.
시간이 없다면 2번째 방법을 보기를 추천한다!

 

1.package.json의 script를 수정하여 build 이후 .env 파일들을 복사한다.

"prebuild": "rimraf dist",
"copy": "@powershell mkdir ./dist/config/env && @powershell copy ./src/config/env/*.env ./dist/config/env",
"build": "nest build",
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
"start": "nest start",
"start:dev": "npm run prebuild && npm run build && npm run copy && cross-env NODE_ENV=development nest start --watch",

 

@powershell(window의 경우)을 이용하여 /dist/config 디렉토리 하위에 /env 디렉토리를 생성하고
해당 디렉토리에 .env 파일들을 모두 copy 하는 명령어를 작성했다.
위의 방식으로 해서 정상적으로 동작은 되었지만, 저렇게 수동으로 복사하지 않아도 되지 않을까라는 의문이 들었다.
Spring이나 다른 프레임워크에서도 빌드 옵션에 파일을 include 하거나 exclude 하면 알아서 동작하고
심지어 compilerOptions에 assets 항목에서 include 등을 할 수 있도록 제공하는데 왜 동작하지 않을까라는 생각도 들었다.

 

2.nest-cli.jsoncompilerOptions의 assets에 있는 watchAssets option 설정

위에서 들었던 궁금증을 해결하기 위해서 공식문서를 조금 더 살펴보기로 했다.

 

공식 문서의 설명에 보니 assets의 경우 --watch mode에서는 동작하지 않는다고 한다...
지금까지 start:dev 옵션으로 실행해왔고 이때, --watch mode 때문에 동작이 안되는 것이라고 생각해서
한 번 nest start 만으로 실행을 시켜보았으나 결과는 똑같았다..
조금 더 문서를 살펴보던 와중 "watchAssets"라는 옵션이 눈에 들어왔고,
만약 true라면 --wtach mode에서 ts 파일이 아닌 assets를 탐색한다고 되어있었다.
그래서 nest-cli.json을 아래와 같이 수정하니 해결되었다..

 

  • nest-cli.json
    { ... 
     "compilerOptions": 
         { 
         	"assets": [
                  { 
                  "include": "./config/env/*.env", 
                  "outDir": "./dist" 
            } 
        ], 
         "watchAssets": true
        } 
    }

나만의 방법으로 해결한 것은 좋았으나 다음부터는 문제가 발생하면 공식 문서를 참고하는 습관을 가져야겠다...


질문 또는 잘못된 점이 있으면 댓글로 부탁드립니다! 언제나 환영합니다~