Nestjs 공식문서 Modules

송은우·2022년 3월 24일
0

Modules

Module은 @Modules()데코레이터를 사용해서 시작할 수 있다.
@Module데코레이터는 메타데이터를 제공해서 application structure를 만들어줌.
nestjs modules공식문서 img
모든 application은 최소 1개(rootmodule)가 있다.
module로 캡슐화를 하면 좋음

  1. providers(provider는 인스턴트화 되어 이 모듈에서 움직여짐)
  2. controllers(controller는 이 모듈에서 정의되어서 인스턴스화 됨)
  3. imports(imported module은 export provider중에 이 모듈에서 필요한 것을 의미함)
  4. exports(provider의 하위 집합으로, 데코레이터를 사용 중인 모듈이 제공받은 Provider의 일부를 내보낼 수 있다. 이는 다른 모듈에서 import 할 때 사용된다.)
    가 있음.

nestjs는 기본적으로 모듈을 캡슐화 함. 직접 포함되어 있지 않거나, import된 모듈에서 내보내지 않은 provider를 주입할 수 없다. 모듈에서 export한 provider를 모듈의 public interface나 api로 간주할 수 있다.

등록을 한 이후에 마지막에 해야할 것은 root module에 module을 등록하는 과정
singleton 이기 때문에 편하게 모듈간에 공유할 수 있음

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

@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService]
})
export class CatsModule {}

module export하는 과정

module re-exporting

@Module({
  imports: [CommonModule],
  exports: [CommonModule],
})
export class CoreModule {}

이런 과정으로 CommonModule을 import하자마자 export하는 것도 가능함

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

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {
  constructor(private catsService: CatsService) {}
}

모듈에서도 우리는 constructor에 provider를 써먹을 수 있음
단 Module 자체는 순환 참조를 막기 위해서 Module을 providers로 등록할 수가 없다.
Angular은 기본적으로 provider가 전역 상태에서 쓸 수 있지만, Nest는 캡슐화에 더 신경을 썼기에 global상태로 쓰려면 @global 을 붙혀야 한다.
이때 단 한 번만 사용되어야 하기에, 보통 root module에서 global상태를 등록한다.

Dybamic Module
커스텀 한 모듈을 만들 수 있다. provider를 동적으로 등록할 수 있도록 함.

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 {
      global:false
      module: DatabaseModule,
      providers: providers,
      exports: providers,
    };
  }
}

간단한 dynamic module예제
Module에서 static 메서드로 forRoot라는 것을 만들고, return으로 module, providers, exports를 반환하는 방법으로 동적으로 생성이 가능하다.
이때 forRoot 메서드는 async, sync가 가능하다
global여부도 설정 가능

import { Module } from '@nestjs/common';
import { DatabaseModule } from './database/database.module';
import { User } from './users/entities/user.entity';

@Module({
  imports: [DatabaseModule.forRoot([User])],
  exports: [DatabaseModule],
})
export class AppModule {}

같은 부분으로 re-export를 해낼 수 있음
동적 모듈을 re-export하고 싶다면, 그냥 forRoot만 빼고 export가능함

여기를 보면 좋음

profile
학생의 마음가짐으로 최선을 다하자

0개의 댓글