NestJS) Controller 동적 라우팅 작성 순서 오류

봉희·2025년 1월 6일
1

nest

목록 보기
3/3

controller 내부에서 동적 라우트를 사용하는 controller가 존재했다.

그런데 그 하위에 같은 http Methods로 다른 request 요청을 했는데 계속 오류가 나왔다.

controller내부 함수에 console조차 나오지 않아 이상해서 계속 찾아봤는데 아래와 같은 원인이 있었다.

  // 동적 파라미터를 사용하는 라우트는 마지막에 배치
  @Get(':id')
  @ApiOperation({ summary: '특정 인덱스 조회' })
  @ApiResponse({
    status: HttpStatus.OK,
    description: '특정 인덱스를 조회합니다.',
  })
  // ParseIntPipe를 통해서 param string값을 숫자로 변환
  async findOne(@Param('id', ParseIntPipe) id: number) {
    const result = await this.listsService.findOne(id);

    if (!result) {
      throw new NotFoundException(`ID ${id}인 리스트를 찾을 수 없습니다.`);
    }

    return result;
  }

위와같이 동적 파라미터를 사용하는 메소드가 있다면 파일 내 하단에 배치해야 한다.

동적 파라미터 하단에 배치해야 하는 이유

NestJS(Express 기반)에서 라우트 매칭이 작동하는 방식 때문입니다.

예를 들어서 다음과 같은 순서로 라우트가 정의되어 있다고 한다면

@Get(':id')
findOne() { ... }

@Get('search')
search() { ... }

이 경우:

  1. /lists/search 요청이 들어오면
  2. 첫 번째 라우트 :id가 먼저 매칭됨
  3. search를 id 값으로 해석해버림
  4. 결과적으로 search 엔드포인트에 도달하지 못함

올바른 순서

@Get('search')    // 1. 구체적인 경로 먼저
search() { ... }

@Get(':id')       // 2. 동적 파라미터는 나중에
findOne() { ... }

이렇게 하면:

  1. /lists/search → search() 메서드로 정확히 라우팅
  2. /lists/123 → findOne() 메서드로 정확히 라우팅

즉, NestJS는

위에서 아래로

라우트를 매칭하므로:

  • 구체적인(specific) 라우트를 먼저
  • 동적(dynamic) 파라미터를 사용하는 라우트를 나중에

정의해야 모든 엔드포인트가 의도한 대로 동작합니다.

profile
3년 차 웹 풀스택 개발자 | 더 나은 사용자 경험을 만드는 개발자

0개의 댓글