본문 바로가기

Backend/NestJS

QueryFailedError: invalid input syntax for type uuid

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은 자원을 표현하는데 중점을 두기 때문에 명사형을 주로 사용한다고 한다.