써드파티 API를 연동하며 HTTP 통신을 위해 UrlConnection과 RestTemplate, WebClient 세 개의 라이브러리를 두고 고민을 했다. 다른 프로젝트에서는 HttpUrlConnection을 사용했는데, 다른 두 가지 방법과는 어떤 차이가 있는지 특징들을 비교해보고자 한다.
UrlConnection
java.net 패키지에 속하는 Java의 기본 HTTP 클라이언트로, URL의 내용을 읽어오거나 URL 주소에 대해 HTTP 통신 및 GET, POST로 데이터를 전달할 때 사용한다.
- 저수준 I/O, 즉, InputStream, OutputStream으로 로 HTTP 요청 및 응답을 처리한다.
- 응답코드가 4xx 이거나 5xx일 경우 IOException이 터진다.
- 타임아웃을 설정할 수 없다.
- 쿠키 제어가 불가능하다.
var url = new URL("https://google.com");
var conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.setRequestProperty("Authorization", "Bearer " + accessToken);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
int responseCode = conn.getResponseCode();
if (responseCode != 200) {
// exception 처리
}
var br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
var sb = new StringBuilder();
var line = "";
while ((line = br.readLine()) != null) {
sb.append(line);
}
RestTemplate
Spring 3.0부터 지원하는 HTTP 통신에 유용하게 쓸 수 있는 템플릿으로, HTTP 서버와의 통신을 단순화하고 RESTful 원칙을 지킨다.
- 기계적이고 반복적인 코드들을 깔끔하게 정리해준다.
- RESTful 형식에 맞춘다.
- 멀티쓰레드 방식을 사용한다.
- Blocking 방식을 사용한다.
- 동기적인 방식으로 동작하며, java.net 패키지의 HttpURLConnection을 내부적으로 사용한다.
- Spring 5.0부터는 RestTemplate은 사용을 권장하지 않으며, 이전 버전과의 호환성을 위해 유지되고 있다.
WebClient
Spring 5.0에서 도입된 인터페이스로, 이전에는 비동기 클라이언트로 AsyncRestTemplate을 사용했었으나, Spring 5.0 이후부터는 WebClient를 사용할 것을 권장한다.
- WebClient는 Non-Blocking I/O 모델을 사용하여 리액티브 프로그래밍을 지원한다.
- 함수형 스타일의 API를 제공하여 비동기적인 HTTP 요청을 처리한다.
- 요청 및 응답을 처리하는 메서드 체인을 통해 유연하고 효율적인 HTTP 통신을 구현한다.
var webClient = WebClient.builder()
.baseUrl(BASE_URL)
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build();
var response = webClient.get()
.uri(uriBuilder ->
uriBuilder
.path(PATH)
.queryParam("serviceKey", serviceKey)
.queryParam("code", code)
.build())
.retrieve()
.bodyToMono(ResponseDto.class)
.block();
정리
개발 생산성이 떨어지는 UrlConnection을 제외하고, RestTemplate과 WebClient를 비교했을 때 가장 큰 차이점은 아래와 같다.
RestTemplate | WebClient |
Multi-Thread | Single-Thread |
Blocking | Non-Blocking |
WebClient의 Non-Blocking 방식은 네트워킹의 병목 현상을 줄이고 성능을 향상 시킬 수 있으며, WebClient는 비동기, 동기 둘 다 지원 가능하기 때문에 훨씬 큰 장점이 될 것이다.
다음 포스팅에서는 Blocking과 Non-Blocking에 대해 공부하고 작성해봐야겠다.
References
RestTemplate (Spring Framework 6.1.2 API)
postForLocation Create a new resource by POSTing the given object to the URI template, and returns the value of the Location header. This header typically indicates where the new resource is stored. URI Template variables are expanded using the given URI v
docs.spring.io
'Coding' 카테고리의 다른 글
[Spring] @JsonInclude와 @JsonIgnore (0) | 2023.07.12 |
---|---|
[AWS S3] 여러 객체 삭제 (0) | 2023.07.10 |
[20230628] 오늘의 삽질 (0) | 2023.06.28 |
[JAVA] var 사용 시 주의할 점과 장단점 - 지역 변수 추론 타입 (0) | 2023.06.27 |
[JAVA] Objects.isNull vs. object == null (0) | 2023.06.12 |