Java의 비동기 프로그래밍: CompletableFuture

박종원·2025년 2월 3일

CompletableFuture

  • 프로젝트를 진행하면서 여러 API를 호출했는데, 동기적으로 처리하다 보니 시간이 너무 오래 걸렸다. 그러다 Java 8에서 도입된 CompletableFuture라는 클래스를 발견했다.

  • CompletableFuture는 Future 인터페이스를 구현하면서도 비동기 작업의 완료를 좀 더 선언적으로 처리할 수 있도록 다양한 메서드를 제공한다. 특히, 함수형 프로그래밍 스타일을 지원해서 비동기 작업들을 체이닝하거나 조합하는 게 훨씬 쉽다

Future와 CompletableFuture의 차이점

Future의 사용

Future<String> future = executorService.submit(new Callable<String>() {
    @Override
    public String call() throws Exception {
        // 시간이 걸리는 작업
        Thread.sleep(2000);
        return "결과";
    }
});

// 블로킹 발생
String result = future.get();
  • get()을 호출하는 순간, 작업이 끝날 때까지 블로킹된다.
  • 여러 개의 Future를 조합하는 게 어렵다.

CompletableFuture의 사용

CompletableFuture는 비동기적으로 실행되며, 작업이 완료되면 결과 값을 받아서 추가적인 처리를 할 수 있다.

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(2000);
        return "결과";
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
}).thenApply(result -> "처리된 " + result)
  .thenAccept(System.out::println);
  • 비동기 작업의 파이프라인 구성 가능
  • 예외 처리를 위한 전용 메서드 제공
  • 여러 비동기 작업의 조합이 용이

비동기 실행 방법

  1. thenApplyAsync → 이전 결과를 받아서 가공 후 반환
  2. thenCompose → CompletableFuture를 반환하는 함수와 조합
  3. thenAccept → 결과를 소비하지만 반환값은 없음
  4. thenRun → 결과 없이 실행할 작업을 정의
  5. thenCombine → 두 개의 CompletableFuture를 조합하여 새로운 결과 생성

비동기 처리가 필요할 때 CompletableFuture를 적극적으로 활용하면 성능을 개선할 수 있다!

0개의 댓글