RESTFUL API를 만들면서 QueryFailedError: invalid input syntax for type uuid 라는 에러가 발생했다.
상황은 이렇다.
controller.ts 파일에서 @Put() 메서드에 url path 지정을 하지 않고 API DEV 환경에 배포를 해놓은 상황이고, 프론트엔드단에서 이 API를 토대로 데이터를 사용하려던 중에 다른 @Put('/:id') 메서드와 경로가 겹칠 수 있다는 것이다. 그래서 다시 확인을 해보았다.
나는 @Put()을 지정했던 이유가, 위와 같은 에러가 계속 발생해서 url path 지정을 따로 해주지 않았던 것인데, 해당 에러가 나는 상황에서 에러로그를 살펴보니, @Put('/:id')를 쓰는 곳에서 무언가 문제가 발생하여, 자꾸 내가 작성한 @Put()메서드에 url path 지정을 하려고 하면 같은 에러가 반복한 것이다.
시도해본 방법
@Put() 내부에 url path 이름 지정 시
1) update-policy
2) policy 와 같이 명사형 단어 1개로도 해봤는데 QueryFailedError: invalid input syntax for type uuid 라는 에러가 계속 발생하는 것이다.
해결방법
알고보니, 내가 작성했던 @Put() 메소드 바로 위에 @Put('/:id/ddd') -> ddd는 예시. 로 id값을 param으로 타는 로직이 이미 정의가 되어있었기 때문에, 이 메소드가 먼저 실행이 되니 내가 작성한 @Put() 메소드에도 영향이 갔던 것이다.
그래서 나의 경우 @Put('/:id/policy')로 수정을 해주었더니, 해당 에러가 사라졌다.
알게된 점
1) 같은 @Put() 메소드라도 먼저 작성된 로직이 먼저 실행이 되므로, 그 로직이 실행되고 내가 그 다음에 작성하는 로직은 어떤 영향을 받는지 생각해보아야 한다 -> 개발의 사이드이펙을 고려하기란 참 쉽지 않다 ㅠㅠ
2) prefix가 @Controller('prefix 이름')으로 controller.ts 파일에서 상단 선언문에 붙는데, 이때 prefix의 id란것을 알려주기 위해서(종속성 관계) prefix의 id다! 라는 의미로 @Put('/:id/policy)로 작성을 하는게 좋다고 한다. 그러나 사실 /:id값이 policy 기준 앞으로 오든, 뒤로 오든 결과는 정상적으로 출력됐는데, url path 설계는 정확할수록 좋다.
3) url path 설계할때 'update-policy' 이런 이름으로 시도하려고 했는데, 안좋은 방법이라고 깨달았다. url에는 행동이 드러나는 동사/형용사는 지양하고, 명사형으로 표현하는게 좋다고 한다(필요한 경우 명사의 복수형으로 표현도 가능). url은 자원을 표현하는데 중점을 두기 때문에 명사형을 주로 사용한다고 한다.
'Backend > NestJS' 카테고리의 다른 글
NestJS 10 버전업 과정 (0) | 2023.07.26 |
---|---|
@Controller 데코레이터 위에 @UseGuards()를 선언했을 경우와 메소드에서만 선언했을때 차이점 (0) | 2023.07.26 |
timestamp 처리하는 방법 (0) | 2023.07.21 |
extends Repository<레포지토리명>이 아닌 <엔티티명>으로 가야하는 이유 (0) | 2023.07.20 |
[TypeORM] @OneToMany 그리고 @ManyToOne에서 추가로 알게 된 것들 (0) | 2023.07.02 |