환경 변수, 파일을 사용하는 이유

- 프로젝트에서 공통적으로 사용하는 변수들을 파일을 통해 쉽게 관리할 수 있다

- 코드에 secret key 값을 노출시키지 않기 때문에 보안 상 이점이 있다

- 운영(prod), 개발(dev), 로컬(local) 환경에 맞는 다른 변수를 사용할 수 있다

 


패키지 설치

$ npm i @nestjs/config

 

src/app.module.ts

import { ConfigModule } from '@nestjs/config';
...

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      cache: true
    }),
    ....]
...

루트 모듈의 설정을 통해 환경 변수에 접근할 수 있도록 할 수 있다

isGlobal: true 속성을 통해 다른 모듈에서 사용할 수 있도록 설정하였고, cache: true 속성을 통해 한 번 읽은 환경 변수의 값을 캐싱하여 읽기 속도를 향상 시킬 수 있다

 

위 설정만으로 .env 파일에 선언된 속성을 바로 사용할 수 있다

 

프로젝트 루트 경로/.env

NODE_ENV=DEV
SERVER_PORT=3000

 

 

main.ts

	...

const SERVER_PORT = process.env.SERVER_PORT 

async function bootstrap() {
	...
  await app.listen(SERVER_PORT);
} 
bootstrap();

개발 환경에 따른 환경 변수 사용 방법

 

.env

NODE_ENV=DEV

 

src/config/dev.yaml 또는 prod.yaml

SERVER:
  PORT: 3000

DB:
  MYSQL:
    HOST: 127.0.0.1
    USER: root
    PASSWORD: root
    PORT: 3306

 

src/config/config.ts

import { readFileSync } from 'fs'
import * as yaml from 'js-yaml'
import { join } from 'path'

const YAML_CONFIG_PROD = 'prod.yaml'
const YAML_CONFIG_DEV = 'dev.yaml'

export default () => {
    return yaml.load(
        process.env.NODE_ENV === 'DEV' ?
            readFileSync(join(__dirname, YAML_CONFIG_DEV), 'utf8') :
            readFileSync(join(__dirname, YAML_CONFIG_PROD), 'utf8')
    ) as Record<string, any>
}

 

src/app.module.ts

...
import config from './config/config';

@Module({
  imports: [ConfigModule.forRoot({
      isGlobal: true,
      cache: true,
      load: [config]
    })],
  ...
})

 

src/main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ConfigService } from '@nestjs/config';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  const configService = app.get(ConfigService);
  const SERVER_PORT = configService.get<string>('SERVER.PORT');
  
  await app.listen(SERVER_PORT);
} 
bootstrap();

 

 

$ npm run start:dev

서버 실행

 

yaml 파일은 compile 시에, dist 폴더로 복사되지 않기 때문에 파일을 찾지 못하는 문제가 발생

 

패키지 설치

$ npm i cpx

 

 

package.json

...
"scripts": {
    "copy-files": "cpx \"src/config/*.yaml\" dist/config/",
    ...
    "start": "npm run copy-files && nest start",
    "start:dev": "npm run copy-files && nest start --watch",
    "start:debug": "npm run copy-files && nest start --debug --watch",
    "start:prod": "npm run copy-files && node dist/main",
    ...
  },
  ...

컴파일 시에 dist/config 경로에 src/config/*.yaml 파일이 위치할 수 있도록 복사해준다

 

 

nest-cli.json  

{
  "$schema": "https://json.schemastore.org/nest-cli",
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "deleteOutDir": false
  }
}

package.json - scripts 수정 후 실행해도 똑같은 오류가 발생한다. 파일이 복사되지만 바로 파일이 삭제되기 때문이다

deleteOutDir 속성 값을  true false 로 변경해 준다

 


참고 링크

https://codegear.tistory.com/82

https://www.daleseo.com/nestjs-configuration/

https://velog.io/@kimjiwonpg98/NEST-.env-%ED%8C%8C%EC%9D%BC-%EA%B4%80%EB%A6%AC%EB%B2%95-feat.-nestjsconfig

'JavaScript > NestJS' 카테고리의 다른 글

[NestJS] Swagger 적용하기  (0) 2023.08.21
[NestJS] TypeORM CRUD 생성하기 (User)  (0) 2023.08.21
[NestJS] Logging 하기  (0) 2023.08.19
[NestJS] Jest 테스트하기  (0) 2023.08.17
[NestJS] 경로 alias 설정하기  (0) 2023.08.17

+ Recent posts