본문 바로가기
SpringBoot

[Spring Boot] 15. USE other REST API (2) - RestTemplate

by 청양호박이 2019. 12. 7.

지난 시간에는 REST API를 제공하는 공공데이터포털에 대해서 알아보고 실질적으로 해당 API를 호출해서 확인했습니다.

2019/12/04 - [SpringBoot] - [Spring Boot] 14. USE other REST API (1)

 

[Spring Boot] 14. USE other REST API (1)

지금까지는 Spring Boot로 REST API 서버를 구성하는 내용을 알아봤습니다. 이를 통해서, 자신의 DB를 통해서 서비스를 구현할 수 있으며, 다른 시스템에 정보를 제공할 수 있습니다. 그렇다면, 이번에는 다른시스..

ayoteralab.tistory.com

그럼 이번에는 Spring Boot에서 사용하는 방법을 알아보겠습니다. Spring Framework에서는 REST API를 호출 할 수 있도록 동기식, 비동기식 REST Client를 제공합니다. 

 

[RestTemplate]

    - Spring 3부터 지원되는 동기식 REST Client로 REST API 호출 이후 응답을 받을때까지 기다림

[AsyncRestTemplate]

    - Spring 4에 추가된 비동기식 REST Client, 하지만 Spring 5부터는 없어짐

 

따라서, 동기식인 RestTemplate에 대해서 알아보겠습니다. 끝에가 Template이 붙었다는건... Spring에서 제공하는 다른 Template클래스와 동일한 방식으로 설계되었다고 생각하면됩니다. 따라서 내부적으로는 상당히 복잡하지만 사용자가 쓰기에는 매우 쉽겠다고 예상이 가능합니다.

 

RestTemplate 클래스는 HTTP메서드 (기존에 알아본 여러가지 메서드가 있죠?? POST GET 등) 에 맞는 여러가지 메서드를 제공합니다. 

getForEntity( ) GET

해당 URL로 HTTP GET 메서드를 호출하고 결과는 ResponseEntity로 반환

(따라서, 실제 데이터 뿐만 아니라 응답코드도 받음)

postForEntity( ) POST 해당 URL로 HTTP POST 메서드를 호출하고 결과는 ResponseEntity로 반환
delete( ) DELETE 해당 URL로 HTTP DELETE 메서드를 호출

 

그 중에서도 getForEntity( )와 postForEntity( )를 사용하는 방법을 실제 코딩으로 확인해보겠습니다. 실제로 이 둘의 차이는 request를 구성해서 추가 요청정보를 넣느냐 마느냐의 차이입니다. 실제로 get과 post의 차이와 동일합니다.

 

 

1. getForEntity( ) 사용


RestTemplate.getForEntity(URI url, Class<T> responseType)

 

사용을 위한 단계는 아래와 같습니다. 그냥 해당 메서드를 사용하기 위한 인자를 채워주면 끝인거죠 사실...

 

[Service.java]

	public StationMiseDTO restCallById(String stationName) {
		RestTemplate restTemplate = new RestTemplate();	
		URI url = URI.create(restUrl);
		ResponseEntity<String> responseEntity = null;
		responseEntity = restTemplate.getForEntity(url, String.class);
				
		String res = responseEntity.getBody();
		System.out.println(res);
		
		return null;
	}

Parameter는 2개입니다. 또한, 앞에 설명한대로 결과는 ResponseEntity로 리턴합니다. REST API로 받아온 아이들은 String이고 따라서, 저번블로그에 작성했던 URL을 그대로 사용하고 responseType은 String.class로 설정해서 받아와 보겠습니다. 

 

아참, 우선 getForEntity( )로 사용한 이유는... 공공데이터포탈에서 제공한 API정의서에 따르면 REST(GET)으로 제공한다고 써있어서 해보았습니다.

 

[Controller.java]

	@ApiOperation(httpMethod = "GET"
			,value = "Station Mise 항목 REST call"
			,notes = "REST call Station Mise"
			,response = UserDTO.class
			,responseContainer = "null")
	@RequestMapping(value = "/stationMiseRest/{stationName}", method = RequestMethod.GET)
	public ResponseEntity<?> restCallById(
			@ApiParam(value = "stationName", required = true) @PathVariable("stationName") String stationName){
		L.info("REST call Station Mise");		
		return ResponseEntity.ok(userService.restCallById(stationName));
	}	

우선 내부적으로 로직을 만들기 위해 Controller를 하나 추가했습니다. 이렇게 되면, Web browser에서 해당 경로로 요청하면 Service의 해당 메소드에서 REST API를 호출하고 Console에 그 결과가 출력됩니다.

 

[Console]

정상적으로 JSON type의 결과를 받아왔습니다.

 

 

2. postForEntity( )의 구성 시 차이


그럼 궁금하니... 이번에는 postForEntity( ) 으로도 동일한 REST API에 시도를 해볼까요?? 어떤 Parameter의 차이가 있는지 알아볼겸!!!

 

RestTemplate.postForEntity(URI url, Object Request, Class<T> responseType)

 

이번에는 Parameter가 추가되었습니다. 이름에서도 볼 수 있듯이 Post기 때문에 Request로 내부에 추가 정보를 넣어서 요청이 가능합니다.

 

[Service.java]

	public StationMiseDTO restCallById(String stationName) {
		RestTemplate restTemplate = new RestTemplate();
		
		HttpHeaders httpHeaders = new HttpHeaders();
		httpHeaders.setContentType(MediaType.APPLICATION_JSON);
		URI url = URI.create(restUrl);
		
		HttpEntity<String> request = new HttpEntity<>(httpHeaders);
		
		ResponseEntity<String> responseEntity = null;
		responseEntity = restTemplate.postForEntity(url, request, String.class);
		
		String res = responseEntity.getBody();
		
		System.out.println(res);
		
		return null;
	}

우선 request에는 httpHeader만 추가해서 보내겠습니다. get하고 크게 다른점이 없어서 바로 사용이 가능합니다. 그럼 console에는 어떻게 나올까요??

음... Get이건 Post건 상관없나봅니다~ 이렇게 REST API로 데이터를 Spring Boot를 통해서 받아왔습니다. 다음에는 받아온 데이터를 원하는 대로 이리저리 사용할 수 있도록 Entity에 저장하는 방법을 알아보겠습니다. 

 

-Ayotera Lab-

댓글