NestJS Modules

paduck·2024년 6월 11일
0

NestJS

목록 보기
5/24

@Module() 데코레이터로 연결되며
Application 구조를 정의하기 위한 메타데이터를 가지고 있음

Root 모듈(최상단) 을 통해 Nest 구조를 그림

  • Module 과 Provider 의 관계와 의존성을 해결하기 위한 데이터임
  • Module 을 통해 구성 요소 구현
  • 연관된 기능을 묶음으로 캡슐화

Module() 내부 속성

providers인스턴스화 되어 공유되는 모듈
controllers현재 모듈 내 인스턴스화 되어야 할 controllers 집합
imports현재 모듈 내 필요한, provider 를 export 하는 module
exports현재 모듈에서 제공하는 provider 집합, 다른 모듈에서 현재 모듈의 필요한 부분으로 provider 자체 혹은 token(provide value)
  • provider 자체적으로 캡슐화함
  • 자체 모듈에 속하지 않거나, import 하지 않은 건 전달할 수 없음
  • export 을 interface or API 로 간주

Feature modules

기능에 연관된 코드들끼리 모아놓는 것

  • 복잡성을 줄이고, SOLID 원칙 유지
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {}

CLI를 사용하여 모듈을 생성하려면 $ nest g module cats명령을 실행하기만 하면 됩니다.

import { Module } from '@nestjs/common';
import { CatsModule } from './cats/cats.module';

@Module({
  imports: [CatsModule],
})
export class AppModule {}

Shared modules

Module 은 기본 singleton 이며,
공통 instance 를 공유할 수 있음

  • 자동적으로 Shared modules 임
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService] // shared modules
})
export class CatsModule {}

Module re-exporting

@Module({
  imports: [CommonModule],
  exports: [CommonModule],
})
export class CoreModule {}

이로 인해, CoerModule 을 통해 CommonModule 의 provider 에 접근이 가능

Dependency injection

모듈 자체적으로도 provider 를 주입할 수 있음

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) {}
}

주로 Config 에 적용되는데, 문자 그대로 해당 Module 이 생성될 때 init 됨

  • 다만, 순환 종속성으로 인해 Module 클래스 자체로 주입할 수 없음

Global modules

모듈 범위 내에서 캡슐화되기 때문에, 가져오지 않으면 사용할 수 없음
@Global() 데코레이터로 전역적으로 사용 가능

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 {}
  • root or core 모듈에 한 번만 등록되어야 함

    모든 것을 글로벌하게 만드는 것은 좋은 디자인 결정이 아닙니다. 불필요한 상용구의 양을 줄이기 위해 전역 모듈을 사용할 수 있습니다. Imports은 일반적으로 소비자가 모듈의 API를 사용할 수 있도록 하는 데 선호되는 방법입니다.

Dynamic modules

provider 를 동적으로 등록할 수 있게 해주는 custom module

profile
학습 velog

0개의 댓글