장정우님이 지음, [스프링부트 핵심가이드 :: 스프링 부트를 활용한 애플리케이션 개발 실무] 책을 읽고 정리한 필기입니다.📢

최근에 개발되는 서비스들은 마이크로서비스 아키텍처(MSA)를 주로 채택하고 있다. MSA는 말 그대로 애플리케이션이 가지고 있는 기능(서비스)이 하나의 비즈니스 범위만 가지는 형태이다. 각 애플리케이션은 자신이 가진 기능을 API로 외부에 노출하고, 다른 서버가 그러한 API를 호출해서 사용할 수 있게 구성되므로 각 서버가 다른 서버의 클라이언트가 되는 경우도 많다. 이번 장에서는 이러한 트랜드에 맞춰 다른 서버로 웹 요청을 보내고 응답을 받을 수 있게 도와주는 RestTemplateWebClient에 대해 살펴보겠다.

RestTemplate 이란?

RestTemplate은 스프링에서 HTTP 통신 기능을 손쉽게 사용하도록 설계된 템플릿이다. HTTP서버와 통신을 단순화한 이 템플릿을 이용하면 RESTful 원칙을 따르는 서비스를 편리하게 만들 수 있다. RestTemplate 은 기본적으로 동기 방식으로 처리되며, 비동기 방식으로 사용하고 싶을 경우 AsyncRestTemplate을 사용하면 된다. 다만 RestTemplate은 현업에서는 많이 쓰이나 지원 중단(deprecated)된 상태라서 향후 빈번하게 쓰이게 될 WebClient방식도 함께 알아둘 것을 권장한다.

RestTemplate은 다음과 같은 특징을 가지고 있다.

  • HTTP 프로토콜의 메서드에 맞는 여러 메서드를 제공한다.
  • RESTful 형식을 갖춘 템플릿이다.
  • HTTP 요청 후 JSON, XML, 문자열 등의 다양한 형식으로 응답을 받을 수 있다.
  • 블로킹(blocking) I/O 기반의 동기 방식을 사용한다.
  • 다른 API를 호출할 때 HTTP 헤더에 다양한 값을 설정할 수 있다.

RestTemplate의 동작 원리

RestTemplate의 동작을 도식화하면 아래와 같다.


image


여기서 애플리케이션은 우리가 직접 작성하는 애플리케이션 코드 구현부를 의미한다. 애플리케이션에서는 RestTemplate을 선언하고 URI와 HTTP 메서드, Body 등을 설정한다.

그리고 외부 API로 요청을 보내게 되면 RestTemplate에서 HttpMessageConverter를 통해 RequestEntity를 요청 메시지로 변환한다.

RestTemplate에서는 변환된 요청 메시지를 ClientHttpRequestFactory를 통해 ClientHttpRequest로 가져온 후 외부 API로 요청을 보낸다.

외부에서 요청에 대한 응답을 받으면 RestTemplateResponseErrorHandler로 오류를 확인하고, 오류가 있다면 ClientHttpResponse에서 응답 데이터를 처리한다.

받은 응답 데이터가 정상적이라면 다시 한번 HttpMessageConverter를 거쳐 자바 객체로 변환해서 애플리케이션으로 반환한다.

RestTemplate의 대표적인 메서드

RestTemplate에서는 더욱 편리하게 외부 API로 요청을 보낼 수 있도록 다음과 같은 다양한 메서드를 제공한다.


메서드 HTTP 형태 설명
getForObject GET GET 형식으로 요청한 결과를 객체로 반환
getForEntity GET GET 형식으로 요청한 결과를 ResponseEntity결과로 반환
postForLocation POST POST 형식으로 요청한 결과를 헤더에 저장된 URI로 반환
postForObject POST POST 형식으로 요청한 결과를 객체로 반환
posetForEntity POST POST 형식으로 요청한 결과를 ResponseEntity 형식으로 반환
delete DELETE DELETE 형식으로 요청
put PUT PUT 형식으로 요청
patchForObject PATCH PATCH 형식으로 요청한 결과를 객체로 반환
optionsForAllow OPTION HTTP 헤더를 임의로 추가할 수 있고, 어떤 메서드 형식에서도 사용할 수 있음
exchange any HTTP 헤더를 임의로 추가할 수 있고, 어떤 메서드 형식에서도 사용할 수 있음
execute any 요청과 응답에 대한 콜백을 수정

SpringBoot 카테고리 내 다른 글 보러가기

댓글남기기