
request시 의도하지 않는 데이터 형식이나 전달하더라도 에러를 발생시키지 않는다. 이 부분을 유연하게 관리하는 방법에 여러 가지가 있다.
NotFoundException 생성자를 활용해 request 조건에 따라 error를 발생시킬 수 있다.
getOne(id: string): Movie {
const movies = this.movies.find((movie) => movie.id === +id);
if (!movies) {
throw new NotFoundException(`${id}의 정보는 없습니다`);
}
return movies;
}
// result => http://localhost:3000/443
{
"message": "443의 정보는 없습니다",
"error": "Not Found",
"statusCode": 404
}
request시 의도한 형식이 아님에도 특별한 조작 이는 201를 던져 오류가 발생하지 는다. 컨트롤러와 서비스에 DTO(Data Transfer Object)를 생성해 에러 핸들링을 할 수 있다.
// movies/dto/create-movie.dto.ts
export class CreateMovieDto {
readonly title: string;
readonly year: number;
readonly genres: string[];
}
// controller dto export
@Post()
// CreateMovieDto type에 대한 유효성 검사가 가능
create(@Body() movieData: CreateMovieDto) {
return this.moviesService.create(movieData);
}
// service dto export
create(movieData: CreateMovieDto) {
this.movies.push({
id: this.movies.length + 1,
...movieData,
});
return `생성 완료`;
}
우선 class의 유효성 검사를 위해 패키지를 설치합니다.
pnpm i class-validator class-transformer
DTO에 유효성 검사 decorator 생성
// ...dto.ts
import { IsNumber, IsString } from 'class-validator';
export class CreateMovieDto {
@IsString() // string 검사
readonly title: string;
@IsNumber() // number 검사
readonly year: number;
@IsString({ each: true }) // string인지 하나씩 검사
readonly genres: string[];
}
잘못된 형식으로 제출했을 경우 발생하는 에러

기존 dto의 타입 형식을 활용한 API에서 update 메소드의 경우 모든 타입이 필수가 아닌 경우가 발생한다. 이 상황도 유연하게 처리하도록 수정이 필요하다.
Partial 유틸리티 타입을 맵핑하기 위한 유틸리티 라이브러리를 설치한다.pnpm i @nestjs/mapped-types
@IsOptional를 데코레이션하면된다.import { PartialType } from '@nestjs/mapped-types';
import { CreateMovieDto } from './create-movie.dto';
export class UpdateMovieDto extends PartialType(CreateMovieDto) {}
미들웨어의 개념으로 현재는 request의 대한 유효성 검사를 하기 위해 useGlobalPipes에서 ValidationPipe 의 설정을 진행합니다.
// main.ts
...
app.useGlobalPipes(
new ValidationPipe({
whitelist: true, // 유효성 검사 실패 시 Validate에 도달하지 않음
forbidNonWhitelisted: true, // 잘못된 형식은 Request 자체를 하지않음
transform: true, // path parameter에 대한 타입 추론이 가능해짐
}),
);
...
잘못된 키가 들어갔을 때 Request error가 발생한다.
