nestjs
nestjs 공식문서를 부분적으로 정리한 내용입니다.
import { Global, Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Global() //어디서든 사용가능한 모듈로 만들어주는 데코레이터 -> 다른 모듈에서 따로 import 안해도 됨.
@Module({
controllers: [CatsController],
providers: [CatsService],
exports: [CatsService],
})
export class CatsModule {}
생성된 모듈은 모두 공유가능하다. 만약 catsservice를 다른 모듈에서도 사용하고 싶다면, @module 데코레이터의
exports
속성에 위와 같이 작성해주고, 사용할 모듈의 @Module
데코레이터에서 import해오면 된다.
-> modules can export their internal providers
re-export도 가능하다.
Angular에서는 글로벌 스코프로 provider가 등록되어 어디서든 사용가능하다. 네스트는 모듈 스코프에 provider를
캡슐화하기 때문에 먼저 import해서 써야한다. 만약, 모든 곳에서 사용가능하도록 만들고 싶다면, @Global()
데코레이터를 사용하면 된다.
import
해오는 걸 추천!//database.module.ts
import { Module, DynamicModule } from '@nestjs/common';
import { createdDatabaseProviders } from './database.providers';
import { Connection } from './connection.provider';
@Module({
providers: [Connection],
})
export class DatabaseModule {
static forRoot(entities = [], options?): DynamicModule {
const providers = createDatabaseProvider(options, entities);
return {
global: true, // 동적 모듈을 글로벌 스코프로 만들고 싶다면 이 속성 추가
module: DatabaseModule,
providers: provider,
exports: providers,
}
}
}
//app.module.ts
import { Module } from '@nestjs/common';
import { DatabaseModule } from './database/database.module';
import { User } from './users/entities/user.entity';
@Module({
imports: [DatabaseModule.forRoot([User])],
})
export class AppModule {}
// 만약 동적 모듈을 import한 모듈에서 다시 export하는 경우
@Module({
imports: [DatabaseModule.forRoot([User])],
exports: [DatabaseModule],
})
네스트에는 dynamic module이라는 기능이 있는데, 이를 통해 모듈을 커스터마이징하거나 provider를 동적으로 설정할 수 있다.
forRoot()
는 동기 또는 비동기의 동적 모듈을 리턴한다 @Module
데코레이터에 의해 정의된 모듈 메타 데이터를 확장(extend)한다. (rather than override) 따라서 정적으로 선언된 Connection provider와 동적으로 생성된 레포 provider가 export될 수 있는 것이다.