페이지네이션 적용 코드를 작성하던 중 '값 유효성 검사'의 필요성을 느꼈다.
그 이유는
이렇게 두 가지였다.
첫번째 방법은 parseIntPipe 만을 이용하여 숫자 유효성 검사만 수행한 뒤, 나머지 유효성 검사를 서비스 단에서 하는 것이다.
이 방법을 사용하면
@Query('page', new ParseIntPipe({
errorHttpStatusCode: HttpStatus.BAD_REQUEST,
exceptionFactory: (error) => new BadRequestException('페이지 번호는 숫자여야 합니다.')
})) page: number,
두번째 방법은 class-validator와 class-transformer를 사용하는 방법이다.
초기 세팅 방법은 Nest 공식문서를 참고하자.
초기 셋팅이 끝났다는 가정 하에, 적용 과정은 아래와 같다.
DTO를 사용했기 때문에, 더 많은 유효성 검사를 ValidationPipe를 통해 수행할 수 있다.
@Type(() => Number)를 사용한 이유는 쿼리 파라미터는 문자열로 들어오게 되는데, 해당 필드 값을 숫자형으로 변환하기 위해서다.
추가적으로,
선택적 매개변수
와 기본값 할당
을 통해 지정와 같은 이점을 얻게 되었다.
첫번째 방법인 ParseIntPipe만을 사용하는 방법은 간단한 것처럼 보이지만,
DB 값과 비교를 통한 검증이 필요하지 않은 상황에도 불구하고
서비스 레이어에 추가해야 하는 단점이 있다.반면, ValidationPipe와 DTO를 조합하여 사용하는 방법은 초기 설정이 필요하지만,
따라서, 나는 2번 방법을 선택했다.