본문 바로가기
Java

[REST API] DELETE 메서드로 requestBody를 보낼 수 없는 이유 / 보내는 법

by Eric_K 2021. 4. 10.

이 문제는 필자가 서비스 개발을 위해 외부 API 연동을 테스트하면서 겪은 문제이다.

 

API 스펙을 보면 DELETE 메서드로 requestBody를 보내라고 해서 분명 값을 Set해서 보내주는걸 확인했음에도

 

데이터 처리가 안됐었다.

 

그래서 해당 사이트 개발자에게 로그를 확인해달라고 했고, 답변은 body가 없다는 내용이였다.

 

문제 원인

결론부터 말하면, Spring 버전문제였다.

 

통신을 할 때 스프링에 내장된 RestTemplete 객체를 사용하는데, Spring 4.2.x 버전부터는 DELETE 메서드에 대해서 body를 세팅해준다.

 

하지만 우리가 사용하고 있는 버전은 3.2.x 여서 body가 세팅이 안됐던 것이다.

 

프레임워크 버전업은 다른 서비스에 영향을 줄 수 있는 여지도 크고 위험성도 크기 때문에 다른방법을 찾아야 했다.

 

해결 방법

request를 생성하고 속성을 정의하는 클래스는 ClientHttpRequestFactory 인터페이스의 구현체 SimpleClientHttpRequestFactory다.

 

이 클래스에서 request를 생성할 때 사용하는 메서드 createRequest 안에 있는 prepareConnection 메서드를 보면 아래와 같은 코드가 있다.

 

 

<사진 1 - prepareConnection 메서드>

 

위에서 보면 PUT, POST 메서드인 경우에만 setDoOutput = true로 되어있는 것을 볼 수 있는데, 이 부분이 requestBody의 전송여부를 결정하는 부분이다.

 

따라서, SimpleClientHttpRequestFactory를 상속시킨 클래스를 하나 만들어서 setDoOutput = ture로 값을 지정하고, DELETE 메서드로 통신이 필요한 경우 분기문 처리해서 해당 클래스로 통신을 하게 하면 된다.

 

<사진 2 - 상속 받아 만든 클래스 >

 

이전 스프링 버전에서 지원하지 않은 이유?

Http 1.1 가이드 문서격인 RFC-7231을 보면

 

A payload within a DELETE request message has no defined semantics; sending a payload body on a DELETE request might cause some existing implementations to reject the request.

 

DELETE 안에 있는 페이로드에 대해서는 정의가 되지 않았다고 한다.

 

그래서 구 버전에서는 body를 세팅하지 않게 했다가, 필요성에 의해 이후 버전에서 수정을 하지 않았나 싶다(문서상 금지된 것은 아니니까)

 

* RFC(Request For Comment : IETF(Internet Engineering Task Force)에서, 인터넷에서 기술을 구현하는 데에 필요한 절차 등을 제공하는 공문서 간행물이다.

'Java' 카테고리의 다른 글

[스크랩] 동시성 문제 예시 및 해결방안  (0) 2022.04.14
객체 생성 패턴 - Builder Pattern  (0) 2022.02.20
Java Stream 과 for-loop 성능 비교  (0) 2022.02.09

댓글