NestJs 스터디(3)

연꽃·2022년 2월 16일
1

NestJs

목록 보기
3/7
post-thumbnail

모듈(Module)

🏀 모듈이란?

  • 모듈은 @Module() 데코레이터가 달린 클래스로서, Nest가 애플리케이션 구조를 구축하는 데에 필요한 메타데이터를 제공합니다.
  • 단일 작업만을 수행하는 것이 아니라, 여러 컴포넌트가 조합된 큰 단위의 작업을 수행한다.
  • 모듈 구조는 컴포넌트를 구성하는 가장 효율적인 방법이기에, 대부분의 애플리케이션은 각각 연관된 기능이 모여 캡슐화된 다수의 모듈을 갖추고 있다.

@Module() 데코레이터는 모듈을 기술하는 단일 객체를 인자로 받는다.

providersNest 인젝터에 의해 인스턴스화되고, 적어도 이 모듈 내에서 공유될 프로바이더 목록이다.
controllers이 모듈에서 정의된, 인스턴스화되어야하는 컨트롤러 목록이다.
importsimport 된 모듈의 리스트다. 만약 이 모듈에서 import한 모듈안에 정의된 provider를 사용해야 한다면 import한 모듈은 그 provider를 exports 옵션으로 넣어줘야 한다.
exportsproviders의 하위 집합으로 이 모듈에 선언된 Provider의 일부를 export할 수 있다. 이는 다른 모듈에서 이 모듈을 import 할때 사용 가능하다.

🏀 피쳐 모듈

  • feature module은 간단하게 특정 기능과 코드를 관련있게 조직할 수 있다.
  • 코드를 명백한 경계로 유지할 수 있다. 이는 SOLID원칙과 함께 개발을 할때 복잡성을 줄여주고 애플리케이션의 크기와 팀의 성장을 도와준다.

이를 구현하는 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) {}
}

하지만 순환 의존 문제가 있으므로, 모듈이 모듈에게 프로바이더로서 주입될 수는 없다고 한다.

#전역모듈과 동적모듈은 나중에 알아보기

참고: 네스트 공식문서

profile
우물에서 자라나는 중

0개의 댓글