
Chap.12 서버 간 통신
12.1 RestTemplate이란?
RestTemplate은 Spring에서 HTTP 통신 기능을 손쉽게 사용하도록 설계된 템플릿입니다.
HTTP 서버와의 통신을 단순화한 이 템플릿을 이용하면 RESTful 원칙을 따르는 서비스를 편리하게 만들 수 있습니다.
RestTemplate는 기본적으로 동기 방식으로 처리되며, 비동기 방식으로 사용하고 싶은 경우 AsyncRestTemplate를 사용하면 됩니다.
하지만, RestTemplate의 경우 현재 Deprecated된 상태여서 앞으로 알아볼 WebClient를 사용하는 것이 좋을 것같습니다.
RestTemplate는 다음과 같은 특징을 가집니다.
- HTTP 프로토콜의 메서드에 맞는 여러 메서드를 제공합니다.
- RESTful 형식을 갖춘 템플릿입니다.
- HTTP 요청 후 JSON, XML, 문자열 등의 다양한 형식으로 응답을 받을 수 있습니다.
- Blocking I/O 기반의 동기 방식을 사용합니다.
- 다른 API를 호출 시 Header에 다양한 값을 추가할 수 있습니다.

RestTemplate는 위와 같은 동작 방식을 통해서 동작합니다.
여기서 애플리케이션은 현재 우리가 작성하는 스프링 코드의 구현부를 의미합니다.
구현부에서는 RestTemplate를 선언하고 사용할 API의 URI, HTTP 메서드, Body 등을 설정합니다.
다음으로 외부 API로 요청을 보내게 되면 RestTemplate에서 HttpMessageConverter를 통해서 RequestEntity를 요청 메시지로 변환합니다.
변환된 요청 메시지를 ClientHttpRequestFactory를 통해 ClientHttpRequest로 가져온 후 외부 API로 요청을 보냅니다.
반환된 응답을 ResponseErrorHandler로 오류를 확인하고 오류가 있다면 ClientHttpResponse에 응답 데이터를 처리합니다.
정상이라면 다시 한 번 HttpMessageConverter를 거쳐 자바 객체로 변환해서 애플리케이션으로 반환합니다.
12.2 RestTemplate 사용하기
GET Method

위의 방식은 단순하게 /api/v1/crud-api로 GET 요청을 보내는 예시인데, 만약 파라미터를 넣어서 요청을 보내고 싶으면,


이와 같이 2가지 방식으로 파라미터를 추가할 수 있습니다.
첫번째는 PathVariable 두번째는 QueryParameter입니다.
POST Method
POST Method는 GET 메서드와 유사하게 URI 부분을 작성하고 restTemplate.postForEntity를 사용할 때,
매개변수에 Body에 들어갈 Entity를 추가적으로 제공하면 됩니다
예시로는 restTemaplte.postForEntity(uri,memberDto, MemberDto.class)와 같이 사용하면 됩니다.
++++++++ RestTemplate 커스텀 설정
RestTemplate는 기본적으로 HTTPClient를 추상화하고 있습니다. HTTPClient의 종류에 따라 기능에 차리가 다소 있는데, 가장 큰 차이점은 Connection Pool입니다. RestTemplate는 기본적으로 Connection Pool를 지원하지 않습니다. 해당 기능이 없다면 매번 호출할때 마다 포트를 열어 커넥션을 생성하게 되는데 TIME_WAIT 상태가 된 소켓을 다시 사용하려고 접근한다면 재사용하지 못하게 됩니다. 이러한 경우 서버의 성능을 떨어뜨릴 수 있기 때문에, Apache사의 HTTPClient를 종속성에 추가하고 해당 HTTPClient를 수정하여 Connection Pool을 사용하면 재사용할 수 있습니다.
12.3 WebClient란?
일반적으로 실제 운영환경에 적용되는 애플리케이션은 정식 버전으로 출시된 스프링 부트의 버전보다 낮은 경우가 많습니다. 그렇기 때문에 RestTemplate을 많이 사용하고 있습니다. 하지만 최신 버전에서는 RestTemplate이 지원 중단되어 WebClient를 사용할 것을 권고하고 있습니다.
Spring WebFlux는 HTTP 요청을 수행하는 클라이언트로 WebClient를 제공합니다. WebClient는 Reactor기반으로 동작하는 API입니다. Reactor 기반이므로 스레드와 동시성 문제를 벗어나 비동기 형식으로 사용할 수 있습니다. WebClient의 특징은 다음과 같습니다.
- Non Blocking I/O를 지원합니다.
- 리액티브 스트림의 백 프레셔를 지원합니다.
- 적은 하드웨어 리소스로 동시성을 지원합니다.
- 함수형 API를 지원합니다.
- 동기, 비동기 상호작용을 지원합니다.
- 스트리밍을 지원합니다.
WebClient를 사용하기 위해서는 WebFlux 모듈에 대한 의존성을 추가해야합니다. 각자의 환경에 맞춰 pom.xml 또는 build.gradle에 추가하면 됩니다.
12.4 WebClient 사용하기
WebClient를 생성하는 방법에는 다음과 같이 크게 2개의 방법이 존재합니다.
create() 메서드를 통한 생성
builder()를 통한 생성


