이 글에서는 Spring에서 제공하는 HTTP client 중에 하나인 RestClient에 대해서 알아볼 것이다.
RestClient란?
RestClient는 Spring Boot 3.2 부터 새롭게 추가된 HTTP client이다. RestClient가 추가되기 이전부터, Spring에서는 RestTemplate과 WebClient와 같은 HTTP client를 제공하고 있었다. 하지만 이들은 각각 문제점을 갖고 있었다.
RestTemplate의 문제점:
- 직관적이지 않은 사용법
- Template 클래스에 너무 많은 HTTP 기능이 노출
WebClient의 문제점:
- WebFlux에 대한 의존성 필요
RestTemplate이 갖고 있던 문제점 중 하나로 Template 클래스에 너무 많은 HTTP 기능이 노출되어 있다는 점이 있었고 이후 Spring 5.0 부터 reactive 기반의 WebClient가 추가되었다. 하지만 WebClient를 사용하기 위해서는 WebFlux가 꼭 필요하다는 문제가 있었는데, 이에 대한 대안으로 RestClient가 등장하게 된 것이다.
RestClient의 등장으로 servlet에서도 RestTemplate의 기술을 바탕으로, WebClient와 유사한 방식으로 유연한 API를 사용할 수 있게 되었다.
RestClient 사용법
RestClient 객체 생성
RestClient 인터페이스는 create()
라는 static 메서드를 갖고 있다. 이를 통해 RestClient 객체를 생성할 수 있다. create()
메서드에 파라미터로 url을 넣어 baseUrl을 미리 설정한 객체를 생성할 수도 있고 RestTemplate를 전달하여 기존에 설정된 RestTemplate을 바탕으로 생성도 가능하다.
RestClient restClient = RestClient.create();
RestClient restClientWithBaseUrl = RestClient.create("http://url.com");
RestClient restClientWithRestTemplate = RestClient.create(restTemplate);
요청 전달
RestClient를 통한 GET 요청은 다음과 같이 진행할 수 있다.
RestClient restClient = RestClient.create();
String response = restClient.get()
.url(url)
.retrieve()
.body(String.class);
Message converter를 통한 json 변환도 지원하기 때문에 원하는 클래스를 만들어 반환 타입을 지정할 수 있다.
@NoArgsConstructor
@AllArgsConstructor
public class Response {
...
}
Response response = restClient.get()
.url(url)
.retrieve()
.body(Response.class);
POST 요청은 다음과 같이 사용할 수 있다.
@NoArgsConstructor
@AllArgsConstructor
public class Request {
...
}
@NoArgsConstructor
@AllArgsConstructor
public class Response {
...
}
Response response = restClient.post()
.url(url)
.contentType(MediaType.APPLICATION_JSON)
.body(new Request(...))
.retreive()
.body(Response.class);
에러 핸들링
RestClient는 4xx나 5xx 오류를 수신할 경우 default로 RestClientException
을 상속받은 RestClientResponseException
을 던진다. 다음과 같이 onStatus(Predicate, RestClient.ResponseSpec.ErrorHandler)
를 사용하면 오류 응답을 재정의할 수 있다.
Response response = restClient.post()
.url(url)
.contentType(MediaType.APPLICATION_JSON)
.body(new Request(...))
.retreive()
.onStatus(HttpStatusCode::isError, (request, response) -> {
throw new CustomResponseErrorException(...);
})
.body(Response.class);
exchange
RestClient의 exchange를 사용하면 더 다양한 응답처리를 정의할 수 있다. exchage 메서드를 통해 request와 response 객체에 접근이 가능하므로, 오류 코드를 받을 경우 오류 응답 처리를, 정상 처리된 요청일 경우 원하는 형식의 응답으로 반환할 수 있도록 상세하게 정의가 가능하다.
Response response = restClient.post()
.url(url)
.contentType(MediaType.APPLICATION_JSON)
.exchange((request, response) -> {
if (response.getStatusCode().is4xxClientError()) {
throw new CustomResponseErrorException(...);
}
return new Response(...);
});
참고
'Spring' 카테고리의 다른 글
[Spring] Spring에서 실시간 알림 기능 구현하기 (0) | 2024.09.25 |
---|---|
[Spring] @Scheduled를 사용한 메서드 스케줄링 (0) | 2024.06.17 |
[Spring / AWS] Spring Boot 3 + AWS Lambda 사용하기 (0) | 2024.04.26 |
[Spring] Pagination 기본값 설정하기 (0) | 2024.04.03 |
[Spring] MultipartFile Bean Validation (0) | 2024.01.26 |