Kim-Baek 개발자 이야기

CompletableFuture 란 무엇일까 본문

개발/java basic

CompletableFuture 란 무엇일까

김백개발자 2024. 11. 26. 20:00

CompletableFuture는 Java에서 비동기 프로그래밍을 지원하기 위해 제공되는 클래스로, 주로 멀티스레드 환경에서 비동기 작업을 더 쉽게 관리하고 체이닝(연쇄 호출)과 조합을 가능하게 합니다. 이는 Future 인터페이스의 한계를 극복하기 위해 Java 8에서 도입되었습니다. 


1. CompletableFuture란 무엇인가요?

CompletableFuture는 비동기적으로 작업을 수행하고, 결과가 준비되면 콜백을 호출하거나 다른 작업을 이어서 처리할 수 있도록 설계된 클래스입니다.

  • 비동기: 작업이 완료될 때까지 기다릴 필요 없이 바로 다음 코드를 실행할 수 있음.
  • 완료 가능: 개발자가 작업 결과를 직접 설정하거나, 실패를 명시적으로 알릴 수 있음.
  • 체이닝 가능: 여러 작업을 순차적으로 연결해서 처리 가능.

2. 왜 CompletableFuture를 사용할까요?

기존의 Future 인터페이스는 다음과 같은 제한이 있습니다:

  • 작업 완료를 기다리려면 get() 메서드를 호출해야 하는데, 이는 블로킹(대기) 방식임.
  • 완료 후 추가 작업(콜백)을 설정할 수 없음.
  • 여러 Future 작업을 쉽게 조합(combine)하기 어려움.

CompletableFuture는 이러한 제한을 해결하며 다음과 같은 장점을 제공합니다:

  • 비동기 작업 실행 및 결과 처리.
  • 비블로킹 방식으로 작업 상태 확인 및 처리.
  • 여러 작업을 조합하여 더 복잡한 로직 구현 가능.

3. 주요 기능과 사용법

(1) 비동기 작업 시작

CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
    System.out.println("비동기 작업 실행 중...");
});

(2) 결과 반환 작업

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    return "Hello, CompletableFuture!";
});
future.thenAccept(result -> System.out.println("결과: " + result));

(3) 작업 체이닝

비동기 작업이 완료된 후 추가 작업을 연결:

CompletableFuture.supplyAsync(() -> {
    return "첫 번째 작업";
}).thenApply(result -> {
    return result + " -> 두 번째 작업";
}).thenAccept(finalResult -> {
    System.out.println(finalResult); // 출력: 첫 번째 작업 -> 두 번째 작업
});

(4) 여러 작업 조합

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");

future1.thenCombine(future2, (result1, result2) -> result1 + " " + result2)
       .thenAccept(System.out::println); // 출력: Hello World

(5) 예외 처리

예외가 발생했을 때 대처:

CompletableFuture.supplyAsync(() -> {
    if (true) throw new RuntimeException("에러 발생!");
    return "정상 완료";
}).exceptionally(ex -> {
    System.out.println("예외 처리: " + ex.getMessage());
    return "기본값";
}).thenAccept(System.out::println);

4. 언제 사용하면 좋을까요?

  • 비동기 작업이 필요할 때 (예: 네트워크 요청, 파일 I/O, 데이터베이스 작업).
  • 작업 완료 후 추가 작업이 필요할 때.
  • 여러 비동기 작업을 동시에 수행하고 그 결과를 결합할 때.

5. 장점과 단점

장점

  • 간단하고 직관적인 비동기 프로그래밍 지원.
  • 콜백 지옥(callback hell) 방지.
  • 다중 작업 처리 및 예외 처리 용이.

단점

  • 코드가 복잡해질 수 있음 (특히 많은 체이닝이나 조합이 있을 때).
  • 디버깅이 어려울 수 있음 (비동기 작업은 호출 순서가 명확하지 않기 때문).

6. 결론

CompletableFuture는 Java에서 비동기 작업을 효율적으로 처리하기 위한 매우 강력한 도구입니다. 특히 멀티스레딩이나 병렬 처리가 필요한 경우, 더 간단하고 우아하게 코드를 작성할 수 있도록 도와줍니다. 익숙해지면 동기 코드처럼 읽히는 비동기 코드를 작성할 수 있게 됩니다!

반응형

'개발 > java basic' 카테고리의 다른 글

자바 리플렉션이란  (0) 2024.11.24
리액티브 프로그래밍이란  (0) 2024.11.17
제네릭 타입 소거 (컴파일/런타임)  (0) 2024.11.16
일급 컬렉션이란?  (0) 2024.11.13
제네릭이란 무엇일까  (0) 2024.11.12
Comments