[NestJS 공식문서 정독하기] Overview - Modules
2022. 5. 24. 21:28ㆍWeb/NestJS
반응형
🔗 https://docs.nestjs.com/modules
Documentation | NestJS - A progressive Node.js framework
Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac
docs.nestjs.com
Modules
- 모듈은
@Module()
decorator를 붙힌 클래스임 - 모든 애플리케이션은 최소 하나의 모듈이 존재 (root module)
- root module을 시작으로 application graph(내부적으로 Module과 Provider 연관관계를 연결하고 의존성을 처리하는 자료구조)를 생성함
- root module 외에도 추가로 밀접하게 연관된 기능들을 모아 여러개의 모듈을 구성하는 것을 권장
@Module()
@Module()
decorator는 아래의 속성들을 갖고 있는 객체를 파라미터로 받음- providers: 인스턴스화 되어 해당 모듈에서 공유될 수 있는 Provider들
- controllers: 인스턴스화 되어 해당 모듈에서 공유될 수 있는 Controller들
- imports: import할 외부 모듈 (해당 모듈이 export한의 Provider를 사용하기 위함)
- exports: 자신의 provider들 중 자신을 import할 시 사용을 허용할 Provider들 (Provider 자체와 token 모두 사용 가능)
- 모듈은 기본적으로 자신의 Provider들을 캡슐화하여 외부에 공개하지 않음 (export를 해야 공개됨)
Feature modules
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Module({
controllers: [CatsController],
providers: [CatsService],
})
export class CatsModule {}
- 특정 기능을 기준으로 연관된 컴포넌트들을 묶은 단위
- 명확한 경계를 설정함으로써 복잡성을 관리하고 SOLID 원칙에 따라 개발하기 용이하게 해줌
- root module에
imports: [CatsModule]
형식으로 추가해줘야 함 - 모든 모듈은 기본적으로 shared module이어서 다른 어떤 모듈에서도 import 가능함
- Provider를 export 하듯이 자신이 import한 모듈을 다시 export할 수도 있음
- 모듈 클래스도 생성자로 Provider를 주입 받을 수 있음 (단, 순환 참조를 피하기 위해 모듈 클래스 자체를 주입 받을 수는 없음)
Global modules
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 {}
- 똑같은 모듈을 매번 import하는 수고를 덜기 위해 모듈을 전역 스코프로 설정할 수 있음
- 모듈에
@Global()
decorator를 붙히면 import 없이 해당 모듈의 Provider들을 사용할 수 있게됨 - Global module은 애플리케이션에 한번만 등록되어야 함
Dynamic modules
import { Module, DynamicModule } from '@nestjs/common';
import { createDatabaseProviders } from './database.providers';
import { Connection } from './connection.provider';
@Module({
providers: [Connection],
})
export class DatabaseModule {
static forRoot(entities = [], options?): DynamicModule {
const providers = createDatabaseProviders(options, entities);
return {
module: DatabaseModule,
providers: providers,
exports: providers,
};
}
}
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 {}
- Provider를 동적으로 등록하고 구성할 수 있는 모듈 (더 자세한 내용은 여기 참조)
- 위 모듈에서는
Connection
이라는 Provider를 기본적으로 정의하지만 추가적으로forRoot
메소드로 객체를 전달 받아서 추가할 수 있음 DynamicModule
을 전역 스코프로 만들고 싶으면global
속성을 true로 하면 됨forRoot
메소드의 반환값은DynamicModule
,Promise<DynamicModule>
모두 가능함
반응형