DTO(Data Transfer Object)는 클라이언트와 서버 간 데이터를 전송할 때 유용하다. 클라이언트로부터 입력 받은 데이터를 전달하거나 서버에서 클라이언트로 전달할 데이터를 구성할 때 사용된다. 이러한 데이터를 사용하여 서버에서 데이터를 유효성 검사 할 수 있다. 이를 통해 클라이언트로부터 올바른 데이터가 입력되는 것을 보장할 수 있다.
보통interface
와class
를 이용해 정의한다.
데이터 유효성 체크에 효율이며 더 안정적인 코드를 만들 수 있다.
Pipe는 입력 데이터의 유효성을 검사하고 필요한 경우 데이터 변환을 수행한다. 이를 통해 클라이언트가 보낸 데이터를 조작하거나 검사할 수 있다. 예를 들어 문자열을 정수로 변환하거나, 데이터를 정리하거나, 검증 및 가공하는 등 다양한 작업을 수행할 수 있다. Pipe는 데이터 검증 이후 처리된 데이터를 컨트롤러나 서비스로 전달한다.
@injectable
데코레이터가 주석으로 달린 클래스 정의한다.
- Handler-level Pipes
@Post() @UsePipes(pipe) createBoard( @Body() createBoardDto : CreateBoardDto ) : Board { return this.boardService.createBoard(createBoardDto); }
handler 하나에 영향력이 있는 파이프이다.
@UsePipes(pipe)
데코레이터를 이용해 사용할 수 있다.
- Parameter-level Pipes
@Patch('/:id/status') updateBoardStatus( @Param('id') id : string, @Body('status', pipe) status : BoardStatus ){ return this.boardService.updateBoardStatus(id, status); }
특정 파라미터에 영향력이 있는 파이프이다. 위의 예시코드 처럼 사용할 경우,
status
하나에만 적용된다.
- Global-level Pipes
async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes(GlobalPipe) await app.listen(3000); } bootstrap();
어플리케이션 전체에 영향력이 있는 파이프이다. 제일 상단에 있는
main.ts
파일에useGlobalPipes()
를 사용해 적용할 수 있다.
npm install class-validator class-transformer --save
먼저 파이프 역할인 형식 변환과 유효성 검사를 위해 모듈 설치가 필요하다.
// controller @Post() @UsePipes(ValidationPipe) createBoard(@Body() createBoardDto: CreateBoardDto) { return this.boardsService.createBoard(createBoardDto); } // dto import { IsNotEmpty } from 'class-validator'; export class CreateBoardDto { @IsNotEmpty() title: string; @IsNotEmpty() description: string; }
컨트롤러에는
@UsePipes(ValidationPipe)
데코레이터로Built-in Pipes
를 사용해 핸들러 레벨 파이프를 적용한다.
dto에는@IsNotEmpty()
데코레이터를 사용해 어떤 파라미터를 유효성 검사할지 정의한다.
Response에 message를 보면 "제목/설명 항목을 비울 수 없다" 라는 문구를 확인할 수 있다.
DTO와 Pipe 모두 유효성 검사를 수행하는 데 사용된다는 공통점이 있지만, 크게 두 가지 차이점이 있다.
1. 사용 목적
- DTO는 데이터 전송 목적에 사용되며, Pipe는 입력 데이터의 가공 및 검증 목적에 사용된다.
- 데이터 변환
- DTO에서는 따로 데이터 변환 작업을 수행하지 않는다. 그러나, pipe에서는 클라이언트가 보낸 데이터를 조작(변환) 작업을 수행한다.