
지금까지 제가 프로젝트에서 개발하던 내용은 서버가 서버 역할"만" 수행하던 간단한 내용들이였습니다.
예를 들어 Client에서 Member를 생성해달라고 요청을 보내면 서버의 로직을 통해 DB에 저장하는 것이 전부였죠.
즉, 나 혼자 모든 작업을 처리할 수 있는 단계였습니다
그러나 프로젝트를 진행하면서 혼자서 처리할 수 없는 작업이 생기기도 합니다.
예를 들어, 결제 시스템을 구현할때 카카오페이 결제모듈을 통합하거나,
회원가입 시 이메일 인증 시스템을 도입하는 등의 작업이 그렇다고 할 수 있습니다.
이럴때 우리는 다른 서버에 요청을 보내서 응답을 받아와 클라이언트에게 전달해야 합니다.
저 같은 경우에는 프로젝트에서 번역 기능을 개발하다가 내 서버에서 번역 서버로 요청할 일이 생겼습니다.
이러한 경우에는 내 서버가 다른 서버에서에 클라이언트 역할을 수행하게 됩니다.

이럴때 Spring Framework에서는 이러한 요청을 간편하게 할 수 있도록 도와주는 라이브러리를 제공하고 있는데, 그것을 RestTemplate 이라고 합니다.
RestTemplate은 스프링 3.0부터 지원되었고, Json이나 XML 모두 응답을 받을 수 있습니다.
또한 HTTP GET, POST, PUT, DELETE 등의 다양한 메서드를 사용하여 RESTful 웹 서비스와 통신할 수 있습니다.

어플리케이션 내부(클라이언트 입장의 서버) 에서 RestTemplate를 생성하고,
URL, HTTP 헤더, Body 등 요청하려는 서버의 형식에 맞춰서 요청을 보냅니다.
RestTemplate는 HttpMessageConverter를 사용하여 requestEntity를 요청메세지로 변환합니다.
참고, HttpMessageConveter는 HTTP 요청 및 응답 메시지를 직렬화(Serizliaze)하거나,
역직렬화(Deseralize)하는 데 도움을 주는 인터페이스입니다.
HTTP 요청을 보낼때 Java 객체 -> HTTP 메시지, 응답할때 HTTP 메시지 -> Java 객체로
변환하는 역할을 수행합니다. 이는 클라이언트와 서버 간의 원활한 데이터 전송을 돕습니다
우리는 대부분 다른 서버와 JSON 형식으로 소통하므로 HttpMessageConvter의 구현체인 MappingJackson2HttpMessageConverter를 사용하게 됩니다
참고로, MappingJackson2HttpMessageConverter는 @ResponseBody와 @RequestBody 같은 Spring MVC에서 사용되는 애노테이션을 처리하는 데 사용되기도 합니다.
중요한 내용이므로 모르시는 분은 찾아보시길 권장드립니다.
RestTemplate 는 ClientHttpRequestFactory 로 부터 ClientHttpRequest를 가져와 요청을 보냅니다.
ClientHttpRequest 는 요청메세지를 만들어 HTTP를 통해 서버(서버 입장의 서버)에 요청합니다.
ResponseTemplate 는 ResponseErrorHandler로 오류를 처리합니다.
ClientHttpResponse에서 응답 데이터를 가져와 오류가 있으면 처리합니다.
RestTemplate는 HttpMessageConverter를 이용해 응답 메세지를 java object로 변환합니다.
이때도 JSON으로 받는 데이터를 우리는 Java 객체로 받길 원하므로 MappingJackson2HttpMessageConveter가 사용되게 됩니다.
어플리케이션에 반환 됩니다.


RestTemplate HTTP 요청 예시
URI를 생성하는 방법에는 여러 가지가 있지만 일반적으로 이 방법을 사용한다
1. 문자열로 직접 생성 (가장 많이 사용됨, 바로 서버 주소를 적는경우)
2. URIComponentsBuilder 사용 (PathVariable이나, QueryParameter가 필요할 경우)
3. URI 생성자 사용body 부분에는 HTTP Request의 Body부분에 담아서 보내고싶은 객체를 인자로 전달하면
RestTemplate 내부에서 HTTP Body에 변환하여 담아준다.
아까 얘기했던 HttpMessageConverter를 통한 직렬화가 여기서 사용된다.
요청을 보낸후 응답은 요청을 보낼때 지정했던 Type에 맞게 반환값에 담기게 된다 예를들어 String.class로 지정했다면 Response<String>으로 반환받게 된다.
반환받은 ResponseEntity에서 getStatusCode()를 사용해 Httpstatus 코드를 확인할 수 있고,
getBody()를 사용해 응답된 진짜 내용을 확인할 수 있습니다.
https://velog.io/@dlzlqlzl/Spring-RestTemplate#span-stylecolor17b783-resttemplatespan