컨트롤러와 서비스를 전부 작성했다면 해당 컨트롤러와 서비스는 자동으로 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 데코레이터에 넣을 수 있는 값들은 다음과 같습니다.
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
다음을 참고
'Node, Nest, Deno > 🦁 Nest.js' 카테고리의 다른 글
dotenv 대신 @nestjs/config을 사용해야하는 이유 + 활용 (0) | 2020.11.21 |
---|---|
DTO를 통한 검증을 위한 Pipe (Class Validator + mapped-types ...) (0) | 2020.11.19 |
Provider 중 service에 대하여 (0) | 2020.09.25 |
Controller, @Param, @Body, @Query ... (0) | 2020.09.24 |
Nest 프레임워크 소개 + 당근마켓이 소개하는 Nest의 이점 (0) | 2020.09.24 |