resolved [org.springframework.web.httprequestmethodnotsupportedexception: request method 'delete' not supported]
@DeleteMapping("/custom/{customExtensionId}")
public String deleteCustomExtension(@PathVariable int customExtensionId) {
customExtensionService.deleteCustomExtension(customExtensionId);
return "redirect:/";
}
이와 같은 코드로, DELETE 요청을 보내는 상황. 분명 이는 PostMapping처럼 redirect를 제대로 실행하여 http://localhost:9005/ 의 Mapping된 html파일을 불러들여야했다. 하지만, 이상하게 오류메시지와 함께 문제가 해결되지 않았다.
상태코드 302와 함께 Redirect를 해주고 있었다.
하지만, 요청은 http://localhost:9005/ 의 DELETE 메소드로 가는 상황.
분명 POST 요청의 302 리다이렉트는 http://localhost:9005/ 의 GET 메소드로 리다이렉션이 되는데, 이는 되지 않았다.
그래서 내부적으로 DELETE 요청을 절대로 GET 요청으로 바꿀 수 없는 건가라는 생각을 했는데, 이는 말이 되지 않는다고 생각했다. 실제로 인터넷(다양한 서비스)에서는 DELETE 메소드를 GET 메소드로 바꿔 리다이렉트를 하는 경우도 많았다.
그래서 혹시나 하는 마음으로 상태코드를 찾아보게 되었다.
상태 코드
여기서 문제점을 알게 되었다. 상태 코드 302는 GET으로 변하지 않을 수 있다는 사실이었다. 그래서 강제로 303으로 ResponseStatus를 바꿔보기로 했다.
바꾼 코드
@ResponseStatus(HttpStatus.SEE_OTHER)
@DeleteMapping("/custom/{customExtensionId}")
public String deleteCustomExtension(@PathVariable int customExtensionId) {
customExtensionService.deleteCustomExtension(customExtensionId);
return "redirect:/";
}
이렇게 하니, http://localhost:9005/ 의 GET 요청으로 제대로 가게 되었다.
이번 기회에, ResponseStatus에 대해 좀 자세하게 알게 된 것 같다. 이전에 김영한님의 강의에서 리다이렉션 관련 강의를 들으면서 이 얘기를 들었었던거 같은데 다시 한 번 읽어보면 좋을 거 같다.