위의 코드에서 다음과 같은 메서드를 확인할 수 있습니다.
- defaultHeader : WebClient의 기본 헤더 설정
- defaultCookie : WebClient의 기본 쿠키 설정
- defaultUriVatriable() : WebClient의 기본 URI 확장값 설정
- filter() : WebClient에서 발생하는 요청에 대한 필터 설정
추가적으로 WebClient는 HTTP 메서드를 get(),post(),put(),delete() 등의 네이밍이 명확한 메서드로 설정할수 있습니다.
그리고 URI를 확장하는 방법으로 uri() 메서드를 사용할 수 있습니다.
retriebe() 메서드는 요청에 대한 응답을 받았을 때 그 값을 추출하는 방법 중 하나입니다. retrieve() 메서드는 bodyToMono() 메서드를 통해 리턴 타입을 설정해서 문자열 객체를 받아오게 돼 있습니다.
WebClient는 기본적으로 NonBlocking I/O 방식으로 동작하기 때문에, 메서드의 마지막에서 block()을 통해 블로킹 방식으로 바꿔줄 필요가 있습니다.
'책' 카테고리의 다른 글
[Book] 스프링 부트 핵심 가이드 Chap.13 서비스의 인증과 권한 부여 (0) | 2024.08.12 |
---|---|
[Book] 스프링 부트 핵심 가이드 Chap.11 (0) | 2024.08.05 |
[Book] 스프링 부트 핵심 가이드 Chap.10 - 유효성 검사와 예외 처리 (0) | 2024.07.28 |
[Book] 스프링 부트 핵심 가이드 Chap.9 (1) | 2024.07.21 |
[Book] 스프링 부트 핵심 가이드 Chap.8 (0) | 2024.07.14 |

Chap.12 서버 간 통신
12.1 RestTemplate이란?
RestTemplate은 Spring에서 HTTP 통신 기능을 손쉽게 사용하도록 설계된 템플릿입니다.
HTTP 서버와의 통신을 단순화한 이 템플릿을 이용하면 RESTful 원칙을 따르는 서비스를 편리하게 만들 수 있습니다.
RestTemplate는 기본적으로 동기 방식으로 처리되며, 비동기 방식으로 사용하고 싶은 경우 AsyncRestTemplate를 사용하면 됩니다.
하지만, RestTemplate의 경우 현재 Deprecated된 상태여서 앞으로 알아볼 WebClient를 사용하는 것이 좋을 것같습니다.
RestTemplate는 다음과 같은 특징을 가집니다.
- HTTP 프로토콜의 메서드에 맞는 여러 메서드를 제공합니다.
- RESTful 형식을 갖춘 템플릿입니다.
- HTTP 요청 후 JSON, XML, 문자열 등의 다양한 형식으로 응답을 받을 수 있습니다.
- Blocking I/O 기반의 동기 방식을 사용합니다.
- 다른 API를 호출 시 Header에 다양한 값을 추가할 수 있습니다.

RestTemplate는 위와 같은 동작 방식을 통해서 동작합니다.
여기서 애플리케이션은 현재 우리가 작성하는 스프링 코드의 구현부를 의미합니다.
구현부에서는 RestTemplate를 선언하고 사용할 API의 URI, HTTP 메서드, Body 등을 설정합니다.
다음으로 외부 API로 요청을 보내게 되면 RestTemplate에서 HttpMessageConverter를 통해서 RequestEntity를 요청 메시지로 변환합니다.
변환된 요청 메시지를 ClientHttpRequestFactory를 통해 ClientHttpRequest로 가져온 후 외부 API로 요청을 보냅니다.
반환된 응답을 ResponseErrorHandler로 오류를 확인하고 오류가 있다면 ClientHttpResponse에 응답 데이터를 처리합니다.
정상이라면 다시 한 번 HttpMessageConverter를 거쳐 자바 객체로 변환해서 애플리케이션으로 반환합니다.
12.2 RestTemplate 사용하기
GET Method

위의 방식은 단순하게 /api/v1/crud-api로 GET 요청을 보내는 예시인데, 만약 파라미터를 넣어서 요청을 보내고 싶으면,


