모듈의 개념
모듈은 여러 컴포넌트를 조합하여 작업을 수행하는 단위를 의미합니다. 말이 조금 어려울 수 있는데요. 예를 들어, 배달 앱을 만든다고 해보겠습니다. 이 경우 사용자, 사장님, 배달원 등의 작업을 별도로 처리하는 구조와 설계가 필요할 것입니다. 이때 모듈은 UsersModule, OwnersModule, RidersModule과 같이 구성될 수 있고, 각 모듈에는 해당하는 컨트롤러와 서비스 등이 포함됩니다. 이러한 모듈을 모두 모으면 배달 서비스를 제공하는 DeliveryModule이 될 수 있습니다.
모듈을 사용하는 이유는 컴포넌트를 효과적으로 구조화할 수 있습니다. 서비스를 작은 단위로 나누고 유사한 기능끼리 모음으로써 응집도를 높이는 것이 모듈을 사용하는 이유입니다.
Nest에서 각 애플리케이션은 최소 하나 이상의 모듈로 구성되며 가장 기초가 되는 모듈을 루트(root) 모듈이라 합니다. 이러한 루트 모듈은 Nest 애플리케이션 작동을 위한 핵심 장소입니다.
모듈의 구성
Nest에서 모듈은 @Module()
데코레이터를 사용하며, 인자로 ModuleMetadata
를 받습니다.
Nest 모듈의 기본 구성 요소는 다음과 같습니다.
기능 | 설명 |
---|---|
providers |
Nest 인젝터에 의해 인스턴화된 클래스로 모듈 간에 공유 가능 |
controllers |
모듈에 등록된 응답 및 요청 처리 컨트롤러 |
imports |
모듈에서 사용하는 다른 모듈 |
exports |
모듈을 다른 모듈에서 사용할 수 있게 함(퍼블릭 인터페이스/API로 간주됨) |
모듈은 보통 기능 모듈을 제외하고 공통 기능을 모아놓은 CommonModule, 공통 기능이지만 앱을 구동하는 데 필요한 기능(로깅, 인터셉터)을 모아놓은 CoreModule로 구성됩니다. AppModule에서 앱을 구동할 때는 두 가지 모듈을 모두 가져오는 것이 아니라, CommonModule을 CoreModule로 가져온 다음(imports), CoreModule에서 CommonModule을 내보내고(exports), AppModule은 CoreModule을 가져옵니다. 이렇게 하면 AppModule에서 CommonModule을 직접 불러오지 않았음에도 불구하고 CommonModule의 프로바이더를 사용할 수 있습니다.
모듈 사용하기
앞서 우리가 생성한 CatsController
와 CatsService
은 동일한 애플리케이션 도메인에 속하며, 따라서 다음과 같이 하나의 기능 모듈에 넣을 수 있습니다.
// 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 {}
이제 우리는cats.module.ts
파일 내에 CatsModule
을 정의하고 있습니다. (cats
디렉토리 내에 위치). 이제 루트 모듈(app.module.ts
파일 내에 정의된 AppModule
)에 이 모듈을 임포트해줍니다.
// app.module.ts
import { Module } from '@nestjs/common';
import { CatsModule } from './cats/cats.module';
@Module({
imports: [CatsModule],
})
export class AppModule {}
지금까지의 디렉토리 구조를 살펴보면 다음과 같습니다.
모듈 공유하기
Nest 모듈은 기본적으로 싱글톤 패턴이며 여러 모듈에서 모든 프로바이더의 동일한 인스턴스를 공유할 수 있습니다. 모든 모듈은 자동으로 공유 모듈이 되며 따라서 생성 이후에는 모든 모듈에서 재사용할 수 있습니다.
CatsService
인스턴스를 다른 모듈에서 공유하고 싶다고 해보겠습니다. 다음과 같이 모듈의 exports
배열에 CatsService
프로바이더를 추가하여 내보낼 수 있습니다.
// cats.module.ts
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Module({
controllers: [CatsController],
providers: [CatsService],
exports: [CatsService]
})
export class CatsModule {}
이제 CatsModule
을 임포트하는 모든 모듈은 CatsService
를 사용할 수 있으며 이를 임포트한 모든 모듈은 동일한 인스턴스를 공유하게 됩니다.
참고 자료
'개발 > NestJS' 카테고리의 다른 글
NestJS 기초 (7) 환경 변수 관리하기 (0) | 2022.10.06 |
---|---|
NestJS 기초 (5) 프로바이더 (0) | 2022.10.04 |
NestJS 기초 (4) 데이터베이스 연동 (0) | 2022.10.01 |