
NestJS에서DTO(Data Transfer Object)는컨트롤러와 서비스 간에 주고받는 데이터를 정의한다. 이는 데이터의 구조를 명확히 하고, 데이터의유효성을 검사하는데 도움이 된다.
DTO의 특징명확한 데이터 구조 : DTO는 전달할 데이터의 구조를 명확하게 정의한다. 이를 통해 데이터의 일관성을 유지하고 코드의 가독성을 향상시킨다.데이터 유효성 검사와 타입 지정 : 클래스를 이용해 데이터의 타입을 지정하여 class-vaildator 와 같은 라이브버리와 함께 사용하여 데이터의 유효성을 검사할 수 있다.안전성 : DTO를 사용함으로써 예상치 못한 데이터 구조나 값을 차단할 수 있고 타입 안전성 을 보장받는다.DTO(Data Transfer Object) 사용법DTO(Data Transfer Object) 정의하기→ 클래스 형태로 DTO를 정의하며, 각 필드에 대해 타입을 명시한다. (유효성 검사 데코레이터도 사용할 수 있다.)
→ Tip! : Spring의 DTO와 문법만 다를 뿐 거의 똑같다.
// create-dog.ts
// class-validator : 유효성 검사 데코레이터를 호출하는 라이브러리
import { IsString, IsInt, Min, Max } from 'class-validator';
export class CreateDogDTO{
@IsString()
name: string;
@IsInt()
@Min(0) // 해당 정수의 최소값은 0, 최대값은 20임을 나타냄. 0 ~ 20
@Max(20)
age: number;
@IsString()
breed: string;
}
DTO(Data Transfer Object) 사용하기→ 정의한 DTO를 사용하기 위해선 컨트롤러 에서 클라이언트로부터 받은 데이터를 타입 스크립트 객체 로 지정한다. 이를 통해 유효성 검사 와 타입 안전성 을 확보할 수 있다.
import { Body, Controller, Post } from '@nestjs/common';
import { CreateDogDTO } from './create-dog.ts';
@Controller('dogs')
export class DogsController{
// createDogDTO: CreateDogDTO : 타입스크립트 객체를 정의한 DTO로 변환
@Post()
async create(@Body() createDogDTO: CreateDogDTO){
return `해당 강아지 이름 ${creaeteDogDTO.name}은 이미 존재합니다!`;
}
}
→ ValidationPipe 를 사용하여 DTO 클래스에 정의된 유효성 검사가 자동으로 수행되도록 설정한다.
import { Controller, Post, Body, UsePipes } from '@nestjs/common';
import { CreateDogDTO } from './create-dog.dto';
import { ValidationPipe } from '@nestjs/common';
@Controller('dogs')
export class DogsController {
@Post()
@UsePipes(new ValidationPipe()) // ValidationPipe를 적용하여 유효성 검사를 수행
create(@Body() createDogDTO: CreateDogDTO) {
// 요청 본문 데이터가 createDogDTO로 매핑되고 유효성 검사 수행
return `${createDogDTO.name} 강아지를 분양했습니다!`;
}
}
ValidationPipe 를 왜 사용하는거지?: ValidationPipe 는 NestJS에서 DTO 를 기반으로 유효성 검사를 자동으로 수행하기 위해 사용하는 전역 파이프 또는 메소드 레벨 파이프 이다. 이를 사용하는 이유는 DTO 클래스에 정의된 유효성 검사 규칙을 기반으로 요청 데이터를 자동으로 검증 하기 위함이다.
ValidationPipe의 역할과 필요성은 무엇인가?
자동 유효성 검사
: DTO 클래스에 class-validator 데코레이터를 사용하여 특정 필드의 유효성 검사 를 진행할 수 있다.
위 코드를 예시로 들면 @IsString() , @IsInt() , @Min() 과 같은 데코레이터를 사용하여 필드의 타입이나 값의 범위 등을 지정한다.
그 후, ValidationPipe 는 해당 DTO 클래스 가 사용되는 컨트롤러 메소드가 호출될 때 🌟해당 메소드의 인자로 전달된 데이터가 DTO에 정의된 규칙을 따르는지 자동으로 검증한다.
유효성 검사 실패 처리
: 유효성 검사가 실패하면 ValidationPipe 는 자동으로 예외를 발생시켜 클라이언트에게 오류 메시지와 상태 코드를 반환한다. → 클라이언트가 잘못된 데이터를 보내는 것을 방지 `서버에서 데이터가 일관성 있게 유지되도록한다.
보안 및 안정성 강화데이터 유효성 검사 를 진행한다. ValidationPipe 를 사용함으로써 서버는 잘못된 데이터가 넘어오지 못하도록 차단하여 애플리케이션의 안정성을 향상시킨다.→ NestJS 에서 DTO(Data Transfer Object)는 계층 간 데이터 전송 시 데이터의 구조를 명확히 정의하는 객체이다.
→ DTO는 데이터의 구조를 명시 하며 유효성 을 검사하고 타입 안전성 을 보장한다.
→ DTO를 사용하기 위해선 클래스로 정의하여 컨트롤러 에서 @Body() 데코레이터를 사용해 요청 데이터를 DTO로 변환하여 처리한다. 유효성 검사는 ValidationPipe 를 통해 자동으로 수행시킬 수 있다.