본문으로 바로가기

Module에 대한 이해와 간단한 DI

category Node, Nest, Deno/🦁 Nest.js 2020. 9. 25. 22:35

컨트롤러와 서비스를 전부 작성했다면 해당 컨트롤러와 서비스는 자동으로 appMoudule에 들어가있을 겁니다.

그러나 이렇게 개별 코드가 appModule에 들어가기보다, 별도의 모듈을 만든 후 해당 모듈을 다 합쳐 마지막에 appModule에 넣어주는 분리 방식이 좋습니다.

 

Module은 기능별로 분리하는 것이 좋고,

appModule은 전체 Module을 응집하는 최상위 모듈이라고 이해하시면 됩니다.

 

nest cli를 통해 모듈 하나를 만들어보겠습니다.

nest g mo movies

movies.module.ts가 생겼습니다.

내용물은 텅 비어 있구요

import { Module } from '@nestjs/common';

@Module({})
export class MoviesModule {}

 

이제 작성한 Controller와 Service를 데코레이터에 지정해주면 됩니다. 굳.

import { Module } from '@nestjs/common';
import { MoviesController } from './movies.controller';
import { MoviesService } from './movies.service';

@Module({
  controllers: [MoviesController],
  providers: [MoviesService],
})
export class MoviesModule {}

 

이렇게 만든 모듈을 최상단의 app.modules.ts에서는 아래와 같이 imports 부분에 넣어주면 됩니다.

import { Module } from '@nestjs/common';
import { MoviesModule } from './movies/movies.module';
import { AppController } from './app.controller';

@Module({
  imports: [MoviesModule],
  controllers: [AppController],
  providers: [],
})
export class AppModule {}

 

@Module

Module의 위계는 알았는데 구체적으로 @Module은 무슨 일을 할까요?

@Module 데코레이터에 넣을 수 있는 값들은 다음과 같습니다.

docs.nestjs.com/modules

providers Nest injector(@Injectable)에 의해 인스턴스화되고 적어도 이 모듈에서 공유 될 수있는 provider
controllers 컨트롤러. (* 주의  gql resolver는 provider입니다.)
imports 이 모듈에 필요한 provider들. 다른 모듈에서 export된 내용들이 여기 들어간다.
exports 해당 모듈에서 만들어진 providers의 일부. 이 모듈을 다른 모듈에서 사용할 수 있도록 exports 함.

 

 

공유 모듈

 

Nest에서 모듈은 기본적으로 싱글 톤 이므로 여러 모듈간에 쉽게 공급자의 동일한 인스턴스를 공유 할 수 있습니다.

다음 같이 CatsService를 exports하면 다른 모듈에서 CatsMoudule을 import한 후 CatsServer를 사용할 수 있게 됩니다.

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 {}

 

모듈 다시 내보내기

 

당연히 import한 후 곧바로 exports하면 모듈을 다시 내보낼 수 있습니다.

CoreModule을 imports하는 다른 모듈에서 CommonModule을 사용할 수 있게 되겠죠.

 

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

 

글로벌 모듈 

아래와 각ㅌ이 @Global() 모듈을 사용하면 글로벌하게 사용할 수 있는 모듈이 됩니다. 

모듈간 imports/exports를 거치지 않고 곧바로 provider를 사용하고 싶다면 해당 모듈을 global하게 만들어야 합니다.

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 {}

 

 

Dynamic Module

 

다음을 참고

 

darrengwon.tistory.com/979

 

dynamic-modules 만들기

docs.nestjs.com/modules#dynamic-modules docs.nestjs.com/fundamentals/dynamic-modules#dynamic-modules Documentation | NestJS - A progressive Node.js framework Nest is a framework for building efficie..

darrengwon.tistory.com

 

 

darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체