[Spring] Rest API의 Request, Response 핸들링

sonnie
lucky-sonnie
Published in
4 min readDec 16, 2020

REST api 에러 핸들링을 하면서 궁금했던 점들을 정리해 보겠습니다.

  • RestTemplate 을 사용하여 rest api 를 호출하고 Response를 받아오는 방식이 어떻게 이루어 지는지? (HttpEntity와 ClientHttpRequestFactory)
  • Rest api 오류 응답을 custom 하게 처리하는 방법 (ResponseErrorHandler)

Spring RestTemplate class

스프링 애플리케이션에서 REST api 에 접근하는 것은 Spring RestTemplate 클래스 사용을 중심으로 이루어진다. RestTemplate은 스프링의 다른 Template (ex. JdbcTemplate, JmsTemplate) 과 동일한 방식으로 설계되어 복잡한 작업을 수행하기 위한 기본 동작을 제공함으로써 단순하게 접근할 수 있도록 한다. (구체적인 사용 예시 링크!)

Spring framework 5에서 webFlux 스택과 함께 spring 은 WebClient 라는 새로운 Http client를 도입했다. WebClient 는 RestTemplate에 대한 최신 대체 Http 클라이언트이다. 기존의 동기식 Api 를 제공할 뿐만 아니라 논 블록킹과 비동기 접근 방식도 지원하기 때문에 앞으로는 RestTemplate을 사용하지 않게 될 것이다.

  1. application 이 RestTemplate을 생성하고, URI, Http 메소드 등의 헤더를 담기를 요청한다.
  2. RestTemplate은 HttpMessageConverter를 통해 requestEntity를 요청 메시지(여기선 JSON 방식)로 변환한다.
  3. RestTemplate은 ClientHttpRequestFactory 로 부터 ClientHttpRequest를 가져와 Request를 보낸다.
  4. ClientHttpRequest는 요청 메시지를 만들어 HTTP(S) 프로토콜을 통해 REST API와 통신한다.
  5. RestTemplate은 ResponseErrorHandler로 오류를 확인하고 있다면 처리로직을 태운다.
  6. ResponseErrorHandler는 오류가 있다면 ClientHttpResponse에서 응답 데이터를 가져와 처리한다.
  7. RestTemplate은 HttpMessageConverter를 이용해 응답 메시지를 자바 객체로 변환한다.
  8. 어플리케이션에 반환된다.

에러처리

default ResponseErrorHandler 를 사용해 HTTP Error 를 제어한다. restTemplate.setErrorHandler를 통해 커스텀 핸들러를 등록할 수 있다.

ResponseErrorHandler 의 메소드들

  • hasError : 주어진 응답에 오류가 있는지 여부를 나타냅니다.
    구현은 일반적으로 응답의 HttpStatus를 검사합니다.
  • handleError :주어진 응답에서 오류를 처리합니다.
    이 메서드는 hasError (ClientHttpResponse)가 true를 반환 한 경우에만 호출됩니다.

참고

https://sjh836.tistory.com/141

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/ResponseErrorHandler.html

--

--