Skip to main content

Nest.js @Module

@Module() 데코레이터로 선언된 클래스의 경우, 해당 클래스는 모듈 클래스로 분류된다.

애플리케이션은 최소 하나 이상의 Module(root module)을 필요로 한다. 이를 통해 애플리케이션 그래프를 구성할 수 있게 되는데, 이로 인해 의존성 등과 같은 관계가 설정된다.

Module 클래스는 다음의 property를 포함하는 하나의 객체를 파라미터로 전달받는다.

  • providers
  • controllers
  • imports
  • exports

Feature Module

동일한 애플리케이션 도메인에 포함 돼 서로 긴밀한 관계를 갖는 경우, 다음과 같이 Feature Module로 구성할 수 있다.

// health/health.module.ts

import { HttpModule } from "@nestjs/axios";
import { Module } from "@nestjs/common";
import { TerminusModule } from "@nestjs/terminus";

import { HealthController } from "./health.controller";

@Module({
imports: [TerminusModule, HttpModule],
controllers: [HealthController],
})
export class HealthModule {}

위와 같이 health 라는 도메인에 health.controller.ts이 포함 되고, 여기에 사용되는 모듈 또한 imports에 선언했다. 이로써 각 애플리케이션 도메인 간 경계가 깔끔해지고, 또 보다 코드를 조직적으로 관리할 수 있게 되는 것이다. 이러한 구성은 SOLID 원칙에 맞춰 개발하기에 적절하다.


Shared Module

위처럼 Module 클래스를 생성한 경우, 이를 모든 도메인에서 공유할 수 있다. 방법은 간단하다.

// app.module.ts

import { Module } from "@nestjs/common";

import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { HealthModule } from "./health/health.module";

@Module({
imports: [HealthModule], // <------------ added
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}

위와 같이 HealthModuleAppModule에 추가 하면 된다. 이렇듯 기본적으로 Module은 Shared Module 이다. 이는 기본적으로 Singleton으로 생성되며, 따라서 모든 도메인에서 동일한 인스턴스를 공유할 수 있다.

만약, Module이 아닌, Service를 공유하려는 경우, 해당 도메인에서 exports 배열에 추가해주면 된다.

Related Links