[NestJS 공식문서 정독하기] Overview - Modules

2022. 5. 24. 21:28Web/NestJS

반응형
🔗  https://docs.nestjs.com/modules
 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac

docs.nestjs.com

Modules

  • 모듈은 @Module() decorator를 붙힌 클래스임
  • 모든 애플리케이션은 최소 하나의 모듈이 존재 (root module)
  • root module을 시작으로 application graph(내부적으로 Module과 Provider 연관관계를 연결하고 의존성을 처리하는 자료구조)를 생성함
  • root module 외에도 추가로 밀접하게 연관된 기능들을 모아 여러개의 모듈을 구성하는 것을 권장

@Module()

  • @Module() decorator는 아래의 속성들을 갖고 있는 객체를 파라미터로 받음
    • providers: 인스턴스화 되어 해당 모듈에서 공유될 수 있는 Provider들
    • controllers: 인스턴스화 되어 해당 모듈에서 공유될 수 있는 Controller들
    • imports: import할 외부 모듈 (해당 모듈이 export한의 Provider를 사용하기 위함)
    • exports: 자신의 provider들 중 자신을 import할 시 사용을 허용할 Provider들 (Provider 자체와 token 모두 사용 가능)
  • 모듈은 기본적으로 자신의 Provider들을 캡슐화하여 외부에 공개하지 않음 (export를 해야 공개됨)

Feature modules

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {}
  • 특정 기능을 기준으로 연관된 컴포넌트들을 묶은 단위
  • 명확한 경계를 설정함으로써 복잡성을 관리하고 SOLID 원칙에 따라 개발하기 용이하게 해줌
  • root module에 imports: [CatsModule] 형식으로 추가해줘야 함
  • 모든 모듈은 기본적으로 shared module이어서 다른 어떤 모듈에서도 import 가능함
  • Provider를 export 하듯이 자신이 import한 모듈을 다시 export할 수도 있음
  • 모듈 클래스도 생성자로 Provider를 주입 받을 수 있음 (단, 순환 참조를 피하기 위해 모듈 클래스 자체를 주입 받을 수는 없음)

Global modules

import { Module, Global } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Global()
@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService],
})
export class CatsModule {}
  • 똑같은 모듈을 매번 import하는 수고를 덜기 위해 모듈을 전역 스코프로 설정할 수 있음
  • 모듈에 @Global() decorator를 붙히면 import 없이 해당 모듈의 Provider들을 사용할 수 있게됨
  • Global module은 애플리케이션에 한번만 등록되어야 함

Dynamic modules

import { Module, DynamicModule } from '@nestjs/common';
import { createDatabaseProviders } from './database.providers';
import { Connection } from './connection.provider';

@Module({
  providers: [Connection],
})
export class DatabaseModule {
  static forRoot(entities = [], options?): DynamicModule {
    const providers = createDatabaseProviders(options, entities);
    return {
      module: DatabaseModule,
      providers: providers,
      exports: providers,
    };
  }
}
import { Module } from '@nestjs/common';
import { DatabaseModule } from './database/database.module';
import { User } from './users/entities/user.entity';

@Module({
  imports: [DatabaseModule.forRoot([User])],
})
export class AppModule {}
  • Provider를 동적으로 등록하고 구성할 수 있는 모듈 (더 자세한 내용은 여기 참조)
  • 위 모듈에서는 Connection이라는 Provider를 기본적으로 정의하지만 추가적으로 forRoot 메소드로 객체를 전달 받아서 추가할 수 있음
  • DynamicModule을 전역 스코프로 만들고 싶으면 global 속성을 true로 하면 됨
  • forRoot 메소드의 반환값은 DynamicModule, Promise<DynamicModule> 모두 가능함
반응형