Spring WebClient 및 RestTemplate 비교 및 특징


소개하다.
Spring 5는 새로운 리액션 웹 클라이언트 웹클라이언트를 출시했습니다.이 문서에서 Spring WebClient vs RestTemplate를 사용하는 방법과 방법을 보여 드리겠습니다.WebClient에서 제공하는 기능도 소개합니다.

RestTemplate란 무엇입니까?
RestTemplate는 클라이언트로부터 HTTP에 액세스할 수 있는 중앙 Spring 클래스입니다.RestTemplate는 POST, GET, PUT, DELETE, HEAD 및 OPTIONS HTTP 방법을 제공합니다.RestTemplate의 간단한 예는 Restful 웹 서비스를 사용하는 것입니다.
RestTemplate의 인스턴스를 제공하는 bean을 만들 수 있습니다.그리고 REST 서비스를 호출할 예정인 모든 클래스에서 이 bean을 호출할 수 있습니다.RestTemplate는 인터페이스@autowire를 구현하는 클래스입니다.
다음 코드는 bean의 성명을 보여 줍니다.
    @Bean
    public RestOperations restOperations()
    {
        return new RestTemplate();
    }

다음 코드는 임대 부동산 심사를 받기 위해 REST 클라이언트RestOperations가 Yelp의 REST API를 호출하는 것을 보여 준다.
   @Autowired
   private final RestOperations restOperations;

   public List getRentalPropertyReviews(String address)
   {
        String url = buildRestUrl(businessId);
        HttpHeaders httpHeaders = new HttpHeaders();
        String apiKey = getApiKey(YELP);
        httpHeaders.add("Authorization","Bearer " + apiKey);
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);

        HttpEntity entity = new HttpEntity("parameters", httpHeaders);
        ResponseEntity response;

        try
        {
            response = restOperations.exchange(url, HttpMethod.GET,entity, String.class);
        }
        catch(RestClientException e)
        {
            throw new RuntimeException("Unable to retrieve reviews", e);
        }

    }

