STUDY/Spring

Spring Boot | RestTemplate

개미606 2021. 5. 13. 13:12

RestTemplate

  • Spring Framework에서 제공하는 동기식 템플릿 메소드 API
  • HTTP client로서 보편적인 API요청을 더 쉽게 도와준다

비동기 non-blocking HTTP Client가 필요하다면 WebClient를 사용하면 된다.
WebClietnt는 동기 및 비동기, 스트리밍 시나리오를 모두 지원함
비동기를 지원하는 AsyncRestTemplate도 있었지만 스프링 5.0부터 deprecated되었음 -> WebClient를 사용해라..

어떻게 사용하나..

일단 spring-boot-starter-web라이브러리가 추가되어있으면 자동으로 하위 항목으로 딸려온다.
보통은 bean으로 등록하여 사용한다.

@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

그리고 더 보통은 bean으로 등록 할 때 여러 설정을 추가한다.

@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
     return restTemplateBuilder
             .requestFactory(() -> new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()))
             .setBufferRequestBody(false)
             .setConnectTimeout(Duration.ofMillis(5000))
             .setReadTimeout(Duration.ofMillis(5000))
             .additionalMessageConverters(new MappingJackson2HttpMessageConverter())
             .build();
}

RestTemplateCustomizer를 이용하면 더 상세하게 설정을 할 수 있다.

주요 메서드

요청하는 메서드들의 종류는 다앙하다. 그 중 많이 사용 하는 것들을 적어보자면

  • [method]ForEntity : 해당 메서드로 요청하고, ResponseEntity로 응답받는다 ex) getForEntity는 GET으로 요청
  • [method]ForObject : 해당 메서드로 요청하고, 특정 객체로 응답받는다
  • exchange : HTTP 메서드를 직접 지정하여 요청하며, 원하는 객체로 응답받는다

요청 예시

postForEntity로 요청하는 예시다. 기본 사용 법은 url, HttpEntity, 응답 값을 받을 타입의 클래스를 전달한다.

public <T> ResponseEntity<T> postForEntity(String url,
                                           @Nullable
                                           Object request,
                                           Class<T> responseType,
                                           Object... uriVariables)
                                    throws RestClientException

이런식으로 사용한다.

ResponseEntity<HashMap> responseEntity = restTemplate.postForEntity(url, httpEntity, HashMap.class);

HttpEntity?

HttpEntity는 HTTP 요청 / 응답에 사용되는 값으로, headersbody를 갖는다. 아래처럼 바로 생성할 수도 있고, setter로 주입할 수도 있다.

HttpEntity(T body, MultiValueMap<String,String> headers)