JAVA · 비동기/동시성
CompletableFuture 심화
CompletableFuture로 비동기 파이프라인을 구성하고 결합합니다.
비동기/동시성고급CompletableFuturethenComposeallOf비동기
핵심 설명
CompletableFuture로 비동기 파이프라인을 구성하고 결합합니다.
Java code
import java.util.concurrent.*;
import java.util.*;
public class CompletableFutureAdvanced {
static CompletableFuture<String> fetchUser(String id) {
return CompletableFuture.supplyAsync(() -> {
sleep(100);
return "User-" + id;
});
}
static CompletableFuture<String> fetchOrder(String user) {
return CompletableFuture.supplyAsync(() -> {
sleep(100);
return "Order-" + user;
});
}
static void sleep(long ms) {
try { Thread.sleep(ms); } catch (InterruptedException e) {}
}
public static void main(String[] args) {
// 체이닝: thenApply, thenCompose, thenAccept
CompletableFuture<String> pipeline = fetchUser("123")
.thenCompose(user -> fetchOrder(user)) // flatMap
.thenApply(order -> order.toUpperCase()) // map
.exceptionally(ex -> "에러: " + ex.getMessage());
System.out.println(pipeline.join());
// 여러 작업 병렬 실행 후 결합
CompletableFuture<String> f1 = fetchUser("1");
CompletableFuture<String> f2 = fetchUser("2");
CompletableFuture<String> f3 = fetchUser("3");
// allOf — 모두 완료 대기
CompletableFuture.allOf(f1, f2, f3)
.thenRun(() -> System.out.println("모두 완료!"))
.join();
// anyOf — 하나라도 완료
CompletableFuture<Object> fastest =
CompletableFuture.anyOf(f1, f2, f3);
System.out.println("가장 빠른: " + fastest.join());
// thenCombine — 두 결과 결합
f1.thenCombine(f2, (a, b) -> a + " & " + b)
.thenAccept(System.out::println)
.join();
}
}학습 팁
thenApply은 동기 변환(map), thenCompose는 비동기 변환(flatMap)입니다. Async 접미사 메서드는 다른 스레드에서 실행합니다.
주의할 점
join()은 checked exception을 던지지 않아 편하지만, 예외가 CompletionException으로 래핑됩니다. 원본 예외를 얻으려면 getCause()를 호출하세요.
자주 묻는 질문
CompletableFuture 심화란 무엇인가요?
CompletableFuture 로 비동기 파이프라인을 구성하고 결합합니다.
CompletableFuture 심화 학습 시 주의할 점은 무엇인가요?
join() 은 checked exception을 던지지 않아 편하지만, 예외가 CompletionException 으로 래핑됩니다. 원본 예외를 얻으려면 getCause() 를 호출하세요.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.