Java의 CompletableFuture Explained
F-Lab : 상위 1% 개발자들의 멘토링
AI가 제공하는 얕고 넓은 지식을 위한 짤막한 글입니다!

CompletableFuture란 무엇인가?
Java 8에서 소개된 CompletableFuture
는 비동기 프로그래밍을 위한 강력한 도구입니다. Future
인터페이스의 확장이며, 비동기 연산의 결과를 표현합니다. CompletableFuture
를 사용하면 복잡한 비동기 로직을 간결하고 이해하기 쉬운 방식으로 표현할 수 있습니다.
기존의 Future
는 작업이 완료될 때까지 결과를 가져오기 위해 블록킹 'get()' 메소드를 사용해야 했습니다. 그러나 CompletableFuture
는 이벤트가 발생하거나 작업이 완료될 때 코드가 실행되도록 하는 콜백 스타일의 프로그래밍을 가능하게 합니다.
CompletableFuture
는 작업이 완료되었을 때 실행될 여러 가지 메소드를 제공합니다. 이를 통해 비동기 작업의 결과에 따라서 동작을 연쇄적으로 이어갈 수 있습니다.
비동기 프로그래밍은 서버 애플리케이션, 대규모 데이터 처리, 웹 서비스 호출 등 다양한 영역에서 중요한 역할을 합니다. CompletableFuture
는 이러한 환경에서 성능과 가독성을 모두 향상시키는 핵심 요소입니다.
이 글에서는 CompletableFuture
의 기본 사용법, 주요 메소드, 실제 사용 사례 등을 소개하겠습니다.
CompletableFuture의 기본 사용법
비동기 작업을 시작하는 가장 간단한 방법 중 하나는 CompletableFuture.runAsync()
메소드를 사용하는 것입니다. 이 메소드는 비동기적으로 실행할 코드 블록을 받아들이며, 별도의 실행자(Executor) 없이 ForkJoinPool을 사용하여 작업을 실행합니다.
CompletableFuture future = CompletableFuture.runAsync(() -> { // 비동기로 실행할 작업 });위 예제는 비동기 작업을 시작하고, 해당 작업이 완료될 때까지 기다리지 않고 즉시 다음 코드로 넘어갑니다. 작업이 완료되면
CompletableFuture
가 완료 상태가 됩니다.
비동기적으로 결과값을 반환하는 작업을 수행하고 싶다면, CompletableFuture.supplyAsync()
메소드를 사용할 수 있습니다. 이 메소드는 Supplier를 받아들이며, 이 Supplier는 비동기적으로 실행되어 결과값을 반환합니다.
CompletableFuture future = CompletableFuture.supplyAsync(() -> { return "Hello, CompletableFuture!"; });위 코드는 비동기 작업의 결과로 문자열을 반환합니다. 작업이 완료되면, CompletableFuture 인스턴스는 완료된 상태가 되며, 결과값을 얻을 수 있습니다.
비동기 작업이 성공적으로 완료되면 결과를 처리하기 위한 메소드들을 체이닝 방식으로 연결할 수 있습니다. 예를 들어, thenApply()
, thenAccept()
, thenRun()
등의 메소드를 사용해 결과값을 가공하거나, 특정 작업을 실행할 수 있습니다.
이러한 체이닝을 통해 비동기 작업의 결과를 활용하여 추가 작업을 수행하고, 복잡한 비동기 로직을 직관적으로 표현할 수 있습니다.
CompletableFuture의 핵심 메소드와 활용법
CompletableFuture
는 비동기 작업의 성공, 실패, 취소 등 다양한 상황을 처리하기 위한 다양한 메소드를 제공합니다. 결과 처리뿐만 아니라, 예외 처리를 위한 exceptionally()
메소드, 여러 비동기 작업을 조합하기 위한 thenCombine()
, thenCompose()
등의 메소드가 있습니다.
예외 처리를 위한 좋은 예제는 다음과 같습니다.
CompletableFuture future = CompletableFuture.supplyAsync(() -> { if(System.currentTimeMillis() % 2 == 0) { throw new RuntimeException("Even time!"); } return "Odd time!"; }).exceptionally(ex -> "Error: " + ex.getMessage());이 코드는 비동기 작업 중 예외가 발생했을 때,
exceptionally()
메소드를 사용하여 예외를 처리합니다.
또한, 여러 비동기 작업의 결과를 조합하여 새로운 결과를 생성할 수 있습니다. 이를 위해 thenCombine()
메소드를 사용할 수 있습니다.
CompletableFuture future1 = CompletableFuture.supplyAsync(() -> "Hello"); CompletableFuture future2 = CompletableFuture.supplyAsync(() -> " World"); CompletableFuture result = future1.thenCombine(future2, (s1, s2) -> s1 + s2);위 예제는 두 개의 비동기 작업 결과를 조합하여 하나의 문자열을 생성합니다.
CompletableFuture
를 사용함으로써, 복잡한 비동기 프로그래밍을 보다 쉽고 간결하게 표현할 수 있습니다. 이는 애플리케이션의 가독성과 유지보수성을 크게 향상시킵니다.
CompletableFuture를 활용한 실제 사례
현실 세계의 애플리케이션에서 CompletableFuture
를 활용한 사례는 다양합니다. 예를 들어, 여러 웹 서비스로부터 데이터를 비동기적으로 가져와서 조합하는 경우, CompletableFuture
를 사용하여 각 웹 서비스 호출을 병렬로 실행하고 결과를 조합할 수 있습니다.
또한, 대용량 데이터 처리 작업에서도 CompletableFuture
의 활용이 가능합니다. 데이터를 분할하여 여러 부분으로 나눈 후, 각 부분을 비동기적으로 처리하고 결과를 합치는 작업을 CompletableFuture
를 통해 효율적으로 수행할 수 있습니다.
이러한 방식은 성능 향상뿐만 아니라, 애플리케이션의 응답성을 개선하는 데에도 기여합니다. 사용자에게 빠른 응답을 제공할 수 있으며, 시스템 자원의 사용도 최적화할 수 있습니다.
CompletableFuture
는 Java 애플리케이션에서 비동기 프로그래밍을 구현하는 데 있어 강력한 도구입니다. 이를 통해 개발자는 보다 효율적이고 성능이 우수한 애플리케이션을 구축할 수 있습니다.
결론: CompletableFuture로 더 강력한 비동기 프로그래밍을
CompletableFuture
는 Java에서 비동기 프로그래밍을 위한 강력한 도구입니다. 이를 통해 개발자는 복잡한 비동기 로직을 쉽게 구현할 수 있으며, 애플리케이션의 성능과 응답성을 향상시킬 수 있습니다.
비동기 작업의 결과 처리, 예외 처리, 여러 작업의 조합 등 CompletableFuture
가 제공하는 다양한 기능을 적극적으로 활용한다면, 보다 효율적인 애플리케이션을 개발할 수 있습니다.
앞으로도 CompletableFuture
와 같은 비동기 프로그래밍 도구의 발전이 기대됩니다. 이러한 도구를 통해 개발자들은 더 나은 사용자 경험을 제공하고, 현대적인 애플리케이션 개발의 도전 과제를 해결해 나갈 것입니다.
이 컨텐츠는 F-Lab의 고유 자산으로 상업적인 목적의 복사 및 배포를 금합니다.