저는 NestJS를 활용한 개발에 vscode를 이용하고 있습니다. 이때 vscode에는 브레이크 포인트(중단점)을 찍어서 디버깅할 수 있는 기능을 제공합니다. 그런데 가끔 Controller에 구현한 코드 위에 브레이크 포인트를 걸었음에도 불구하고 디버깅이 되지 않는(브레이크 포인트에 걸리지 않음) 경우가 가끔 있었는데요. 이때 제가 경로 설정 관련해서 놓치고 있던 정보들을 공유해 이런 에러 해결에 도움을 주려 합니다.
문제 상황
# controller 코드 중 일부
@Controller('post')
export class PostController {
constructor(private readonly postService: PostService) {}
@Get(':id')
async findPost(@Param('id') id: number) {
return await this.postService.findPost(id);
}
@Get('category')
async findCategory() {
return await this.postService.findCategory();
}
}
위와 같이 controller를 작성했다고 가정합시다. 그럼 궁금한 점이 생깁니다. 만약 '/post/category'라는 경로로 GET 요청을 보내면 어떻게 될까요?
어떤 분들은 당연히 두번째 작성된 @Get('category')로 요청이 전달되지 않나? 라고 생각할 수 있습니다. 왜냐하면 요청 경로와 정확히 일치하는 경로의 설정이기 때문입니다. 하지만 /post/:id 요청으로 전달되어서 category라는 경로값이 id라는 경로 변수로 인식된다면 어떻게 될까요? 바로 이 부분이 에러가 발생하는 부분입니다.
저는 위와 같은 설정을 통해 진행한 결과 /post/category GET 요청이 첫번째 코드인 /post/:id GET 요청 부분에 전달됨을 확인했습니다. 그럼 어떻게 해야 두번째 코드인 /post/category GET 요청 부분에 전달될까요?
해결방법
제가 문제를 해결한 간단한 방법은 코드 '순서'입니다. 바로 아래와 같이 두 코드의 순서만 바꿨더니 제가 원하는 방식으로 동작하기 시작했습니다.
# controller 코드 중 일부
@Controller('post')
export class PostController {
constructor(private readonly postService: PostService) {}
@Get('category') # 기존 두번째 코드 첫번째로 작성
async findCategory() {
return await this.postService.findCategory();
}
@Get(':id') # 기존 첫번째 코드를 두번째로 작성
async findPost(@Param('id') id: number) {
return await this.postService.findPost(id);
}
}
이 부분은 NestJS 공식 문서에서 확인할 수 있는 내용이었습니다. 바로 경로 변수, 즉 동적 라우팅에 사용되는 Route Parameter(저는 path variable이라는 용어를 사용했었는데 nest js에서는 route parameter라는 용로 표시되어 있습니다) 관련 내용을 참고하니 문제를 해결할 수 있었습니다.
Documentation | NestJS - A progressive Node.js framework
Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea
docs.nestjs.com
공식문서 내용 해석
위 내용을 확인해보면 아래와 같은 내용을 확인할 수 있습니다.
Hint
Routes with parameters should be declared after any static paths. This prevents the parameterized paths from intercepting traffic destined for the static paths.
즉, 동적 라우팅 설정은 정적 라우팅 설정 이후에 해야 두 설정간 혼선을 막을 수 있다는 팁입니다. 그래서 모든 동적 라우팅은 정적 라우팅 이후에 실행될 수 있도록 controller 코드의 순서를 변경해 문제를 해결할 수 있었습니다.
'백엔드 > NestJS' 카테고리의 다른 글
[NestJS] 컨트롤러 파라미터 유효성 검증 방법 (Pipes, DTO, @Transform) (0) | 2024.12.04 |
---|---|
[NestJS] 동적 라우팅 오류 없애기( route paramter, path variable ) (0) | 2024.11.28 |
[NestJS]Jest를 이용해 테스트하자 - 1. 유닛 테스트(Unit Testing) (0) | 2024.11.12 |
[NestJS]내장된 기능 활용해 마이크로서비스 구현하기 - 4. Kafka (0) | 2024.11.04 |
[NestJS]내장된 기능 활용해 마이크로서비스 구현하기 - 3. MQTT (0) | 2024.11.04 |