CloseableHttpClient는 HttpClient 인터페이스의 기본 구현을 나타내는 추상 클래스입니다.
그러나 Closeable 인터페이스도 구현합니다. 따라서 사용 후에는 모든 인스턴스를 닫아야 합니다. try-with-resources를 사용하거나 finally 절에서 close 메서드를 호출하여 닫을 수 있습니다.
위의 예에서는 HttpClients 클래스의 정적 메서드를 사용하여 기본 클라이언트 구현을 얻었습니다. HttpClients는 CloseableHttpClient 인스턴스를 만들기 위한 팩터리 메서드를 포함하는 유틸리티 클래스입니다.
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpClientBuilder 클래스를 사용하여 동일한 결과를 얻을 수 있습니다. HttpClientBuilder 는 CloseableHttpClient 인스턴스를 만들기 위한 작성기 디자인 패턴의 구현입니다.
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
내부적으로 HttpClients는 HttpClientBuilder를 사용하여 클라이언트 구현 인스턴스를 만듭니다. 따라서 사용자 지정 코드에서 HttpClients를 사용하는 것이 좋습니다. 더 높은 수준의 클래스라는 점을 감안할 때 내부는 새 릴리스에 따라 변경될 수 있습니다.
CloseableHttpClient 인스턴스가 범위를 벗어나면 이를 닫아야 하는 이유는 연결된 연결 관리자를 종료하기 위해서입니다.
현재 Apache HttpClient 5 버전에서 클라이언트 리소스는 앞에서 본 HttpClientResponseHandler를 사용하여 http 통신 후 자동으로 할당 취소됩니다.
현재 버전 이전에는 HttpClient 4.x와의 이전 버전과의 호환성을 위해 CloseableHttpResponse가 제공되었습니다.
CloseableHttpResponse는 ClassicHttpResponse 인터페이스를 구현하는 클래스입니다. 그러나 ClassicHttpResponse는 HttpResponse, HttpEntityContainer 및 Closeable 인터페이스도 확장합니다.
기본 HTTP 연결은 응답 콘텐츠를 네트워크 소켓에서 직접 스트리밍할 수 있도록 응답 개체에 의해 유지됩니다. 따라서 사용자 지정 코드에서 HttpResponse 인터페이스 대신 CloseableHttpResponse 클래스를 사용해야 합니다. 또한 응답을 사용한 후 close 메서드를 호출해야 합니다.
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
HttpGet httpGet = new HttpGet(serviceUrl);
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
HttpEntity entity = response.getEntity();
EntityUtils.consume(entity);
}
}
응답 콘텐츠가 완전히 사용되지 않은 경우 기본 연결을 안전하게 다시 사용할 수 없다는 점에 유의해야 합니다. 이러한 상황에서는 연결 관리자에 의해 연결이 종료되고 삭제됩니다.
HttpClient와 CloseableHttpClient의 차이점을 배웠습니다. 또한 사용자 지정 코드에서 CloseableHttpClient를 사용하는 것이 좋습니다. 다음으로 HttpClients 또는 HttpClientBuilder를 사용하여 CloseableHttpClient 인스턴스를 만드는 방법을 살펴보았습니다.
마지막으로 Closeable 인터페이스를 구현하는 CloseableHttpClient 및 CloseableHttpResponse 클래스를 살펴보았습니다. 리소스를 확보하기 위해 인스턴스를 닫아야 한다는 것을 알았습니다.