학교 프로젝트를 하기 위해 카카오 T 퀵 API를 연동해야 하는 일이 생겼는데 이것을 Spring에서 외부 API로서 연동하는 과정을 적어보고자 한다.
팀끼리 맞추기로 한 환경은 eGovFramework 3.10이기 때문에 베이스가 될 프로젝트는 해당 링크에서 기본적으로 맞춰놓은 MVC 패턴 샘플을 따라한 뒤 버전 3.10에 맞게 수정해주었다.

카카오 T 퀵 배송 API에서 설명하는 API를 분석하기 전에 API키를 발급해야 하는데…

큰일났다 벌써부터 어떻게 해야할지 모르겠다.
일단 수정이 가능하기에 예전에 배포했던 사이트를 가져와서 넣은 뒤 API 키를 발급 받았다.
RestTemplate라는 Spring의 내장 메소드를 사용하는 방법이 있다고 한다.
RestTemplate
HTTP 통신을 위한 도구로 RESTful API 웹 서비스와의 상호작용을 쉽게한다.
외부 도메인에서 데이터를 가져오거나 전송할 때 사용되는 스프링 프레임워크의 내장클래스이다.
HTTP 메서드(GET, POST, PUT, DELETE 등)를 통해 JSON, XML 등의 데이터를 동기식으로 받는다
단, 이 방법은 Multi-thread, Blocking 방식을 통해 진행되기 때문에 WebClient를 통해 Single-thread, Non-Blocking 방식을 성능을 높일 수 있다.
WebClient
Spring 5에서 추가된 인터페이스이며 Single-thread, Non-Blocking 방식을 사용한다.
RestTemplate와 동일하게 HTTP 메서드(GET, POST, PUT, DELETE 등)를 통해 정보 교환이 가능하다.
RestTemplate는 여러가지 메서드를 통해 간단하게 외부 API를 호출하고 정보 교환이 가능하다.
우선 GET 명령어로 외부 API에게 Object를 반환받아보겠다.
private RestTemplate restTemplate;
public String getUsers() {
String url = "https://open-api-logistics.kakaomobility.com/goa-sandbox-service";
return restTemplate.getForObject(url, String.class);
}
기본적인 bean 설정이나 uri 설정을 모두 빼고 간결하게 적어보면 이렇게 간단하다.
POST로 ResponseEntity를 받는다면 이렇게 할 수 있다.
private RestTemplate restTemplate;
public ResponseEntity<String> createUser(Item item) {
String url = " https://open-api-logistics.kakaomobility.com/goa-sandbox-service";
return restTemplate.postForEntity(url, item, String.class);
}
HTTP 메서드(GET, POST, PUT, DELETE 등) 별 다양한 메서드를 제공한다.
| Method | HTTP Method | Return Type | 설명 |
|---|---|---|---|
| getForObject() | GET | Object | GET 요청에 대한 결과를 객체로 반환 |
| getForEntity() | GET | ResponseEntity | GET 요청에 대한 결과를 ResponseEntity로 반환 |
| postForLocation() | POST | URI | POST 요청에 대한 결과로 헤더에 저장된 URI 반환 |
| postForObject() | POST | Object | POST 요청에 대한 결과를 객체로 반환 |
| postForEntity() | POST | ResponseEntity | POST 요청에 대한 결과를 ResponseEntity로 반환 |
| put() | PUT | void | PUT 요청을 실행 |
| patchForObject() | PATCH | Object | PATCH 요청을 실행하고 결과를 객체로 반환 |
| delete() | DELETE | void | DELETE 요청을 실행 |
| headForHeaders() | HEADER | HttpHeaders | 헤더 정보를 추출하고 HTTP HEAD 메서드를 사용 |
| optionsForAllow() | OPTIONS | Set | 지원되는 HTTP 메서드를 추출 |
| exchange() | any | ResponseEntity | 헤더를 생성하고 모든 요청 방법을 허용 |
| execute() | any | T | 요청/응답 콜백을 수정 |
Spring 5.0부터 추가된 RestTemplate를 대체하는 HTTP 클라이언트이다.
Single-Thread 방식을 사용하며, Non-Blocking 방식을 사용한다.
// maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
// gradle
dependencies {
compile 'org.springframework.boot:spring-boot-starter-webflux'
}
create()는 단순하게 생성하거나 uri와 함께 생성 가능하다.
WebClient.create();
// or
WebClient.create("http://localhost:8080");
builder()는 설정을 커스텀해서 빌드할 수 있는 메소드다.
WebClient client = WebClient.builder()
.baseUrl("http://localhost:8080")
.defaultCookie("cookieKey", "cookieValue")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.defaultUriVariables(Collections.singletonMap("url", "http://localhost:8080"))
.build();
다음과 같은 옵션을 통해 빌드할 수 있다.
retrieve()를 통해 ResponseBody 형식으로 데이터를 받을 수 있다.
Mono<ResponseEntity<Person>> entityMono = client.get()
.uri("/persons/1")
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.toEntity(Person.class);
.toEntity는 status, headers, body를 포함하지만 .toEntity 대신 .bodyToMono를 쓰면 body만 받을 수 있다.
처음에 조사했을 때는 RestTemplate를 쓰는 중에 WebClient를 섞어서 써야하는 줄 알았지만 아니었다.
데이터를 받는 부분을 보자
// restTemplate
private RestTemplate restTemplate;
public ResponseEntity<String> createUser(Item item) {
String url = "https://open-api-logistics.kakaomobility.com/goa-sandbox-service";
return restTemplate.postForEntity(url, item, String.class);
}
// WebClient
WebClient webClient;
public Mono<Employee> create(Employee empl) {
return webClient.post()
.uri("/employees")
.body(Mono.just(empl), Employee.class)
.retrieve()
.bodyToMono(Employee.class);
}
애초에 받는 자료형부터 각 이름으로 정해져있다.
만약 외부 API를 받기 위해 이미 RestTemplate를 쓰고 있다면 그대로 쓰면 되지만 새로 시작하는 거라면 WebClient를 쓰는 것이 좋다.
내 경우엔 새로 프로젝트를 파서 외부 API를 받아오는 것이기에 WebClient를 사용해보도록 하겠다.
외부 API를 받아오는 방법 중 RestTemplate와 WebClient에 대해 알아보았다.
다음에는 카카오톡 퀵 API에 대해 분석하는 시간을 가지도록 하겠다.
https://velog.io/@penrose_15/Spring에서-외부-API를-호출하는-방법들
https://adjh54.tistory.com/234
https://m.blog.naver.com/seek316/223337685249
https://velog.io/@sujung_shin/RestTemplate을-이용한-Spring에서의-간편한-HTTP-통신