자기개발/검색한 자료 정리

Java 8에서 CompletableFuture를 활용한 비동기 프로그래밍

실버블렛 2023. 4. 24. 15:00
반응형

Java 8에서 CompletableFuture를 활용한 비동기 프로그래밍

비동기 프로그래밍은 오늘날의 모던 애플리케이션에서 필수적인 개념입니다. Java 8에서 소개된 CompletableFuture는 이러한 비동기 프로그래밍을 처리하는 데 도움이 되는 강력한 도구입니다. 이 글에서는 CompletableFuture를 사용하여 비동기 작업을 수행하는 방법을 알아보겠습니다.

CompletableFuture 이해하기

CompletableFuture는 Java의 Future 인터페이스를 구현하며, 동시성 작업의 결과를 나타냅니다. 비동기 작업을 수행한 후에 결과를 얻거나, 작업이 완료되기를 기다릴 수 있습니다. 이는 다양한 작업을 병렬로 실행할 수 있으며, 애플리케이션의 성능을 향상시킬 수 있습니다.

CompletableFuture 사용법

  1. 비동기 작업 시작: CompletableFuture를 사용하여 새로운 비동기 작업을 시작하려면 supplyAsync() 메소드를 사용합니다. 이 메소드는 Supplier 함수형 인터페이스를 매개변수로 받아들이며, 반환 값으로 CompletableFuture를 제공합니다.
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
    // 비동기 작업 수행
    return "Hello, CompletableFuture!";
});
  1. 결과 가져오기: CompletableFuture의 get() 메소드를 호출하여 결과를 가져올 수 있습니다. 이 메소드는 호출 스레드가 결과가 준비될 때까지 블록됩니다.
String result = completableFuture.get();
  1. 결과 처리: CompletableFuture에서 제공하는 thenApply(), thenAccept(), thenRun() 등의 메소드를 사용하여 결과를 처리할 수 있습니다. 이 메소드들은 CompletableFuture의 완료 후에 실행되는 콜백 함수를 등록합니다.
CompletableFuture<String> transformedResult = completableFuture.thenApply(result -> result.toUpperCase());
  1. 여러 비동기 작업 합치기: CompletableFuture는 thenCompose(), thenCombine() 등의 메소드를 통해 여러 비동기 작업을 합칠 수 있습니다. 이를 통해 복잡한 비동기 작업 흐름을 구성할 수 있습니다.
CompletableFuture<String> firstTask = CompletableFuture.supplyAsync(() -> "First task");
CompletableFuture<String> secondTask = CompletableFuture.supplyAsync(() -> "Second task");

CompletableFuture<String> combinedResult = firstTask.thenCombine(secondTask, (first, second) -> first + ", " + second);
  1. 예외 처리: exceptionally() 메소드를 사용하여 CompletableFuture에서 발생한 예외를 처리할 수 있습니다.
CompleFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
    throw new RuntimeException("Error occurred!");
}).exceptionally(ex -> {
    // 예외 처리
    return "Default value";
});
  1. 비동기 작업 완료 시 알림 받기: CompletableFuture의 thenAccept() 또는 whenComplete() 메소드를 사용하여 비동기 작업이 완료될 때 알림을 받을 수 있습니다. 이를 통해 다음 작업을 계획하거나, 완료된 작업에 대한 추가 처리를 수행할 수 있습니다.
CompletableFuture.supplyAsync(() -> "Async task")
        .thenAccept(result -> System.out.println("Task completed: " + result))
        .whenComplete((result, ex) -> {
            if (ex != null) {
                System.out.println("Error occurred: " + ex.getMessage());
            } else {
                System.out.println("Task completed successfully!");
            }
        });
  1. 비동기 작업 취소: CompletableFuture의 cancel() 메소드를 사용하여 비동기 작업을 취소할 수 있습니다. 이는 작업이 아직 시작되지 않았거나 실행 중일 때 작업을 중단하고자 할 때 유용합니다.
boolean isCancelled = completableFuture.cancel(true);

이러한 기능들을 활용하여 Java 8의 CompletableFuture를 사용하여 강력한 비동기 프로그래밍을 구현할 수 있습니다. CompletableFuture를 사용하면 작업의 동시성을 높여 성능을 향상시킬 수 있으며, 코드의 가독성도 높일 수 있습니다. 이를 통해 개발자들은 더 효율적이고 안정적인 애플리케이션을 개발할 수 있습니다.

반응형