
🐱NestJS 개념
본 포스팅은 인프런 강의에서 배운 내용을 개인적으로 정리한 기록입니다.
📍 NestJS란
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 transformation과 data validation을 위해서 사용
| 기능 | 설명 |
| 변환 (transformation) | string → number, boolean 등 타입 변경 |
| 검증 (validation) | 유효한 값인지 확인하고, 틀리면 예외 던짐 |
PIPE 사용하는 법(Binding Pipes)
- Handler-level Pipes
개별 파라미터에 직접 파이프 적용 - Parameter-level Pipes
특정 라우트 핸들러 전체에 적용 - Global Pipes
전체 애플리케이션 레벨에서 적용
'✨BACKEND > 📍NestJS' 카테고리의 다른 글
| NestJS 회원가입/로그인 구현하기(feat. MySQL) (1) | 2025.08.30 |
|---|---|
| NestJS 인증 기능 구현하기 (8) | 2025.08.10 |
| NestJS 게시판 CRUD 구현하기 (7) | 2025.07.27 |