NestJS 공식문서에서 Controller 설명을 보던 중, Route parameters에 다음과 같은 문장이 있었다.
Routes with parameters should be declared after any static paths. This prevents the parameterized paths from intercepting traffic destined for the static paths.
해석했을 때, 파라미터 라우트는 모든 정적 경로 라우트 이후에 선언되어야 한다. 그래야 파라미터 경로가 정적 경로로 향하는 트래픽을 가로채는 것을 방지할 수 있다. 라는 의미로 받아들였다.
그런데 왜 파라미터 경로가 정적 경로로 향하는 트래픽을 가로챈다는 것인지 이해가 되지 않았는데, 아래 예시를 통해 쉽게 이해할 수 있었다.
아래와 같은 두 개의 라우트가 있다고 가정해 보자.
/users/:id
/users/profile
/users/:id
- 동적으로 id 값을 받을 수 있는 파라미터 라우트/users/profile
- 정적 경로 라우트위 두 개의 라우트를 선언할 때, /users/:id
라우트를 /users/profile
라우트보다 먼저 선언하면, /users/profile
경로로 요청이 들어오더라도 /users/:id
라우트에서 처리된다. 이 경우 요청이 잘못된 라우트에서 처리되어 올바른 경로에 요청을 전달하지 못하게 된다.
만약 /users/:id
라우트에서 id
를 number 타입으로 선언한 상태에서 /users/profile
경로로 요청이 들어오면 id
에는 'profile'이라는 문자열이 들어가게 되고, 아래와 같은 에러가 발생할 수 있다.
{
"statusCode": 400,
"message": "Validation failed (numeric string is expected)",
"error": "Bad Request"
}
따라서 정적 경로 라우트인 /users/profile
을 우선 선언한 다음 파라미터 라우트인 /users/:id
를 선언해야 한다. 이렇게 하면 정적 경로와 동적 경로가 구분되어 올바른 라우트 핸들러로 요청이 전달된다.
/users/profile
/users/:id