NestJS - DTO, Pipes

aydennote·2023년 5월 3일
0

Backend

목록 보기
6/6
post-thumbnail

1. DTO

1-1. DTO 개념

DTO(Data Transfer Object)는 클라이언트와 서버 간 데이터를 전송할 때 유용하다. 클라이언트로부터 입력 받은 데이터를 전달하거나 서버에서 클라이언트로 전달할 데이터를 구성할 때 사용된다. 이러한 데이터를 사용하여 서버에서 데이터를 유효성 검사 할 수 있다. 이를 통해 클라이언트로부터 올바른 데이터가 입력되는 것을 보장할 수 있다.
보통 interfaceclass를 이용해 정의한다.

1-2. DTO 사용 이유

데이터 유효성 체크에 효율이며 더 안정적인 코드를 만들 수 있다.

2. Pipe

2-1. Pipe 개념

Pipe는 입력 데이터의 유효성을 검사하고 필요한 경우 데이터 변환을 수행한다. 이를 통해 클라이언트가 보낸 데이터를 조작하거나 검사할 수 있다. 예를 들어 문자열을 정수로 변환하거나, 데이터를 정리하거나, 검증 및 가공하는 등 다양한 작업을 수행할 수 있다. Pipe는 데이터 검증 이후 처리된 데이터를 컨트롤러나 서비스로 전달한다. @injectable 데코레이터가 주석으로 달린 클래스 정의한다.

2-2. pipe 종류

  1. Handler-level Pipes
@Post()
@UsePipes(pipe)
createBoard(
    @Body() createBoardDto : CreateBoardDto 
) : Board {
    return this.boardService.createBoard(createBoardDto);  
}

handler 하나에 영향력이 있는 파이프이다. @UsePipes(pipe) 데코레이터를 이용해 사용할 수 있다.


  1. Parameter-level Pipes
@Patch('/:id/status')
updateBoardStatus(
    @Param('id') id : string,
    @Body('status', pipe) status : BoardStatus
){
    return this.boardService.updateBoardStatus(id, status);
}

특정 파라미터에 영향력이 있는 파이프이다. 위의 예시코드 처럼 사용할 경우, status 하나에만 적용된다.


  1. Global-level Pipes
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(GlobalPipe)
  await app.listen(3000);
}
bootstrap();

어플리케이션 전체에 영향력이 있는 파이프이다. 제일 상단에 있는 main.ts 파일에 useGlobalPipes()를 사용해 적용할 수 있다.

2-3. 사용법

1). 모듈 설치

npm install class-validator class-transformer --save
먼저 파이프 역할인 형식 변환과 유효성 검사를 위해 모듈 설치가 필요하다.

2). 적용

// 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() 데코레이터를 사용해 어떤 파라미터를 유효성 검사할지 정의한다.


Validator DOC 페이지
Transformer DOC 페이지

3). 적용 결과


Response에 message를 보면 "제목/설명 항목을 비울 수 없다" 라는 문구를 확인할 수 있다.

3. DTO와 Pipe 공통점, 차이점

DTO와 Pipe 모두 유효성 검사를 수행하는 데 사용된다는 공통점이 있지만, 크게 두 가지 차이점이 있다.
1. 사용 목적

  • DTO는 데이터 전송 목적에 사용되며, Pipe는 입력 데이터의 가공 및 검증 목적에 사용된다.
  1. 데이터 변환
  • DTO에서는 따로 데이터 변환 작업을 수행하지 않는다. 그러나, pipe에서는 클라이언트가 보낸 데이터를 조작(변환) 작업을 수행한다.

참고 강의
참고 사이트

profile
기록하는 개발자 Ayden 입니다.

0개의 댓글