참고
Module 이란
@Module()
데코레이터가 붙은 클래스
Nest가 어플리케이션 구조를 만드는데 사용하는 메타데이터를 제공한다.
하나 이상의 Module이 존재하며 이들은 계층 구조를 이룬다.
최상위 Module은 Root Module로서 애플리케이션을 생성하는 NestFactory.create 메소드의 파라미터로 사용된다.
사용법
기본 사용법
@Module()
데코레이터의 아래 프로퍼티를 가진 객체를 프로퍼티로 가진다.
* providers: Nest injector에 의해 초기화 될 provider 목록
* controllers: 해당 모듈에서 초기화 되어 사용될 controller 목록
* imports: 해당 모듈에서 필요한 모듈 목록
* exports: providers에 입력한 provider 중 다른 모듈에서도 사용됟 수 있도록 export하는 provider 목록
아래는 예시로 UsersModule 모듈은 UsersService를 다른 모듈에서 사용할 수 있도록 export 하였다. TreesModule 모듈은 UsersModule를 사용하기 위해 import 하였다. 그리고 해당 모듈과 provider TreesService를 export 하였다(re-exporting).
// users.module.ts
import { Module } from '@nestjs/common';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
@Module({
controllers: [UsersController],
providers: [UsersService],
imports: [],
exports: [UsersService],
})
export class UsersModule {}
// trees.module.ts
import { Module } from '@nestjs/common';
import { TreesService } from './trees.service';
import { TreesController } from './trees.controller';
import { UsersModule } from 'src/users/users.module';
@Module({
controllers: [TreesController],
providers: [TreesService],
imports: [UsersModule],
exports: [UsersModule, TreesService],
})
export class TreesModule {}
Dependency injection
모듈 클래스에 provider를 inject 할 수 있다(ex. configuration 목적). 그러나 순환참조 문제로 모듈 클래스는 provider로 inject 할 수 없다.
import { Module } from '@nestjs/common';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
@Module({
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {
constructor(private usersService: UsersService) {}
}
Global modules
@Global()
데코레이터 사용
DB 커넥션과 같이 모든 곳에서 사용되어야 하는 provider의 경우 모듈을 전역으로 만들어 import 하지 않고 사용할 수 있도록 할 수 있다.
@Global()
@Module({
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}
Dynamic modules
provider를 동적으로 register하고 configure 가능하도록 한다. 추가예정