
Insomnia
→ API 테스트용 (Postman 대체)
npm i -g @nestjs/cli nest new project-name
nest new 명령어를 사용하면
기본적인 폴더 구조와 설정이 자동으로 구성된다.
NestJS는 단일 책임 원칙(SRP) 을 굉장히 강하게 따른다.
하나의 module / class / function 은 하나의 책임만 가져야 한다
AppModule
├── AppController
└── AppService
👉
Controller에서 로직을 처리하지 않고
Service로 위임하는 구조가 기본이다.
NestJS는 class 기반 유효성 검사를 공식적으로 지원한다.
1️⃣ 패키지 설치
npm i class-validator class-transformer
class-validator : 유효성 검사
class-transformer : plain object → class 변환
2️⃣ DTO를 위한 패키지
npm i @nestjs/mapped-types
DTO 상속 및 변환을 도와주는 유틸 패키지
3️⃣ DTO 예시
export class CreateMovieDto {
@IsString()
title: string;
@IsNumber()
year: number;
}
👉
ValidationPipe를 사용하면
컨트롤러 진입 전에 자동으로 유효성 검증이 이루어진다.
NestJS의 가장 핵심 개념 중 하나.
역할 - 의미
Provider - 주입 가능한 클래스
Consumer - 주입받는 쪽
Module - Provider를 등록하는 장소
예시
@Injectable()
export class MoviesService {}
@Module({
providers: [MoviesService],
})
export class MoviesModule {}
@Controller('movies')
export class MoviesController {
constructor(private readonly moviesService: MoviesService) {}
}
👉
객체를 직접 생성하지 않고
NestJS가 DI 컨테이너를 통해 자동으로 주입해준다.
NestJS는 기본적으로 Express 위에서 동작한다
하지만 Fastify를 사용하면
Express 대비 약 2배 빠른 성능을 낼 수 있다.
Req / Res 직접 접근
getAll(@Req() req, @Res() res): GetMovieDto[] {
return this.movies;
}
NestJS에서는 @Req(), @Res() 데코레이터를 통해
플랫폼(Express / Fastify)의 객체에 직접 접근할 수 있다.
NestJS의 추상화 레이어를 깨게 됨
플랫폼 종속 코드가 됨
테스트 및 유지보수 어려움 증가
👉
가능하면 NestJS 방식(@Body, @Param, @Query 등)을 사용하는 것이 좋다.
NestJS는 구조와 규칙을 강하게 강제하는 프레임워크
처음엔 번거롭지만 규모가 커질수록 장점이 커진다
특히 DI + Module 구조는 테스트, 유지보수, 협업에 굉장히 유리하다
React 개발자 입장에서는
“왜 이렇게 나눠?” 싶지만
커질수록 이 구조가 왜 필요한지 체감하게 되겠지