본문 바로가기
✨BACKEND/📍NestJS

NestJS 개념

by 짱돌보리 2025. 7. 20.
728x90

🐱NestJS 개념

본 포스팅은 인프런 강의에서 배운 내용을 개인적으로 정리한 기록입니다.

📍 NestJS란

https://docs.nestjs.com/

 

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

 

  • Nest (NestJS)는 효율적이고 확장 가능한 Node.js 서버 측 애플리케이션을 구축하기위한 프레임워크
  • TypeScript로 작성되었으며 Angular에서 영감을 받아 설계되었다. 구조화된 백엔드 애플리케이션 개발을 돕기 위해 만들어졌다.
  • OOP (Object Oriented Programming), FP (FunctionalProgramming) 및 FRP (Functional Reactive Programming) 요소를 사용할수있게 해줌

현재 폴더에서 새 프로젝트 생성

nest new ./

📍 NestJS 기본 동작 방식

📍 NestJS 모듈이란

  • 컨트롤러, 서비스, 프로바이더들을 하나의 기능 단위로 묶는 단위 (뼈대 라고 생각하자!)
  • 모듈은 @Module() 데코레이터로 주석이 달린 클래스
  • 루트 모듈은 Nest가 사용하는 시작점
  • 기능 별로 만듦 (유저 모듈, 주문 모듈 챗 모듈…)
데코레이터?

NestJS에서 클래스, 메서드, 매개변수 등에 메타데이터를 정의하는 특수한 문법
Nest에게 “이건 뭐 하는 거다”라고 알려주는 주석 같은 역할

📍 Controller란?

들어오는 요청을 처리하고 클라이언트에 응답을 반환한다.

@Controller 데코레이터로 클래스를 데코레이션해 정의한다.

📍 Handler란?

@Get, @Post, @Delete 등과 같은 데코레이터로 장식된 컨트롤러 클래스 내의 단순한 메서드

import { Controller, Get, Post } from '@nestjs/common';  

@Controller('cats')  
export class CatsController {  
  @Post()  
  create(): string {  
    return 'This action adds a new cat';  
  }  

  @Get()  
  findAll(): string {  
    return 'This action returns all cats';  
  }  
}

📍 Provider란?

  • 애플리케이션 내에서 의존성 주입(Dependency Injection, DI)을 통해 주로 서비스를 공급하는 객체
  • 프로바이더의 주요 아이디어는 종속성으로 주입할 수 있다는 것

📍 Service란?

  • 비즈니스 로직(데이터 처리, 계산, 외부 API 호출 등)을 담당하는 핵심 컴포넌트
  • 보통 @Injectable() 데코레이터를 붙여 Provider로 등록됨
  • Controller에서 Service를 주입 받아 기능을 수행함

 

✅ @Injectable()

  • NestJS의 의존성 주입(DI) 시스템에 등록하는 데코레이터
  • 해당 클래스가 다른 클래스에 주입될 수 있게 해줌

"Nest야, 이 클래스도 관리해줘~ 나중에 다른 데서 쓸 거야!"
안 붙이면 Nest는 "어? 이건 내가 관리 안 하는 애인데?" 하면서 에러를 냄.


Nest can't resolve dependencies of the XXX (?). Please make sure that the argument at index [0] is available...

 

붙여야 하는 경우 (필수)

  • NestJS가 객체를 자동 생성하고 주입해야 할 때는 @Injectable()이 필요함.
붙이는 대상 예시 설명
✅ 서비스 BoardsService 컨트롤러에서 주입해서 사용하려면 필요
✅ 가드 AuthGuard DI로 서비스 주입받으면 필요
✅ 인터셉터 LoggingInterceptor 의존성 주입 사용 시 필요
✅ 파이프 ValidationPipe 내부에서 다른 서비스 주입 시 필요
✅ 커스텀 클래스 JwtService, MailService 등 유틸성 클래스라도 DI하려면 필요

 

안 붙여도 되는 경우

  • DI가 필요 없는 경우, 즉 Nest가 생성할 필요 없는 경우는 안 붙여도 됨
안 붙이는 대상 예시 설명
❌ 단순 유틸 클래스 DateFormatter, ArrayHelper 직접 new해서 쓰거나 static 메서드만 있을 경우
❌ DI를 사용하지 않는 클래스 interface, 단순 DTO, 타입 등 객체 생성을 Nest에 맡기지 않음

 

📍 DTO(Data Transfer Object)

  • 계층간 데이터 교환을 위한 객체
  • 주로 클라이언트 → 서버로 전달되는 요청 데이터의 구조를 명확히 정의하기 위해 사용된다.
  • 입력값, 유효성 검증, 타입 보장

왜 클래스를 쓸까?

인터페이스는 컴파일 타임에만 존재하지만, 클래스는 런타임에도 존재한다.

NestJS는 이 런타임 클래스 정보를 활용해서 메타데이터를 추출하고, 의존성 주입, 유효성 검사 등에 활용할 수 있다.

export class CreateBoardDto {
  title: string
  description: string
}

📍 Pipe

  • 클라이언트로부터 받은 데이터를 가공(검증/변환)하는 클래스
  • data transformationdata validation을 위해서 사용
기능 설명
변환 (transformation) string → number, boolean 등 타입 변경
검증 (validation) 유효한 값인지 확인하고, 틀리면 예외 던짐

PIPE 사용하는 법(Binding Pipes)

  1. Handler-level Pipes 
    개별 파라미터에 직접 파이프 적용
  2. Parameter-level Pipes
    특정 라우트 핸들러 전체에 적용
  3. Global Pipes
    전체 애플리케이션 레벨에서 적용