Spring 4에 추가된 AsyncRestTemplate을 간단하게 사용해보자.
클래스이름 그대로 비동기 RestTemplate이다. 우리가 흔히 쓰던 RestTemplate에서 비동기 역할만 하는 것으로 추정된다.
RestTemplate과 비슷하게 AsyncRestOperations 인터페이스가 있고 그 구현체에 AsyncRestTemplate이 구현하고 있다.
RestTemplate 역시 RestOperations인터페이스를 구현하고 있다.
사용법 역시 RestTemplate와 비슷하다.
getForEntity, headForHeaders, postForLocation, postForEntity, put, delete 등 RestTemplate에 있는 것들 또한 여기에 있다.
그럼 아주 간단하게 사용해보자.
@Test
public void asyncRestTemplateTest() throws InterruptedException, ExecutionException {
ListenableFuture<ResponseEntity<Map>> entity = asyncRestTemplate.getForEntity("https://httpbin.org/get", Map.class);
entity.addCallback(result -> {
System.out.println(result.getStatusCode());
System.out.println(result.getBody());
}, ex -> System.out.println(ex.getStackTrace()));
System.out.println("asyncRestTemplateTest");
TimeUnit.SECONDS.sleep(8);
}
RestTemplate과 비슷하지만 다른 점이 있다면 callback 함수가 있다는 것이다.
람다를 사용했지만 실제 메서드 시그네쳐는 다음과 같다.
//SuccessCallback
void onSuccess(T result);
//FailureCallback
void onFailure(Throwable ex)
java8 이전이거나 람다를 쓰지 못한다면 아래와 같이 하자.
entity.addCallback(new SuccessCallback<ResponseEntity<Map>>() {
@Override
public void onSuccess(ResponseEntity<Map> result) {
System.out.println(result.getStatusCode());
System.out.println(result.getBody());
}
}, new FailureCallback() {
@Override
public void onFailure(Throwable ex) {
}
});
출력 결과를 보면 asyncRestTemplateTest라는 Text가 먼저 찍히고 콜백 함수가 실행되고 결과 값을 출력한다.
Spring에서 제공하는 비동기 RestTemplate 때문에 쉽게 구현 할 수 있다.
또한 결과 값을 받을 수 있는 Future 도 제공해 주고 있다.
ListenableFuture<ResponseEntity<Map>> entity = asyncRestTemplate.getForEntity("https://httpbin.org/get", Map.class);
ResponseEntity<Map> responseEntity = entity.get();
System.out.println(responseEntity.getStatusCode());
System.out.println(responseEntity.getStatusCode());
스프링은 없는게 없는 듯하다.
AsyncClientHttpRequestFactory 를 지정해서 사용할 수도 있다. 물론 RestTemplate에도 존재한다.
구현체들은 여러개 존재 한다. httpclient, netty, okHttp 기타 등등 존재한다. 확장성 있게 아주 잘 만들었다.
@Bean
public AsyncRestTemplate asyncRestTemplate(){
AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate();
asyncRestTemplate.setAsyncRequestFactory(new Netty4ClientHttpRequestFactory());
return asyncRestTemplate;
}
물론 설정 할때는 해당 라이브러리를 디펜더시 받아야 한다.
아무 설정 하지 않았을 떄에는 SimpleClientHttpRequestFactory 가 사용된다.
...
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setTaskExecutor(taskExecutor);
this.syncTemplate = new RestTemplate(requestFactory);
...
위의 소스는 생성자의 일부분이다. 또한 RestTemplate을 사용하고 있다.
거의 대부분 RestTemplate과 비슷하므로 RestTemplate을 알면 쉽게 사용가능 할 것으로 예상된다.
이상으로 비동기 RestTemplate에 대해서 살짝 알아 봤다.