이와 같이 2가지 방식으로 파라미터를 추가할 수 있습니다.
첫번째는 PathVariable 두번째는 QueryParameter입니다.
POST Method
POST Method는 GET 메서드와 유사하게 URI 부분을 작성하고 restTemplate.postForEntity를 사용할 때,
매개변수에 Body에 들어갈 Entity를 추가적으로 제공하면 됩니다
예시로는 restTemaplte.postForEntity(uri,memberDto, MemberDto.class)와 같이 사용하면 됩니다.
++++++++ RestTemplate 커스텀 설정
RestTemplate는 기본적으로 HTTPClient를 추상화하고 있습니다. HTTPClient의 종류에 따라 기능에 차리가 다소 있는데, 가장 큰 차이점은 Connection Pool입니다. RestTemplate는 기본적으로 Connection Pool를 지원하지 않습니다. 해당 기능이 없다면 매번 호출할때 마다 포트를 열어 커넥션을 생성하게 되는데 TIME_WAIT 상태가 된 소켓을 다시 사용하려고 접근한다면 재사용하지 못하게 됩니다. 이러한 경우 서버의 성능을 떨어뜨릴 수 있기 때문에, Apache사의 HTTPClient를 종속성에 추가하고 해당 HTTPClient를 수정하여 Connection Pool을 사용하면 재사용할 수 있습니다.
12.3 WebClient란?
일반적으로 실제 운영환경에 적용되는 애플리케이션은 정식 버전으로 출시된 스프링 부트의 버전보다 낮은 경우가 많습니다. 그렇기 때문에 RestTemplate을 많이 사용하고 있습니다. 하지만 최신 버전에서는 RestTemplate이 지원 중단되어 WebClient를 사용할 것을 권고하고 있습니다.
Spring WebFlux는 HTTP 요청을 수행하는 클라이언트로 WebClient를 제공합니다. WebClient는 Reactor기반으로 동작하는 API입니다. Reactor 기반이므로 스레드와 동시성 문제를 벗어나 비동기 형식으로 사용할 수 있습니다. WebClient의 특징은 다음과 같습니다.
- Non Blocking I/O를 지원합니다.
- 리액티브 스트림의 백 프레셔를 지원합니다.
- 적은 하드웨어 리소스로 동시성을 지원합니다.
- 함수형 API를 지원합니다.
- 동기, 비동기 상호작용을 지원합니다.
- 스트리밍을 지원합니다.
WebClient를 사용하기 위해서는 WebFlux 모듈에 대한 의존성을 추가해야합니다. 각자의 환경에 맞춰 pom.xml 또는 build.gradle에 추가하면 됩니다.
12.4 WebClient 사용하기
WebClient를 생성하는 방법에는 다음과 같이 크게 2개의 방법이 존재합니다.
create() 메서드를 통한 생성
builder()를 통한 생성


위의 코드에서 다음과 같은 메서드를 확인할 수 있습니다.
- defaultHeader : WebClient의 기본 헤더 설정
- defaultCookie : WebClient의 기본 쿠키 설정
- defaultUriVatriable() : WebClient의 기본 URI 확장값 설정
- filter() : WebClient에서 발생하는 요청에 대한 필터 설정
추가적으로 WebClient는 HTTP 메서드를 get(),post(),put(),delete() 등의 네이밍이 명확한 메서드로 설정할수 있습니다.
그리고 URI를 확장하는 방법으로 uri() 메서드를 사용할 수 있습니다.
retriebe() 메서드는 요청에 대한 응답을 받았을 때 그 값을 추출하는 방법 중 하나입니다. retrieve() 메서드는 bodyToMono() 메서드를 통해 리턴 타입을 설정해서 문자열 객체를 받아오게 돼 있습니다.
WebClient는 기본적으로 NonBlocking I/O 방식으로 동작하기 때문에, 메서드의 마지막에서 block()을 통해 블로킹 방식으로 바꿔줄 필요가 있습니다.
'책' 카테고리의 다른 글
[Book] 스프링 부트 핵심 가이드 Chap.13 서비스의 인증과 권한 부여 (0) | 2024.08.12 |
---|---|
[Book] 스프링 부트 핵심 가이드 Chap.11 (0) | 2024.08.05 |
[Book] 스프링 부트 핵심 가이드 Chap.10 - 유효성 검사와 예외 처리 (0) | 2024.07.28 |
[Book] 스프링 부트 핵심 가이드 Chap.9 (1) | 2024.07.21 |
[Book] 스프링 부트 핵심 가이드 Chap.8 (0) | 2024.07.14 |