새소식

Java/Spring

Spring RestTemplate 사용하기

  • -
728x90
반응형

RestTemplate 란?

Spring 에서 간편하게 Rest 방식 API 를 호출할 수 있는 내장 클래스이다.

Spring 3.0 부터 지원되며 응답은 Json, xml 모두 받을 수 있다.

Rest API 요청 시 응답 받을 수 있도록 설계되어 있으며, HTTP 메소드(GET, POST, PUT, DELETE)들에

적합한 여러 메소드들을 제공한다.

 

RestTemplate 특징

  • Rest API 를 간편하게 호출 후 응답 받을 수 있는 Spring 내장 클래스
  • Spring 3.0 부터 지원하는 HTTP 통신 템플릿
  • HTTP 요청 후 Json, XML, String 등 여러 형태로 응답 받을 수 있는 템플릿
  • HTTP HEADER, Content-Type 등을 설정하여 외부 API 호출
  • Server to Server 통신

 

RestTemplate 동작원리

 

1. Rest API 요청을 위해 RestTemplate 객체를 생성하여 메서드를 호출한다.

2. RestTemplate 는 MessageConverter 를 이용해 Request Body(요청 Body) 에 담을 Message(Json, xml) 로

변환한다. Request 데이터에 따라 Message 형태는 다르다.

3. ClientHttpRequestFactory 에서 ClientHttpRequest 을 받아와 요청을 전달한다.

4. 실질적으로 ClientHttpRequest 가 HTTP 통신으로 요청을 수행한다.

5. RestTemplate 가 에러 핸들링을 한다.

6. ClientHttpResponse 에서 응답데이터를 가져와 에러 핸들링 및 응답 데이터를 전달한다.

7. MessageConverter 를 이용해 응답 데이터에 담기 위해 Java 객체로 변환한다.

8. 결과를 요청한 어플리케이션으로 반환한다.

 

 

RestTemplate 메서드

getForObject : Object GET GET 방식 요청으로 결과를 객체로 반환
getForEntity : ResponseEntity GET GET 방식 요청으로 결과를 ResponseEntity로 반환
postForLocation POST POST 방식 요청으로 결과를 헤더에 저장된 URI로 반환
postForObject : Object POST POST 방식 요청으로 결과를 객체로 반환
postForEntity : ResponseEntity POST POST 방식 요청으로 결과를 ResponseEntity로 반환
delete DELETE DELETE 방식 요청으로 메서드 실행
headForHeaders HEADER 헤더의 정보를 얻을 수 있고, HTTP HEAD 메서드 사용
put PUT HTTP PUT 메서드를 실행
patchForObject PATCH HTTP PATCH 메서드를 실행
optionsForAllow OPTIONS 지원하는 HTTP 메서드 조회
exchange : ResponseEntity any 헤더 생성 및 어떤 요청이든 사용 가능
execute any Request/Response 콜백을 수정할 수 있음

 

RestTemplate 사용 예시

1. RestTemplate 사용을 위한 Maven 의존성 추가

<dependency>
   <groupId>org.apache.httpcomponents</groupId>
   <artifactId>httpcore</artifactId>
   <version>4.4.15</version>
</dependency>

<dependency>
   <groupId>org.apache.httpcomponents</groupId>
   <artifactId>httpclient</artifactId>
   <version>4.5.13</version>
</dependency>

pom.xml 에 추가 후 프로젝트 마우스 오른쪽 버튼 > Maven > Update Project... > Update

 

2. RestTemplate 생성 후 Rest API 요청

Rest API 요청을 위해 RestTemplate 객체를 생성하고 Header, URL, 응답 객체 등 설정하여 

RestTemplate 의 exchange 메서드를 통해 API 요청을 한다.

Rest API 요청 서버
@GetMapping(value="/login/main")
public String login() {
	// RestTemplate 객체 생성
    RestTemplate restTemplate = new RestTemplate();
    
    // HTTP Header 설정
    HttpHeaders header = new HttpHeaders();
    header.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    header.setContentType(MediaType.APPLICATION_JSON);

    HttpEntity<?> entity = new HttpEntity<>(header);
	
    // Server to Server 로 인해 로컬 환경의 api 서버에 요청 - 서버 URL
    String api_url = "http://localhost:8080/api/test";
	
   	// 요청 URL 객체 생성
    UriComponentsBuilder uri = UriComponentsBuilder.fromHttpUrl(api_url);
	
    // RestTemplate exchange 메서드를 통해 Rest API 요청
    ResponseEntity<Map> response = restTemplate.exchange(uri.build().toUriString(), HttpMethod.GET, entity, Map.class);

    System.out.println("return : "+response.getBody().toString());

    return "contents/auth/loginForm";
}

 

// Server to Server 로 인해 로컬 환경의 api 서버에 요청 - 서버 URL
String api_url = "http://localhost:8080/api/test";
// 요청 URL 객체 생성
UriComponentsBuilder uri = UriComponentsBuilder.fromHttpUrl(api_url);

인터넷상에 존재하는 모든 자원들은 URI 를 통해 구분되고 접근할 수 있다.

따라서, 웹 어플리케이션을 개발할 때 어떤 데이터에 접근하고 리턴하기 위해선 내부적으로 URI 를

이용해 응답해준다.

 

URI 의 구조는 아래와 같으며 개발자가 URI 를 직접 문자열로 작성하는것은 상당히 불편하다.

요청할 곳의 URI 가 간단하다면 상관 없지만 복잡 해질수록 작성하는게 불편할 수 있다.

이러한 URI 를 보다 쉽게 다룰 수 있도록 도와주는게 UriComponentsBuilder 이다.

scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]

 

ResponseEntity<Map> response = restTemplate.exchange(uri.build().toUriString(), HttpMethod.GET, entity, Map.class);

헤더 설정 및 Http Method 중 골라서 API 요청을 할 수 있는 exchange 메서드를 사용한다.

exchange

(

    url : API 요청 URL,

    method : HTTP Method(GET, POST, PUT, DELETE),

    requestEntity : 요청 객체(Header 객체, 전달할 데이터 등),

    responseType : 응답 객체 타입,

    uriVariables : 응답 받을 객체 형태

)

 

 

httpEntityCallBack() 메서드를 통해 요청 헤더, 데이터 등 설정한 HttpEntity 와 응답 Type을 설정한다.

RestTemplate 클래스 밑에 존재하는 HttpEntityRequestCallback 클래스이다.

전달받은 요청 객체인 HttpEntity 설정 및 super(responseType) 을 통해 응답 객체의 Type을 설정한다.

 

responseEntityExtractor() 메서드를 통해 응답 객체에 대한 알맞는 MessageConverter 를

설정한다. responseType 은 응답 객체 클래스를 설정하는데 본인은 Map.class 를 설정했다.

 

excute(), doExcecute() 메서드를 통해 요청 객체에 대한 messageConverter 설정 및 API 요청을 한다.

 

createRequest() 메서드를 통해 ClientHttpRequestFactory 에서 ClientHttpRequest 를 가져온다.

 

doWithRequest() 메서드를 통해 요청 객체인 HttpEntity 를 알맞는 객체로 변환하기 위해

MessageConverter 찾아 변환한다.

 

Rest API 요청을 받는 서버 - 응답 서버
package com.example.demo.controller;

import java.util.HashMap;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody
public class RestController {
	
	@RequestMapping(value="/api/test")
	public HashMap<String, Object> apiTest(){
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("test", 123);
		System.out.println("들어왔어요");
		return map;
	}
}

 

결과

 

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.