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<Void> 를 반환하므로 개별 결과를 얻으려면 원래 future들에서 join() 해야 합니다. 또한 예외 처리 없이 join() 하면 CompletionException 이 전파됩니다.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.