NestJS로 효율적인 백엔드 개발하기 (05) - 모듈에 대해 알아보자

2025. 12. 12. 00:13·NestJS/개념과 구조 정리

모듈 꼭 알아야 할까?

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
'NestJS/개념과 구조 정리' 카테고리의 다른 글
  • NestJS로 효율적인 백엔드 개발하기 (07) - 예외 필터
  • NestJS로 효율적인 백엔드 개발하기 (06) - 미들웨어(클래스형, 함수형)
  • NestJS로 효율적인 백엔드 개발하기 (04) - 서비스 사용하기
  • NestJS로 효율적인 백엔드 개발하기 (03) - 컨트롤러 사용하기
나는지토
나는지토
  • 나는지토
    안녕은헬로입니다.
    나는지토
  • 전체
    오늘
    어제
    • 분류 전체보기 (27)
      • Backend Design (1)
      • NestJS (19)
        • 개발 (9)
        • 개념과 구조 정리 (10)
      • SpringBoot (0)
      • Java (4)
        • 코테 (0)
      • PostgreSQL (2)
      • Docker (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    서비스
    자료구조
    Redis
    조회 방식
    Collections
    인증 가드
    컨트롤러
    ArrayList
    BullMQ
    PostgreSQL
    토큰 검사
    nestjs
    nestjs/jwt
    역할 검사
    JWT
    db 연결 오류
    코딩테스트
    Java
    커서기반 조회
    채팅
  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
나는지토
NestJS로 효율적인 백엔드 개발하기 (05) - 모듈에 대해 알아보자
상단으로

티스토리툴바