PHpullh
학습 라이브러리/Java/CompletableFuture 고급 패턴

JAVA · 비동기/동시성

CompletableFuture 고급 패턴

CompletableFuture의 고급 조합 패턴. 여러 비동기 작업을 병렬 실행하고, 타임아웃을 설정하고, 예외를 체계적으로 처리하는 실전 패턴을 익힙니다.

비동기/동시성고급completable-futureasyncparallelpipelinetimeout

핵심 설명

CompletableFuture의 고급 조합 패턴. 여러 비동기 작업을 병렬 실행하고, 타임아웃을 설정하고, 예외를 체계적으로 처리하는 실전 패턴을 익힙니다.

Java code

import java.util.concurrent.*;
import java.util.List;

public class CFAdvanced {
    static final ExecutorService pool =
        Executors.newVirtualThreadPerTaskExecutor();

    // 1. 여러 작업 병렬 실행 후 결과 수집
    static CompletableFuture<List<String>> fetchAll(List<String> urls) {
        List<CompletableFuture<String>> futures = urls.stream()
            .map(url -> CompletableFuture
                .supplyAsync(() -> fetch(url), pool)
                .orTimeout(3, TimeUnit.SECONDS)
                .exceptionally(ex -> "FAILED: " + url))
            .toList();

        return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
            .thenApply(v -> futures.stream()
                .map(CompletableFuture::join)
                .toList());
    }

    // 2. 가장 빠른 결과 사용 (anyOf)
    static CompletableFuture<String> fetchFastest(String... urls) {
        CompletableFuture<String>[] futures = java.util.Arrays.stream(urls)
            .map(url -> CompletableFuture.supplyAsync(() -> fetch(url), pool))
            .toArray(CompletableFuture[]::new);
        return CompletableFuture.anyOf(futures)
            .thenApply(String.class::cast);
    }

    // 3. 파이프라인 패턴
    static CompletableFuture<String> pipeline(String input) {
        return CompletableFuture.supplyAsync(() -> validate(input), pool)
            .thenApplyAsync(CFAdvanced::transform, pool)
            .thenApplyAsync(CFAdvanced::enrich, pool)
            .whenComplete((result, ex) -> {
                if (ex != null) System.err.println("파이프라인 실패: " + ex);
                else System.out.println("완료: " + result);
            });
    }

    static String fetch(String url) { return "data:" + url; }
    static String validate(String s) { return s.trim(); }
    static String transform(String s) { return s.toUpperCase(); }
    static String enrich(String s) { return s + "+enriched"; }
}

학습 팁

orTimeout()completeOnTimeout()은 Java 9+에서 사용 가능. Virtual Thread executor와 함께 사용하면 블로킹 I/O도 효율적으로 처리됩니다.

주의할 점

allOf()CompletableFuture<Void>를 반환하므로 개별 결과를 얻으려면 원래 future들에서 join()해야 합니다. 또한 예외 처리 없이 join()하면 CompletionException이 전파됩니다.

자주 묻는 질문

CompletableFuture 고급 패턴란 무엇인가요?

CompletableFuture 의 고급 조합 패턴. 여러 비동기 작업을 병렬 실행하고, 타임아웃을 설정하고, 예외를 체계적으로 처리하는 실전 패턴을 익힙니다.

CompletableFuture 고급 패턴 학습 시 주의할 점은 무엇인가요?

allOf() 는 CompletableFuture&lt;Void&gt; 를 반환하므로 개별 결과를 얻으려면 원래 future들에서 join() 해야 합니다. 또한 예외 처리 없이 join() 하면 CompletionException 이 전파됩니다.