@Module() 데코레이터는 모듈을 기술하는 단일 객체를 인자로 받는다.
providers | Nest 인젝터에 의해 인스턴스화되고, 적어도 이 모듈 내에서 공유될 프로바이더 목록이다. |
controllers | 이 모듈에서 정의된, 인스턴스화되어야하는 컨트롤러 목록이다. |
imports | import 된 모듈의 리스트다. 만약 이 모듈에서 import한 모듈안에 정의된 provider를 사용해야 한다면 import한 모듈은 그 provider를 exports 옵션으로 넣어줘야 한다. |
exports | providers의 하위 집합으로 이 모듈에 선언된 Provider의 일부를 export할 수 있다. 이는 다른 모듈에서 이 모듈을 import 할때 사용 가능하다. |
이를 구현하는 CatModule은 다음과 같다.
// /src/cats/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 {}
마지막으로 루트 모듈에서 이 고양이 모듈을 가져와야 한다.
// /src/app.module.ts
import { Module } from '@nestjs/common';
import { CatsModule } from './cats/cats.module';
@Module({
imports: [CatsModule],
})
export class AppModule {}
예시를 통해 살펴보자
@Module({
imports: [CommonModule],
exports: [CommonModule],
})
export class CoreModule {}
위와 같은 상황에서 CoreModule을 가져오는 모듈에 대해서는 CommonModule을 가져온 것과 같은 상태가 된다. 즉, CoreModule을 가져온 모듈은 CommonModule을 활용할 수 있다는 이야기로 보인다.
아래 예제를 살펴보자
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) {}
}
하지만 순환 의존 문제가 있으므로, 모듈이 모듈에게 프로바이더로서 주입될 수는 없다고 한다.
#전역모듈과 동적모듈은 나중에 알아보기
참고: 네스트 공식문서