[nestjs] modules

kaitlin_k·2022년 5월 13일
0

nestjs

nestjs 공식문서를 부분적으로 정리한 내용입니다.

shared modules

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

@Global() //어디서든 사용가능한 모듈로 만들어주는 데코레이터 -> 다른 모듈에서 따로 import 안해도 됨.
@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService],
})
export class CatsModule {}
  • 생성된 모듈은 모두 공유가능하다. 만약 catsservice를 다른 모듈에서도 사용하고 싶다면, @module 데코레이터의
    exports 속성에 위와 같이 작성해주고, 사용할 모듈의 @Module 데코레이터에서 import해오면 된다.
    -> modules can export their internal providers

  • re-export도 가능하다.

  • Angular에서는 글로벌 스코프로 provider가 등록되어 어디서든 사용가능하다. 네스트는 모듈 스코프에 provider를
    캡슐화하기 때문에 먼저 import해서 써야한다. 만약, 모든 곳에서 사용가능하도록 만들고 싶다면, @Global() 데코레이터를 사용하면 된다.

    • 글로벌 모듈을 모든 곳에서 사용하는 것은 추천하지 않으며 보일러플레이트를 줄일때 사용하는 것이 적절하다. import 해오는 걸 추천!

dynamic modules

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

@Module({
  providers: [Connection],
})

export class DatabaseModule {
  static forRoot(entities = [], options?): DynamicModule {
    const providers = createDatabaseProvider(options, entities);
    return {
      global: true, // 동적 모듈을 글로벌 스코프로 만들고 싶다면 이 속성 추가
      module: DatabaseModule, 
      providers: provider,
      exports: providers,
    }
  }
}

//app.module.ts
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 {}

// 만약 동적 모듈을 import한 모듈에서 다시 export하는 경우
@Module({
  imports: [DatabaseModule.forRoot([User])],
  exports: [DatabaseModule],
})

네스트에는 dynamic module이라는 기능이 있는데, 이를 통해 모듈을 커스터마이징하거나 provider를 동적으로 설정할 수 있다.

  • forRoot()는 동기 또는 비동기의 동적 모듈을 리턴한다
  • 동적 모듈에 의해 리턴된 속성들은 @Module 데코레이터에 의해 정의된 모듈 메타 데이터를 확장(extend)한다. (rather than override) 따라서 정적으로 선언된 Connection provider와 동적으로 생성된 레포 provider가 export될 수 있는 것이다.
    • 이부분은 추가 공부 필요!
  • 이렇게 생성된 모듈은 다른 모듈에서 import해서 사용할 수 있다.
    • 만약 동적 모듈을 import한 모듈에서 다시 export하고 싶다면 export 배열에는 forRoot 메소드를 작성하지 않아도 된다.
profile
어제보다 나은 오늘을 만드는 중

0개의 댓글