NestJS 기초 (6) 모듈

2022. 10. 4. 17:20·개발/NestJS

모듈의 개념

모듈은 여러 컴포넌트를 조합하여 작업을 수행하는 단위를 의미합니다. 말이 조금 어려울 수 있는데요. 예를 들어, 배달 앱을 만든다고 해보겠습니다. 이 경우 사용자, 사장님, 배달원 등의 작업을 별도로 처리하는 구조와 설계가 필요할 것입니다. 이때 모듈은 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를 사용할 수 있으며 이를 임포트한 모든 모듈은 동일한 인스턴스를 공유하게 됩니다.

 

참고 자료

  • https://docs.nestjs.com/modules
  • https://wikidocs.net/148984

'개발 > NestJS' 카테고리의 다른 글

NestJS 기초 (7) 환경 변수 관리하기  (0) 2022.10.06
NestJS 기초 (5) 프로바이더  (0) 2022.10.04
NestJS 기초 (4) 데이터베이스 연동  (0) 2022.10.01
'개발/NestJS' 카테고리의 다른 글
  • NestJS 기초 (8) 미들웨어
  • NestJS 기초 (7) 환경 변수 관리하기
  • NestJS 기초 (5) 프로바이더
  • NestJS 기초 (4) 데이터베이스 연동
휘Hwi
휘Hwi
여행, 사진, 개발, 책 이야기를 기록하는 여행자 휘의 블로그 𓂍
Klook.com
  • 휘Hwi
    휘: 끝나지 않은 이야기
    휘Hwi
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 기록
        • 일상 에세이
        • 인사이트
        • 투자와 재테크
        • 코인 이야기
        • 아카이빙
        • 집무실 레터
        • 사랑에 대하여
        • 번역 이야기(完)
        • 프리랜서 일지(完)
      • 여행
        • 🌎 세계 여행기 S1 (完)
        • 🌊 삼삼한 여행기 (完)
        • 🚶 온더로드
        • 🇯🇵 일본
        • 🏝️ 발리
        • 🇻🇳 베트남
        • 🇱🇰 스리랑카
        • 🇮🇳 인도
        • 🇹🇭 태국
        • 🇸🇬 싱가포르
        • 🇦🇺 호주
        • 🇭🇰 홍콩
        • 🇰🇷 한국
        • 🍚 여행자의 한 끼
        • ℹ️ 여행 정보
      • 사진
        • 사진가
        • 사진 이론과 생각
        • 사진 관련 정보
      • 영상
        • 파이널컷 모션 공부
        • 고프로 GoPro
        • 영상 관련 정보
      • 책
        • 책 읽고 쓰기
      • 개발
        • 티스토리
        • Internet
        • HTML
        • CSS
        • JavaScript
        • Typescript
        • React
        • Node.js
        • Express
        • NestJS
        • Python
        • Django
        • MySQL
        • MongoDB
        • AWS
        • Deployment
        • Terminal
        • Git
        • Glossaries
        • Articles
        • Projects
        • TIL;
      • 미분류
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
휘Hwi
NestJS 기초 (6) 모듈
상단으로

티스토리툴바