Java에서 HttpClient를 사용하여 웹 사이트에 요청을 보내고 응답을 받는 것은 매우 일반적인 작업입니다. 그러나 매 요청마다 웹 사이트에 접속해야 한다면 성능 이슈가 발생할 수 있습니다. 이를 해결하기 위해 응답을 캐싱하여 이전에 받은 응답을 재사용할 수 있습니다. HttpClient는 응답을 캐싱하기 위한 기능을 제공합니다.
HttpClient 의존성 추가
먼저, 의존성 관리 도구를 사용하여 HttpClient를 추가해야 합니다. 아래와 같이 Maven을 사용하는 경우 pom.xml
에 다음 의존성을 추가합니다:
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
</dependencies>
Gradle을 사용하는 경우 build.gradle
에 다음 의존성을 추가합니다:
dependencies {
implementation 'org.apache.httpcomponents:httpclient:4.5.13'
}
HttpClient로 요청 보내기
HttpClient를 사용하여 웹 사이트에 요청을 보내는 간단한 예제를 살펴보겠습니다. 아래 예제는 GET 요청을 보내고 응답을 받는 코드입니다:
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class HttpClientExample {
public static void main(String[] args) {
// HttpClient 인스턴스 생성
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// GET 요청 생성
HttpGet httpGet = new HttpGet("https://example.com");
// 요청 보내기
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
// 응답 받기
String responseBody = EntityUtils.toString(response.getEntity());
System.out.println(responseBody);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
위 예제에서는 HttpClients.createDefault()
를 사용하여 HttpClient 인스턴스를 생성한 후, HttpGet
객체를 사용하여 GET 요청을 생성합니다. httpClient.execute(httpGet)
를 호출하여 요청을 보내고 응답을 받습니다. 응답은 CloseableHttpResponse
객체로 반환되며, response.getEntity()
를 호출하여 응답 본문을 문자열로 가져옵니다.
응답 캐싱하기
HttpClient는 응답 캐싱을 지원하기 위해 HttpCache
를 제공합니다. HttpCachingHttpClientBuilder
를 사용하여 HttpClient를 구성하여 응답을 캐싱할 수 있습니다. 아래 예제는 GET 요청의 응답을 캐싱하는 코드입니다:
import org.apache.http.HttpHost;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.cache.CacheConfig;
import org.apache.http.client.cache.HttpCacheContext;
import org.apache.http.client.cache.HttpCacheStorage;
import org.apache.http.client.cache.MemoryHttpCacheStorage;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpCachingHttpClientBuilder;
import org.apache.http.util.EntityUtils;
public class HttpClientCachingExample {
public static void main(String[] args) {
// 캐시 구성
CacheConfig cacheConfig = CacheConfig.custom().setMaxCacheEntries(1000)
.setMaxObjectSize(8192).build();
HttpCacheStorage cacheStorage = new MemoryHttpCacheStorage(cacheConfig);
// HttpClient 인스턴스 생성
try (CloseableHttpClient httpClient = HttpCachingHttpClientBuilder.create()
.setHttpCacheStorage(cacheStorage).build()) {
// GET 요청 생성
HttpGet httpGet = new HttpGet("https://example.com");
// 요청 보내기
try (CloseableHttpResponse response = httpClient.execute(httpGet, HttpCacheContext.create())) {
// 응답 받기
String responseBody = EntityUtils.toString(response.getEntity());
System.out.println(responseBody);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
위 예제에서는 HttpCacheStorage
를 생성하여 메모리 기반의 캐시 저장소를 사용합니다. HttpCachingHttpClientBuilder
를 사용하여 HttpClient를 구성하고, setHttpCacheStorage()
메서드를 사용하여 캐시 저장소를 설정합니다. 이제 요청을 보낼 때 캐시가 사용됩니다. 캐시가 있으면 저장된 응답이 반환되고, 캐시가 없으면 웹 사이트로 요청이 전송되고 응답이 캐싱되어 다음에 재사용됩니다.
결론
HttpClient를 사용하여 웹 사이트에 요청을 보내고 응답을 캐싱하는 방법을 살펴보았습니다. 응답 캐싱은 동일한 요청에 대한 응답을 재사용하여 성능을 향상시킵니다. HttpClient는 다양한 설정을 제공하여 캐시를 구성할 수 있으므로, 프로젝트의 요구사항에 맞게 적절한 설정을 선택하면 됩니다.
참고 문서: