
: 스프링 부트를 활용한 애플리케이션 개발 실무
📝 목차
12장. 서버 간 통신
12-1. RestTemplate이란?
- RestTemplate의 동작 원리
- RestTemplate의 대표적인 메서드
12-2. RestTemplate 사용하기
- 서버 프로젝트 생성하기
- RestTemplate 구현하기
- RestTemplate 커스텀 설정
12-3. WebClient란?
- WebClient 구성
12-4. WebClient 사용하기
- WebClient 구현
12-5. 정리
다른 서버로 웹 요청을 보내고 응답을 받을 수 있게 도와주는 RestTemplate과 WebClient에 대해서 공부해보자
: 스프링에서 HTTP 통신 기능을 손쉽게 사용하도록 설계된 템플릿이다.
서버와의 통신을 단순화한 RestTemplate을 이용하면 RESTful 원칙을 따르는 서비스를 편리하게 만들 수 있다.
RestTemplate은 기본적으로 동기 방식으로 처리 된다.
비동기 방식으로 사용하고 싶을 경우 ➡️ AsyncRestTemplate을 사용하면 된다.
RestTemplate은 현업에서 많이 쓰이나 지원이 중단(deprecated)된 상태
RestTemplate의 특징

애플리케이션에서 RestTemplate를 선언 ➡️ URI, HTTP 메서드, Body등을 설정
외부로 API 요청 ➡️ RestTemplate에서 HttpMessageConverter를 통해 RequestEntity 요청 메세지로 변환
변환된 메세지를 ClientHttpRequestFactory를 통해 ClientHttpRequest로 가져온 후 ➡️ 외부 API로 요청
외부에서 요청에 대한 응답을 받으면 RestTemplate은 ResponseErrorHandler로 오류 확인하고 오류가 있다면 ClientHttpResponse 에서 응답 데이터를 처리
받은 응답 데이터가 정상이라면 다시 한번 HttpMessageConverter를 거쳐 자바 객체로 변환해서 애플리케이션으로 반환
| 메서드 | HTTP 형태 | 설명 |
|---|---|---|
| getForObject | GET | GET 형식으로 요청한 결과를 객체로 반환 |
| getForEntity | GET | GET 형식으로 요청한 결과를 ResponseEntity 형식으로 반환 |
| postForLocation | POST | POST 형식으로 요청한 결과를 헤더에 저장된 URI로 반환 |
| postForObject | POST | POST 형식으로 요청한 결과를 객체로 반환 |
| postForEntity | POST | POST 형식으로 요청한 결과를 ResponseEntity 형식으로 반환 |
| delete | DELETE | DELETE 형식으로 요청 |
| put | PUT | PUT 형식으로 요청 |
| patchForObject | PATCH | PATCH 형식으로 요청한 결과를 객체로 반환 |
| optionsForAllow | OPTIONS | 해당 URI에서 지원하는 HTTP 메서드를 조회 |
| exchange | any | HTTP 헤더를 임의로 추가할 수 있고, 어떤 메서드 형식에서도 사용할 수 있음 |
| execute | any | 요청과 응답에 대한 콜백을 수정 |
RestTemplate을 생성하고 사용하는 방법은 아주 다양하다.
그 중 가장 보편적인 방법은 UriComponentsBuilder를 사용하는 방법
✅ UriComponentsBuilder는 스프링 프레임워크에서 제공하는 클래스로서 여러 파라미터를 연결해서 URI 형식으로 만드는 기능을 수행한다.
RestTemplate는 기본적으로 커넥션 풀을 지원하지 않음
이 기능을 지원하지 않으면 매번 호출시 포트를 열어 커넥션을 생성하게 되는데, TIME_WAIT 상태가 된 소켓을 다시 사용하려고 접근 ➡️ 재사용 불가
이를 방지하지 위해 커넥션 풀 기능을 활성화 ➡️ 재사용할 수 있게 하는 것이 좋다.
이 기능 활성화하는 대표적인 방법이 아파치에서 제공하는 HTTPClient로 대체해서 사용하는 방식이다. HTTpClient 사용시 의존성을 추가해야 한다.
: Spring WebFlux는 HTTP 요청을 수행하는 클라이언트로 WebClient를 제공한다.
WebClient는 리액터 기반으로 동작하는 API여서 스레드아 동시성 문제를 벗어나 비동기형식으로 사용할 수 있다.
WebClient 특징
WebClient를 사용하려면 WebFlux 모듈에 대한 의존성을 추가해야 한다.
⬇️ Gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-webflux'
}
⬇️ Maven
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
</dependencies>
WebFlux는 클라이언트와 서버 간 리액티브 애플리케이션 개발을 지원하기 위해 스프링 프레임워크 5에서 새롭게 추가된 모듈이다.
WebClient를 생성하는 방법은 다음과 같이 크게 두 가지가 있다.
1. create() 메서드를 이용한 생성
2. builder()를 이용한 생성
WebClient는 객체를 우선 생성한 후 요청을 전달하는 방식으로 동작
builder() 를 통해 baseUrl() 메서드에서 기본 URL을 설정하고
defaultHeader() 메서드로 헤더의 값을 설정
일반적으로는 WebClient 객체를 생성한 후 재사용하는 방식으로 구현하는 것이 좋다.
⬇️ builder()를 사용할 경우 확장할 수 있는 메서드
✅ defaultHeader() : WebClient의 기본 헤더 설정
✅ defaultCookie() : WebClient의 기본 쿠키 설정
✅ defaultUriVariable() : WebClient의 기본 URI 확장값 설정
✅ filter() : WebClient에서 발생하는 요청에 대한 필터 설정
빌드 된 WebClient는 변경할 수 없다.
하지만 복사해서 사용은 가능 ➡️ webClient.mutate() 로 복제해 사용할 수 있다.
자세한 WebClient의 사용법은 공식 문서에서 확인할 수 있다.
https://docs.spring.io/spring-framework/reference/web/webflux-webclient.html