argument데이터들을 가공한 후에 컨트롤러 메소드로 값을 넘겨주는 미들웨어이다.
컨트롤러 메소드들이 실행되기 전에 pipe가 실행된다고 이해하면 된다.
데이터를 원하는 형태로 변환하고 검증까지 할 수 있다.
글로벌 - 컨트롤러 - 라우트 - 라우트 파라미터에 사용할 수 있다.
그리고 주로 라우트 파라미터를 많이 사용 한다.
(이전에 이미 main에서 글로벌로 class-validator를 사용해보긴 했다.)
코드를 보면 이해하기 쉬운데 첫번째 이미지가 라우트 파라미터에 적용한 코드이다.
파라미터의 id를 int형으로 변환해주고 검증까지 해준다.
두번째 이미지처럼 test라는 값을 id에 넘길경우 에러를 반환해준다.
또한 이런식으로 에러메세지에 대해 커스텀도 가능하다.
custom으로 pipe를 만들 수도 있다.
import {
ArgumentMetadata,
BadRequestException,
Injectable,
PipeTransform,
} from '@nestjs/common';
@Injectable()
export class MovieTitleValidationPipe implements PipeTransform<string, string> {
transform(value: string, metadata: ArgumentMetadata): string {
if (!value) {
return value;
}
if (value.length <= 2) {
throw new BadRequestException('영화의 제목은 3자 이상 작성해주세요!');
}
return value;
}
}
이렇게 query parameter값의 validation을 체크해줄 수 있다.

이미지보면 createDto와 UpdateDto의 각 필드의 class-validator가 isOptional 데코레이터만 제외하고 일치한다.

이렇게 변경해주면 createDto의 필드들을 nullable로 만들어주는 partial을 사용하면 된다.
이밖에도 pick, omit, intersection, composition등이 있다.
뭔가 TS의 유틸리티타입 같다.

@Exclude 데코레이션 통해서 프론트엔드로 해당 컬럼은 보내지 않는다.