PHpullh
학습 라이브러리/Java/CompletableFuture 심화

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() 를 호출하세요.