testrestTemplate를 이용해 코드를 작성하면서, 이상한 점을 발견했다.
testrestTemplate.exchange()를 이용해 요청 바디와 함께 GET요청을 보냈는데, 다음의 예외가 발생하면서 테스트에 실패했다.
[org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing:
그래서 testrestTemplat.exchange() 호출부터 디버깅을 해보았다.
DispatcherServlet의 doService()가 호출된다.

DispatcherServlet은 컨트롤러를 실행해 줄 핸들러 어댑터를 찾는다.
핸들러 어댑터는 ArgumentResolver의 supportsParameter()를 호출해서
해당 파라미터를 지원하는지 확인한다.


지원한다면 ResolveArguments()를 호출해서 실제 객체를 생성한다.



해당 클래스, 미디어 타입에 맞는 메시지 컨버터를 찾고, 컨버터를 이용해 데이터를 읽는다.


문제는 message.body에 내가 보낸 데이터가 존재해야 할텐데 존재하지 않는다.


message.hasBody() 가 false가 되기 때문에, 결국 readWithMessageConverters는 null을 리턴하게 된다.
arg값이 null이 되기 때문에 if문에 걸려 HttpMessageNotReadableException이 발생하게 된다.

분명 GET요청과 함께 BODY데이터를 보냈는데 왜 없다고 나오는것일까?

여러 키워드로 검색을 해보다 답을 발견했다.

->디폴트인 ClientHttpRequestFactory와 함께 RestTemplate를 사용하면,
JDK의 HttpURLConnection은 기본적인 HTTP client 이다.
HttpURLConnection은 GET요청과 함께 요청 바디를 보내지 않는다.
- RestTemplate 의 동작원리
org.springframework.http.client 패키지에 있다.
HttpClient는 HTTP를 사용하여 통신하는 범용 라이브러리이고, RestTemplate은 HttpClient 를 추상화(HttpEntity의 json, xml 등)해서 제공해준다.
따라서 내부 통신(HTTP 커넥션)에 있어서는 Apache HttpComponents(HttpClient) 를 사용한다. 만약 RestTemplate 가 없었다면, 직접 json, xml 라이브러리를 사용해서 변환해야 했을 것이다.
출처: https://sjh836.tistory.com/141 [빨간색코딩]
만약 GET요청과 함께 요청 바디를 보내고 싶다면
다음의 내용을 참고하면 좋을 것 같다.
https://stackoverflow.com/questions/62309635/resttemplate-get-with-body
[강의] 영한님 MVC1편
https://sjh836.tistory.com/141
https://github.com/spring-projects/spring-framework/issues/20978
https://stackoverflow.com/questions/62309635/resttemplate-get-with-body
https://mekaso.rocks/get-requests-with-a-request-body-spring-resttemplate-vs-apache-httpclient