본문 바로가기

[NestJS]

[NestJS] - 4편 (모듈~config파일)

반응형

NestJS - 4편 (모듈~config파일)

모듈(Module) 개념

모듈이란? 클래스나 함수같은 한가지 일만하는 컴포넌트가 아닌, 여러 컴포넌트를 조합해 더 큰 작업을 수행하는 단위.

우리가 그동안 다른 곳에서 작성한 파일을 불러와 import가 가능했던 것은
작성했던 파일의 아래에서 export 명령어를 통해 내보내줬기 때문이다.

전역 모듈 사용이 좋은 방법은 아니지만 꼭 필요하다면 선언하는 방법도 있다.

@Global()
@Module({
  providers: [CommonService],
  exports: [CommonService],
})
export class CommonModule { }

동적 모듈(Dynamic Module)

동적 모듈이란? 모듈이 생성될 때 동적으로 어떠한 변수들이 정힌다.
대표적으로 Config 모듈이있다. (dotenv)

NodeJS의 대표 Config 모듈 (dotenv)

설치 : JS-npm i dotenv Typescript-npm i --save-dev @types/dotenv
이용 : 루트 디렉토리에 .env 확장자 파일 생성 후 쓰고싶은 곳에서 import * as dotenv from 'dotenv';

예제

  1. .env파일 생성
  • .development.env파일
    DATABASE_HOST=local
  • .production.env파일
    DATABASE_HOST=prod-db
  1. package.json 파일 scripts 수정

    "scripts": {
        ...
        "start:dev": "NODE_ENV=development nest start --watch",
        ...
    }
  2. NODE_ENV에 따라 설정하기

    import { NestFactory } from '@nestjs/core';
    import { AppModule } from './app.module';
    import * as dotenv from 'dotenv';
    import * as path from 'path';
    
    dotenv.config({
    path: path.resolve(
        (process.env.NODE_ENV === 'production') ? '.production.env'
        : '.development.env'
    )
    });
    
    async function bootstrap() {
    const app = await NestFactory.create(AppModule);
    await app.listen(3000);
    }
    bootstrap();
  3. 원하는곳에서 불러와 사용하기

    @Controller()
    export class AppController {
    
    @Get()
    getHello(): string {
        return process.env.DATABASE_HOST;
    }
    }

Nest에서 Config 사용하기

Nest에서는 dotenv를 내부적으로 사용하는 @nestjs/config를 제공한다.

설치 : npm i --save @nestjs/config

위의 dotenv사용법과 2번까지는 똑같고 3번부터는 조금 다르다.

  1. NODE_ENV에 따라 설정하기

    import { ConfigModule } from '@nestjs/config';
    
    @Module({
    imports: [ConfigModule.forRoot({
        envFilePath: (process.env.NODE_ENV === 'production') ? '.production.env'
        : '.development.env'
        })],
        controllers: [AppController],
        providers: [AppService, ConfigService],
    })
    export class AppModule { }
  2. 원하는 곳에서 불러와 사용하기

    import { Controller, Get } from '@nestjs/common';
    import { ConfigService } from '@nestjs/config';
    
    @Controller()
    export class AppController {
        constructor(
            private readonly configService: ConfigService,
        ) { }
    
        @Get('/db-host-from-config')
        getDatabaseHostFromConfigService(): string {
            return this.configService.get('DATABASE_HOST');
        }
    }

참조 : NestJS로 배우는 백엔드 프로그래밍

반응형