모듈은 @Module()
데코레이터로 주석이 달린 클래스입니다.
각 애플리케이션에는 최소한 하나의 모듈인 루트 모듈이 있습니다 .
루트 모듈은 Nest가 애플리케이션 그래프를 구축하는 시작점입니다.
대부분의 애플리케이션에서 결과 아키텍처는 각각 밀접하게 관련된 기능 집합을 캡슐화하는 여러 모듈을 사용합니다 .
@Module()
데코레이터는 다음 속성을 사용합니다.
$ nest g module [module-name]
해당 cli로 모듈을 생성하면 다음과 같은 모듈 클래스가 만들어지고 AppModule에 자동으로 등록됩니다.
cats.module.ts 파일
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Module({
controllers: [CatsController],
providers: [CatsService],
})
export class CatsModule {}
app.module.ts 파일
@Module({
imports: [CatsModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
모든 모듈은 기본적으로 공유 모듈 입니다. 따라서 다른 모든 모듈에서 해당 모듈을 재사용할 수 있습니다.
export
키워드를 통해 cats.module.ts
의 CatsService
를 다른 모듈에서 인스턴스를 공유하여 사용할 수 있습니다.
@Module({
controllers: [CatsController],
providers: [CatsService],
**exports: [CatsService]**, //해당 부분 추가
})
export class CatsModule {}
이후 다른 모듈에서 import
키워드를 통해 CatsService
provider를 가져와 사용할 수 있습니다.
이때 중요한 것은 import 대상이 Service가 아닌 Module 입니다.
NestJS에선 모듈 단위로 import가 가능합니다.
@Module({
import: [CatsModule],
})
export class OtherModule {}
전역으로 모듈을 내보내고 사용할 수 있습니다.
NestJS에선 모든 것을 글로벌화 하는 것을 지양하고 있습니다.
다음과 같이 @Global
키워드를 통해 전역으로 모듈을 내보낼 수 있습니다.
@Global
@Module({
controllers: [CatsController],
providers: [CatsService],
**exports: [CatsService]**, //해당 부분 추가
})
export class CatsModule {}
이후에 다른 모듈에선 import 없이 바로 해당 모듈을 사용할 수 있게 됩니다.