F-Lab
🚀
상위권 IT회사 합격 이력서 무료로 모아보기

Java의 CompletableFuture Explained

writer_thumbnail

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 & Company

이 컨텐츠는 F-Lab의 고유 자산으로 상업적인 목적의 복사 및 배포를 금합니다.

조회수
F-Lab
소개채용멘토 지원
facebook
linkedIn
youtube
instagram
logo
(주)에프랩앤컴퍼니 | 사업자등록번호 : 534-85-01979 | 대표자명 : 박중수 | 전화번호 : 1600-8776 | 제휴 문의 : info@f-lab.kr | 주소 : 서울특별시 강남구 테헤란로63길 12, 438호 | copyright © F-Lab & Company 2025