써드파티 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
'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 |