postman으로 API 테스트를 하다 DELETE 요청에 body 데이터가 제대로 전달되지 않는 상황에 마주했다.
@RequestMapping(value = "delete", method=RequestMethod.DELETE)
public @ResponseBody void delete(@RequestParam Map<String, String> formdata,HttpServletRequest request) {
System.out.println(formdata);
logger.info("delete, Post method");
service.delete(formdata, request);
}
위와 같이 스프링 컨트롤러를 구성하였을 때, @RequestParam
에 해당하는 formdata가 Body에 담겨서 전달이 되야한다고 생각했는데, 전달이 되지 않았다.
그동안
GET
요청시에는 @PathVariable
로
POST
요청시에는 @RequestParam
으로 데이터를 전달했었다.
DELETE/PUT
에서는@RequestParam
이 안되는 건가?
문제를 해결하기 위해 HTTP Method
관련된 자료를 찾아보며 몰랐던 것을 배울 수 있었다.
참고한 글들은 아래와 같다.
📘 http://blog.leekyoungil.com/?p=390
📘 https://okky.kr/article/393051
📘 http://hwannnn.blogspot.com/2018/07/putdeletemapping-body.html
📘 https://sjh836.tistory.com/142
문제의 원인
: HTTP Spec 자체에서 금지하고 있어서 body에 데이터를 전달할 수 없는 것은 아니나, 일반적으로 사용되는 방식이 아님. 때문에 클라이언트, 라이브러리, 미들웨어에서 지원하지 않을 수 있다.
나의 경우에는 톰캣에서 Delete 메소드 요청시 body를 확인하는 것이 기본설정이 아니어서 문제가 발생하였다.
일반적인 HTTP 메소드 사용은 아래와 같다.
GET, DELETE => header에 데이터 포함
POST, PUT => body에 데이터 포함
특별한 경우가 아니고서는 일반적인 경우를 따르는게 좋다.
또한 보안상의 이유로 DELETE, PUT을 제한하는 경우도 있다.
특별한 이유로 사용하고자 한다면, 톰캣의 설정파일을 수정하는 방법이 있다.
톰캣의 server.xml 에 아래와 같이 parseBodyMethods 부분에 메소드를 명시하면 Body 데이터를 가져올 수 있다.
하지만, 앞서 말했듯이 일반적인 사용이 아니기에 여러 환경에서 호환이 되지 않을 수 있다.
될 수 있다면 header에 데이터를 담고 '@PathVariable'를 사용하는 것이 좋을 것 같다.