Java / / 2022. 7. 24. 11:43

[Spring] RestTemplate 이란 무엇인가?

반응형

▶ RestTemplate 이란?

  • RestTemplate은 간편하게 Rest방식의 API를 호출할 수 있는 Spring  내장 클래스이다.
  • Spring 3.0부터 지원하는 Spring의 HTTP 통신 템플릿이다.
  • Restful의 원칙을 지킬 수 있으며 HTTP 메서드들에 적합한 여러 메서드 제공한다.
  • JSON, XML, String 응답을 모두 받는다.
  • Blocking I/O 기반의 동기방식을 사용한다. (Rest API 호출 후 응답을 받을 때까지 기다림)
  • Header + Content-Type을 설정해서 외부 API 호출이 가능하다.

 

▶ RestTemplate 메서드

 

 기본적으로 exchange() 함수를 많이 사용한다.

- get 요청에 header가 필요한 경우 get Method에서는 header를 추가할 수 없으므로 exchange method를 사용한다.

 

 

▶ RestTemplate 사용방법

  • builde.gradle 파일에 dependencies 추가한다.
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

 

1. Rest API를 호출할 수 있는 메서드 생성한다.

 

2. RestTemplate 객체를 생성한다.

  - 생성된 객체로 api를 호출하게 된다.

 

※ HttpComponentsClientHttpRequestFactory 객체를 사용하면 다음과 같이 타임아웃을 제어 가능하다.

   - RestTemplate restTemplate = new RestTemplate();  -> 타임아웃이 필요 없다면, 왼쪽같이 생성해도 상관없다.

3. 데이터 호출

  - header클래스를 정의한다.

  - url 정의한다.

  - resTemplate.exchage() 메서드로 API 호출한다.

 

전달받는 값의 형태는 JSON이며, String 자체로 받아 파싱도 가능하다.

그리고 RestTemplate의 경우 편리하게 Map, 사용자가 정의한 class 등의 다양한 형태로 데이터를 파싱 해서 받을 수 있다.

 

◆ 다음과 같이 정의하면 된다.

  • ResponseEntity<T> response = restTemplate.exchange(uri.toString(), HttpMethod.GET, httpEntity, 원하는 클래스 타입.Class)

 

참고 : 위의 ResponseEntity에 Map<String, ?> uriVariables 추가 시

  • 쿼리 문자열을 확장시켜 주는 역할이다.
String url = "http://www.sample.com?foo={fooValue}";

Map<String, String> uriVariables = new HashMap<>();
uriVariables.put("fooValue", "2");

// "http://www.sample.com?foo=2"
restTemplate.getForObject(url, Object.class, uriVariables);

 


※ HttpEntity 

  • Spring Framework에서 제공하는 클래스 중 HttpEntity라는 클래스가 존재한다. 이것은 HTTP 요청(Request) 또는 응답(Response)에 해당하는 HttpHeaderHttpBody를 포함하는 클래스이다.
  • HTTP 프로토콜을 이용하는 통신의 header와 body관련 정보를 저장할 수 있도록 하는 역할을 한다.

 

4. 데이터 호출 결과

: ResponseEntity는 사용자의 HttpRequset에 대한 응답 데이터를 포함하는 클래스이다. 따라서 아래와 같은 정보를 포함한다.

  - http status code

  - 헤더 정보

  - 데이터 (body 정보)

 

 

▶ 참고 예제

public static <T> T send(String uri, HttpMethod method, Object vars, HttpHeaders headers, Class<T> responseType, Map<String, ?> uriVariables) {
    headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
    log.info("header {}" , headers);
    HttpEntity httpEntity = new HttpEntity(vars, headers);
    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<T> response = null;
    if(uriVariables != null)
        response = restTemplate.exchange(uri, method, httpEntity, responseType, uriVariables);
    else
        response = restTemplate.exchange(uri, method, httpEntity, responseType);
    log.info("response = > " + response );

    return response.getBody();
}
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유