위 코드에서, 우리는 Yelp의 REST API 키를 권한 수여의 일부분으로 추가해서 HTTP 헤더를 구축합니다.GET 메서드를 사용하여 감사 데이터를 가져옵니다.
기본적으로 우리는 반드시 이렇게 해야 한다
  • RestTemplate 객체 자동 연결
  • 라이센스 및 컨텐츠 유형을 사용하여 HTTP 헤드 구축
  • HttpEntity 패키지 요청 객체 사용
  • URL, Http 메서드 및 exchange 메서드의 반환 유형을 제공합니다.

  • 네트워크 고객은 무엇입니까?
    Spring 5는 웹클라이언트라는 리액션 웹 클라이언트를 출시했다.그것은 웹 요청을 실행하는 인터페이스입니다.Spring 웹 반응 모듈의 일부입니다.결국 WebClient가 RestTemplate를 대체합니다.
    가장 중요한 것은 웹클라이언트는 반응적이고 비막히며 비동기적이며 HTTP 프로토콜인 HTTP/1.1에서 일한다는 것이다.
    WebClient를 사용하려면 다음을 수행해야 합니다.
  • WebClient
  • 인스턴스 작성
  • REST 엔드포인트
  • 에 요청
  • 처리 응답
  • WebClient webClient = WebClient
           .builder()
           .baseUrl("https://localhost:8443")
           .defaultCookie("cookieKey", "cookieValue")
           .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) 
           .defaultUriVariables(Collections.singletonMap("url", "https://localhost:8443"))
           .build();
    
    
    위 코드는 WebClient 인스턴스화 방법을 보여 줍니다.YelpClient를 사용하여 실례를 만들 수 있습니다
    WebClient는 두 가지 방법WebClient webClient = WebClient.create();exchange을 제공합니다.exchange 방법은 보통 응답과 상태, 제목을 가져옵니다.retrieve 방법은 응답체를 직접 가져옵니다.그것은 더욱 사용하기 쉽다.
    또한 retrieve 또는 mono를 사용할 수 있습니다. 이것은 단일 응답 대상이나 대상 목록을 가져오려는 시도에 따라 달라집니다.
    this.webClient =
                    webClientBuilder.baseUrl("http://localhost:8080/v1/betterjavacode/").build();
    
    this.webClient.get()
                    .uri("users")
                    .accept(MediaType.APPLICATION_JSON)
                    .retrieve().bodyToFlux(UserDto.class).collectList();
    
    
    위 코드는 기본적으로 REST API에서 사용자 목록을 가져오는 데 사용됩니다flux.

    Spring WebClient vs RestTemplate
    우리는 이미 이 두 특성 사이의 관건적인 차이를 안다.WebClient는 비차단 클라이언트이고 RestTemplate는 차단 클라이언트입니다.
    RestTemplate는 JavaServlet API를 배후에서 사용합니다.서브렛 API는 동기화 호출 프로그램입니다.이것은 동기화되기 때문에 웹 클라이언트가 요청에 응답할 때까지 라인이 막힐 것입니다.
    따라서 결과를 기다리는 요청이 늘어날 것이다.이것은 메모리를 증가시킬 것이다.
    한편, WebClient는 비동기식 비차단 클라이언트입니다.그것은 엔진 덮개 아래에 Spring의 반응 프레임을 사용했다.WebClient는 Spring WebFlux 모듈의 일부입니다.
    Spring WebFlux 사용reactor library.데이터 시퀀스를 처리하기 위해 Mono 및 Flux API를 제공합니다.반응기는 반응 라이브러리다.그리고 모든 조작자들은 막힘이 없는 배압을 지원한다.

    Spring Boot 응용 프로그램에서 WebClient를 사용하는 방법의 예
    SpringWebMVC와 SpringWebFlux의 기능을 결합할 수 있습니다.이 절에서, 나는 예시 프로그램을 만들 것이다.이 프로그램은 WebFlux를 사용하여 REST API를 호출하고 사용자 목록을 포함하는 웹 페이지를 표시하는 응답을 구축할 것입니다.webClient 이 예에서는 사용자 목록을 가져오는 API입니다.
    
    package com.betterjavacode.webclientdemo.controllers;
    
    import com.betterjavacode.webclientdemo.dto.UserDto;
    import com.betterjavacode.webclientdemo.managers.UserManager;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    @RestController
    @RequestMapping("v1/betterjavacode")
    public class UserController
    {
        @Autowired
        public UserManager userManager;
    
        @GetMapping(value = "/users")
        public List getUsers()
        {
            return userManager.getAllUsers();
        }
    }
    
    
    RestController WebClient를 사용하여 REST API를 호출하는 클래스는 다음과 같습니다.
    package com.betterjavacode.webclientdemo.controllers;
    
    import com.betterjavacode.webclientdemo.clients.UserClient;
    import com.betterjavacode.webclientdemo.dto.UserDto;
    import com.betterjavacode.webclientdemo.managers.UserManager;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    
    import java.util.List;
    
    @Controller
    public class MainController
    {
        @Autowired
        UserClient userClient;
    
        @GetMapping(value = "/")
        public String home()
        {
            return "home";
        }
    
        @GetMapping(value = "/users")
        public String getUsers(Model model)
        {
            List users = userClient.getUsers().block();
    
            model.addAttribute("userslist", users);
            return "users";
        }
    }
    
    
    
    이제 UserClient의 중요한 코드는 WebClient를 사용하여 REST API를 호출하는 곳입니다.
    package com.betterjavacode.webclientdemo.clients;
    
    import com.betterjavacode.webclientdemo.dto.UserDto;
    import org.springframework.http.MediaType;
    import org.springframework.stereotype.Service;
    import org.springframework.web.reactive.function.client.WebClient;
    import reactor.core.publisher.Flux;
    import reactor.core.publisher.Mono;
    
    import java.util.List;
    
    @Service
    public class UserClient
    {
    
        private WebClient webClient;
    
        public UserClient(WebClient.Builder webClientBuilder)
        {
            this.webClient =
                    webClientBuilder.baseUrl("http://localhost:8080/v1/betterjavacode/").build();
        }
    
        public Mono<List> getUsers()
        {
            return this.webClient.get()
                    .uri("users")
                    .accept(MediaType.APPLICATION_JSON)
                    .retrieve().bodyToFlux(UserDto.class).collectList();
        }
    }
    
    
    위 코드는 먼저 WebClient를 구축한 다음 이를 사용하여 REST APIController에서 응답하는 것을 보여 줍니다.검색 방법은mono나flux 두 가지 옵션을 제공합니다.우리는 여러 사용자를 얻어야 하기 때문에 flux를 사용합니다.
    이것은 SpringWebMVC 프레임워크의 WebFlux의 일부분인 반응적이고 막히지 않는 WebClient를 사용할 수 있음을 나타낸다.

    Spring WebClient에는 또 무엇이 있습니까?
    Spring WebClient는 retrieve 프레임의 일부입니다.이 API의 주요 장점은 개발자가 병발성이나 스레드를 걱정할 필요가 없다는 것이다.WebClient가 이 일을 책임진다.
    WebClient에는 요청을 수행하기 위한 HTTP 클라이언트 라이브러리 지원이 내장되어 있습니다.여기에는 Apache Http Components, Jetty 반응식 Http Client 또는 Reactor Netty가 포함됩니다.Spring WebFlux는 다음과 같은 옵션을 제공합니다.WebClient.builder() – 기본 URL을 사용하도록 uriBuilderFactory 사용자 정의uriBuilderFactory - 각 요청의 제목defaultHeader - 요청당 CookiesdefaultCookie - 각 요청 사용자 정의defaultRequest – 요청당 클라이언트 필터filter - HTTP 메시지 리더기 사용자 정의
    나는 이미 위의 코드 시범에서 exchangeStrategies 방법을 보여 주었다.
    웹클라이언트는 또한 retrieve exchange ToFlux`를 포함하는 방법exchange을 제공했다.exchangeToMono and를 사용하면 요청에 속성을 추가할 수 있습니다.
    또는 WebClient를 사용하여 동기화할 수도 있습니다.위의 MainController 예에서 나는 attribute()를 사용하여 최종 결과를 얻었다.이것은 우리가 결과를 얻을 때까지 병행 호출을 기본적으로 막을 것이다.
    WebClient가 제공하는 주요 기능 중 하나는 block입니다.더욱 탄력적인 시스템의 경우 웹클라이언트를 사용할 때 추가할 수 있는 좋은 기능이다.retryWhen() 는 Retry 클래스를 매개변수로 사용합니다.
         webClient
            .get()
            .uri(String.join("", "/users", id))
            .retrieve()
            .bodyToMono(UserDto.class)
            .retryWhen(Retry.fixedDelay(5, Duration.ofMillis(100)))
            .block();
    


    retryWhen 오류를 처리할 수 있습니다.mono가 오류로 끝났을 때 터치합니다.

    WebClient also offers a feature for error handling. doOnError()는 오류에 기반한 예비(fallback)입니다.

    결론
    본고에서 나는 Spring Web Client가 무엇인지, Spring Web Client와 Rest Template를 어떻게 사용하는지, 그리고 그것이 어떤 다른 기능을 제공했는지 보여 주었다.

    좋은 웹페이지 즐겨찾기