본문 바로가기
개발공부/JAVA Spring

[SpringBoot 통신] RestTemplate, WebClient

by bzerome240 2023. 5. 9.

 

서버로 웹 요청을 보내고 응답을 받을 수 있게 도와주는 RestTemplate 과 WebClient 

 

RestTemplate

스프링에서 HTTP 통신 기능을 손쉽게 사용하도록 설계된 템플릿

RESTful 원칙을 따르는 서비스를 편리하게 만들 수 있다.

동기 방식으로 처리되며, AsyncRestTemplate를 사용하면 비동기 방식으로 사용할 수 있다.

현업에서 많이 쓰이지만 지원이 중단된 상태여서 최신 버전에서는 WebClient 사용을 권고한다.

 


 

WebClient

Reactor 기반으로 동작하는 API

스레드와 동시성 문제를 벗어나 비동기 형식으로 사용할 수 있다.

 

특징

Non-Blocking I/O 를 지원한다

Reactive Streams의 Back Pressure를 지원한다

적은 하드웨어 리소스로 동시성을 지원한다.

함수형 API를 지원한다

동기, 비동기 상호작용을 지원한다

스트리밍을 지원한다

 

생성 방법

방법1) builder() 를 이용한 생성

public String getName() {
	WebClient webClient = WebCLient.builder()
    	.baseUrl("http://localhost:9090")
        .defaultHeader(HttpHeader.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
        .build();
        
	return webClient.get()
    	.uri("/api/v1/crud-api")
        .retrieve()
        .bodyToMono(String.class) // 리턴타입 설정
        .block(); // blocking 형식으로 동작
}

 

방법2) create() 를 이용한 생성

 

path varible 요청

public String getName() {
	WebClient webClient = WebCLient.create("http://localhost:9090");
    
	ResponseEntity<String> responseEntity = webClient.get()
    	.uri(uriBuilder -> uriBuilder.path("/api/v1/crud-api/{name}").build("Flature"))
        .retrieve().toEntity(String.class).block();
        
    return responseEntity.getBody();
}

 

쿼리 파라미터 요청

public String getName() {
	WebClient webClient = WebCLient.create("http://localhost:9090");
    
	return webClient.get()
    	.uri(uriBuilder -> uriBuilder.path("/api/v1/crud-api").queryParam("name", "Flature").build("Flature"))
        .exchangeToMono(clientResponse -> {
        	if(clientResponse.statusCode().equals(HttpStatus.OK)) {
            	return clientResponse.bodyToMono(String.class);
            } else {
                return clientResponse.createException().flatMap(Mono::error);
            }
        })
        .block();
        
    return responseEntity.getBody();
}

 

 

 

728x90
반응형

댓글