배꼽파지 않도록 잘 개발해요

NestJS에서 @Query 기본값 처리: DefaultValuePipe 본문

BackEnd/Express / NestJS

NestJS에서 @Query 기본값 처리: DefaultValuePipe

꼽파 2025. 8. 23. 18:51

NestJS로 API를 개발하다보면 흔히 이런 상황을 마주하게 된다.

@Get('our-trip')
async getTrips(
  @Query('pageNumber', ParseIntPipe) pageNumber: number,
) {
  return this.tripService.findAll(pageNumber);
}

 

여기서 /out-trip 경로로 쿼리 파라미터 없이 요청을 보내면 어떤 일이 생길까?

 

바로 ParseIntPipe(undefined)가 실행되면서 에러가 난다.

 


왜 기본값(= 1)을 줘도 안 될까?

 

보통 TypeScript에서는 기본값을 이런식으로 지정한다.

@Query('pageNumber', ParseIntPipe) pageNumber: number = 1;

"쿼리가 없으면 그냥 1이 들어가겠지?"라고 생각했던 건 나의 큰 착각이었다.

NestJS는 그렇게 동작하지 않는다.

 

실행 순서는 다음과 같다.

  1. 쿼리 파라미터 파싱 → pageNumber = undefined
  2. ParseIntPipe 실행 → ParseIntPipe(undefined) → 에러

 

즉, NestJS의 파이프는 핸들러 실행 전에 동작하기 때문에, 파이프에서 이미 죽어서 오류가 난 경우,
함수 기본값 적용이 불가능하다.

그래서 TypeScript로 기본값을 적용했음에도 에러가 난 것이다.

 


DefaultValuePipe로 해결하기

그래서 가장 깔끔한 방법은 DefaultValuePipe를 함께 쓰는 것이다.

@Get('our-trip')
async getTrips(
  @Query('pageNumber', new DefaultValuePipe(1), ParseIntPipe) pageNumber: number,
) {
  return this.tripService.findAll(pageNumber);
}

 

실행 순서는 다음과 같다.

  1. 쿼리 파라미터 파싱 → pageNumber = undefined
  2. DefaultValuePipe(1) 실행 → "1"
  3. ParseIntPipe(1) 실행 → 1
  4. 함수 실행 시 pageNumber = 1

 

원하는 대로 기본값이 잘 들어간다.

 

이렇게 ParseIntPipe 이전에 DefaultValuePipe로 쿼리파라미터의 기본값 지정하는 건 해결했다.
하지만 이 API들에게는 더 무지막지한 문제가 있었다.

다음 글에 이어서 설명하겠다.

728x90