ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AsyncRestTemplate (비동기 RestTemplate)
    카테고리 없음 2023. 4. 20. 09:53
    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에 대해서 살짝 알아 봤다.

    댓글

Designed by Tistory.