Request method 'GET' not supported 뿐만 아니라
Request method 'GET' not supported,
Request method 'PUT' not supported
등등. Request method '{HTTP method}' not supported 관련 에러가 뜰 때 해당되는 포스팅이다.
보통 405 Method Not Allowed, 500 Internal Server Error와 함께 발생할 확률이 높다.
나의 경우는 특정 기능을 수행하거나 테스트할 때 위 문구와 함께 500 에러가 발생했다.
원래대로라면 body에 원하는 객체의 속성들이 담겨있어야 한다.
하지만 결과는?
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "message"
에러와 함께 에러메시지 문구가 들어간 것이다.
(위 문구는 스프링을 사용했을 경우에 발견될 것이다.)
왜 그런 것일까?
지정된 Http Method에 맞게 사용하자
결론부터 말하자면, 지정된 http method에 맞지 않게 api를 사용해서 그렇다.
특히 405 에러는 Method Not Allowed 를 나타내는 에러이다. 허용되지 않은 Http Method를 사용할 때 발생하는 status code다.
api를 사용하여 개발 프로젝트를 하든, 아니면 만든 api를 테스트할 때 사용하든간에, 그 api를 호출할 때에는 http method에 맞게 사용해주어야 한다.
나는 api를 e2e test할 때, 해당 라인 리소스를 조회하는 기능을 실행해주기 위해 "/lines/{lineId}" URI에 해당되는 api를 호출하고 있었다.
해당 라인 리소스를 조회하는 기능은 위 사진처럼 GET http method인데, POST로 접근한 것이다.
따라서 에러가 발생한다.
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException 는 왜?
내가 의도한 것은 해당 리소스를 조회하는 기능을 사용하여 Line을 응답으로 받으면, 그 응답이 올바른지 assertJ 문법으로 확인하는 것이었다. 하지만 실제로는 POST에 해당되는 다른 기능의 응답이 들어왔고, 그 응답에는 당연히 에러메시지가 body에 들어가있을 것이다.
에러를 잘 보면 jackson 라이브러리에서 데이터를 바인딩할 때, 올바르지 않은 속성이 발견됐다는 내용이다. 우리는 해당 리소스의 속성인 id, stations, name, color 등등의 값이 json 객체 형태로 들어오길 기대했는데, 갑자기 에러메시지 속성이 응답으로 왔기 때문에 jackson이 바인딩에 실패한 것이다.
Unrecognized field "message" (class wooteco.subway.dto.LineResponse),
not marked as ignorable (4 known properties: "id", "stations", "name", "color"])
괜히 위 에러가 덤으로 발생하는 게 아니다.
특히 주의할 점은, Http method를 지정해주는 해당 라인에 에러가 뜬다고 표시되지 않을 수도 있다는 것이다. 일단 에러메시지를 담고 있는 json 객체를 응답으로 넘겨주고, 그 객체를 사용할 때 에러가 발생하는 경우도 많기 때문이다.
그나마 위와 같은 경우는 에러메시지를 보고 쉽게 고칠 수 있어서 다행이지만, 만약 잘못 사용한 Http method에 해당되는 URI의 api가 존재한다면? 에러를 찾기는 더더욱 힘들어진다.
(예시: https://kth990303.tistory.com/321 )
이 경우에는 다른 에러가 발생할 수도 있고, 아예 에러가 발생하지 않고 응답값에 이상한 값이 담길 수도 있으니 주의하자.
따라서 정신차리고 개발을 하도록 하자.