NestJS의 DTO를 생성해보고, 이를 이용해 유효성 검사를 해봤다.
이에 대한 공부 기록이다.
DTO
DTO(Data Transfer Object)
client의 요청에 대한 타입 지정
client의 잘못된 요청에 대한 유효성 검사를 하기 위해서는
첫 번째로 server에서 원하는 요청에 대한 타입 정의를 해줘야 한다.
//update-todo.dto.ts
export class UpdateTodos {
action?: string;
}
//create-todo.dto.ts
export class CreateTodo {
action: string;
}
위처럼 client 요청에 대한 타입을 생성하고,
서비스 파일과 컨트롤러 파일의 create,update 메서드의 client 요청 body에 대한 타입을 지정해준다.
//todos.service.ts
create(todoData: CreateTodo) {
this.todos.push({
id: this.todos.length + 1,
...todoData,
});
}
update(id: string, updateData: UpdateTodos) {
const todo = this.getOne(id);
this.deleteOne(id);
this.todos.push({
...todo,
...updateData,
});
}
//todos.controllers.ts
@Patch('/:id')
patch(@Param('id') id: string, @Body() updateData: UpdateTodos) {
return this.todosService.update(id, updateData);
}
@Post()
create(@Body() todoData: CreateTodo) {
return this.todosService.create(todoData);
}
유효성 검사
요청에 대한 타입을 지정해줬으니,
이 타입에 기반한 요청에 대한 유효성 검사를 해줘야 한다.
유효성 검사에 필요한
class-validator와 class-transformer을 설치해보자
$npm i class-validator class-transformer
위의 그림을 보면, class-transformer와 class-validator의 역할을 알 수 있다.
사용자의 요청이 들어오면
class-transformer가 JSON body를 class Instance로 바꿔주고,
class-validator가 해당 class Instance를 검증한다.
요청이 라우터나 컨트롤러에 도달하기 전에 검증되는 것이므로 효율적인 유효성 검사 방법이라고 할 수 있다.
Pipe
express의 미들웨어 역할
코드가 지나가는 곳
유효성 검사를 하기 위해서는 Pipe를 사용해야 한다.
main.ts에서 GlobalPipe를 만들어보자.
import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(
new ValidationPipe({
whitelist: true,
forbidNonWhitelisted: true,
transform: true,
}),
);
await app.listen(3000);
}
bootstrap();
- ValidationPipe : 이름에서 알 수 있듯 유효성 검사 역할을 해주는 Pipe이다.
- 인자로는 JSON body를 class instance로 바꾸는 동작부터 유효성 검사하는 작업을 수행할 때까지의 옵션을 지정할 수 있는 객체를 전달한다.
- whitelist : 유효성 검사 이후 검증 규칙이 정의되지 않은 props들을 삭제한다.
- forbidNonWhitelisted : 위의 whitelist에서 검증 규칙이 정의 되지 않은 props를 발견하면 오류를 보낸다.
- whitelist가 선행되어야 한다.
- transform : 유저가 보낸 것을 원하는 실제 타입으로 바꿔준다.
- todos 예에서는 id를 number로 바꿀 수 있음
class-validator
간단하게 class-validator를 dto에 추가해보자.
import { IsString } from 'class-validator';
export class CreateTodo {
@IsString()
action: string;
}
IsString 데코레이터를 사용해 action이 꼭 string이어야 한다고 지정해줬다.
그럼 잘못된 요청을 보내보자
dto에 지정되지 않은 todo 속성을 전달하니 오류가 났다.
위에서 forbidNonWhitelisted를 사용했기 때문이다.
action을 number로 전달하니 오류가 났다.
IsString 데코레이터를 사용했기 때문이다.
출처
NestJS로 API 만들기 – 노마드 코더 Nomad Coders
Enterprise Server Side Applications
nomadcoders.co
마치며
잘못된 정보에 대한 피드백은 환영입니다.
감사합니다.
'Backend > NestJS' 카테고리의 다른 글
[NestJS Overview] NestJS jest로 테스트하기(2) (e2e testing) (1) | 2022.12.09 |
---|---|
[NestJS Overview] NestJS jest로 테스트하기(1) (unit testing) (0) | 2022.12.07 |
[NestJS Overview] Service.ts(서비스 파일, 반환 클래스, 예외처리) (0) | 2022.12.07 |
[NestJS Overview] controllers 파일(참조 순서, Routing) (0) | 2022.12.07 |
[NestJS Overview] NestJS 시작하기(NestJS 프로젝트 시작, 구성) (0) | 2022.12.07 |