[java] HttpClient를 사용하여 웹 사이트에 요청을 보내고 응답을 캐싱하는 방법은?

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는 다양한 설정을 제공하여 캐시를 구성할 수 있으므로, 프로젝트의 요구사항에 맞게 적절한 설정을 선택하면 됩니다.


참고 문서: