[java] HttpClient를 사용하여 웹 사이트에 병렬 요청을 보내는 방법은?
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class ParallelRequestsExample {

    public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
        
        // 병렬로 요청을 보낼 URL 목록
        List<String> urls = new ArrayList<>();
        urls.add("https://www.example.com");
        urls.add("https://www.google.com");
        urls.add("https://www.github.com");
        
        // HttpClient 생성
        CloseableHttpClient httpClient = HttpClients.createDefault();
        
        // 병렬 요청을 처리할 ExecutorService 생성
        ExecutorService executorService = Executors.newFixedThreadPool(urls.size());
        
        // CompletableFuture 리스트 생성
        List<CompletableFuture<HttpResponse>> futures = new ArrayList<>();
        
        for (String url : urls) {
            URI uri = URI.create(url);
            
            // 비동기로 요청 보내기
            CompletableFuture<HttpResponse> future = CompletableFuture.supplyAsync(() -> {
                HttpGet request = new HttpGet(uri);
                
                try {
                    return httpClient.execute(request);
                } catch (IOException e) {
                    e.printStackTrace();
                    return null;
                }
            }, executorService);
            
            futures.add(future);
        }
        
        // 모든 CompletableFuture가 완료되길 기다리기
        CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])).join();
        
        // 응답 결과 출력하기
        for (CompletableFuture<HttpResponse> future : futures) {
            HttpResponse response = future.get();
            System.out.println("Response from " + response.getFirstHeader("Host") + ": " + response.getStatusLine().getStatusCode());
            
            // 응답을 사용한 작업 수행...
        }
        
        // HttpClient와 ExecutorService 닫기
        httpClient.close();
        executorService.shutdown();
    }
}

위의 예제는 Apache HttpClient를 사용하여 병렬로 웹 사이트에 요청을 보내는 방법을 보여줍니다. 병렬 요청을 보내기 위해 CompletableFuture와 ExecutorService를 사용하며, 웹 사이트의 응답은 HttpResponse 형태로 받아옵니다.

위 코드를 실행하면 웹 사이트 목록(urls)에 있는 각 URL에 대한 병렬 요청이 보내집니다. 응답은 각각 CompletableFuture로 반환되며, 이를 통해 응답 결과를 다룰 수 있습니다. 각 응답에서는 응답의 호스트(Host)와 상태 코드(Status Code)가 출력됩니다.

이 예제를 사용하여 한 번에 여러 웹 사이트에 병렬로 요청을 보낼 수 있습니다. 이를 통해 동시에 많은 데이터를 처리하고 속도를 향상시킬 수 있습니다.

Apache HttpClient의 자세한 내용은 공식문서를 참고하시기 바랍니다.