모듈 꼭 알아야 할까?
Nest CLI를 사용하면 nest g controller, nest g service 같은 명령어 한 줄로 파일을 자동 생성할 수 있어서 처음에는 구조가 단순해 보이지만, 프로젝트 규모가 조금만 커져도 이게 왜 필요한지, 어디에 어떤 코드를 넣어야 하는지가 헷갈리기 시작한다. 나 역시 NestJS를 쓰면서 많은 기능들을 빠르게 만들 수 있었지만, 모듈을 이해하지 못하면 파일 구조가 뒤엉키고, 의존성 주입이 꼬이고, 유지보수가 어려워진다. 그래서 이번 포스트에서 한번 정리를 하고 넘어가려 한다.
모듈은 무엇일까??
- NestJS에서 모듈은 앱 구조를 정의하고, 의존성을 관리하는 핵심 단위
- 모듈은 기능 단위로 코드를 캡슐화한 것
UsersModule
├─ users.controller.ts
├─ users.service.ts
└─ users.module.ts <- 모듈
module.ts 내부
import { Module } from '@nestjs/common';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
@Module({
imports: [],
controllers: [UsersController],
providers: [UsersService],
exports: [],
})
export class UsersModule {}
- import -> 다른 모듈을 가져와서 이 모듈에서 사용 가능하게 함
- controllers -> 이 모듈에 속한 컨트롤러 지정
- providers -> 서비스나 다른 의존성을 등록
- exports -> 다른 모듈이 이 서비스를 사용할 수 있도록 공개
모듈의 exports 활용
- exports를 쓰면 다른 모듈에서 서비스 사용 가능
- 컨트롤러는 exports로 내보낼 필요 없음
- 추가) exports를 한 후 사용하려는 모듈에서 import를 해주어야 의존성 주입 가능
같은 모듈 내부에서는 exports 없어도 DI 가능
- UsersController와 UsersService는 같은 모듈(UsersModule) 안에 있음
- NestJS는 모듈 안에서 controllers와 providers 간 DI를 자동으로 연결해줌
- 즉, 같은 모듈 내부에서는 exports 없어도 DI 가능
- exports는 다른 모듈에서 해당 서비스나 프로바이더를 사용하고 싶을 때만 필요
UsersModule을 다른 모듈에서 사용하고 싶은 경우
@Module({
imports: [UsersModule],
controllers: [OtherController],
providers: [OtherService],
})
export class OtherModule {}
- 여기서 OtherService에서 UsersService를 DI하려면 UsersModule에서 UsersService를 exports 해야 함
@Global() - 전역모듈
import { Global, Module } from '@nestjs/common';
import { CommonService } from './common.service';
@Global()
@Module({
providers: [CommonService],
exports: [CommonService], // exports 필수! 안 하면 다른 모듈에서 못 씀
})
export class CommonModule {}
- @Global() -> 전역으로 등록
- exports -> 다른 모듈에서 사용할 수 있게 내보내기
// app.module.ts
@Module({
imports: [CommonModule], // 최초 한 번만 import
})
export class AppModule {}
- 주의) 최초 한 번만 AppModule 등 루트 모듈에 import 하면 됨
- 이후 다른 모듈에서는 import 안 해도 NestJS DI 시스템이 알아서 연결
전역 모듈의 주의점
- 너무 많은 서비스를 전역으로 만들면 앱 전체 의존성이 꼬일 수 있음
- 무분별한 전역 사용 -> 테스트, 유지보수 어려움
- 꼭 공통으로 많이 쓰이는 서비스만 글로벌로 만들기
참고
https://docs.nestjs.com/modules
Documentation | NestJS - A progressive Node.js framework
Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea
docs.nestjs.com
https://velog.io/@naljajm/NestJs-%EB%AA%A8%EB%93%88-%EC%84%A4%EA%B3%84
[NestJs] 모듈 설계
모듈이란 여러 컴포넌트를 조합하여 더 큰 작업을 수행할 수 있게 하는 단위를 말한다.Nest 애플리케이션이 실행되기 위해서는 하나의 루트 모듈이 존재하고 이 루트 모듈은 다른 모듈들로 구성
velog.io
'NestJS > 개념과 구조 정리' 카테고리의 다른 글
| NestJS로 효율적인 백엔드 개발하기 (07) - 예외 필터 (0) | 2025.12.12 |
|---|---|
| NestJS로 효율적인 백엔드 개발하기 (06) - 미들웨어(클래스형, 함수형) (0) | 2025.12.12 |
| NestJS로 효율적인 백엔드 개발하기 (04) - 서비스 사용하기 (0) | 2025.12.11 |
| NestJS로 효율적인 백엔드 개발하기 (03) - 컨트롤러 사용하기 (0) | 2025.12.10 |
| NestJS로 효율적인 백엔드 개발하기 (02) - 컨트롤러, 서비스, 모듈 (0) | 2025.12.10 |
