프로젝트를 진행하면서 여러 API를 호출했는데, 동기적으로 처리하다 보니 시간이 너무 오래 걸렸다. 그러다 Java 8에서 도입된 CompletableFuture라는 클래스를 발견했다.
CompletableFuture는 Future 인터페이스를 구현하면서도 비동기 작업의 완료를 좀 더 선언적으로 처리할 수 있도록 다양한 메서드를 제공한다. 특히, 함수형 프로그래밍 스타일을 지원해서 비동기 작업들을 체이닝하거나 조합하는 게 훨씬 쉽다
Future<String> future = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
// 시간이 걸리는 작업
Thread.sleep(2000);
return "결과";
}
});
// 블로킹 발생
String result = future.get();
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);
비동기 처리가 필요할 때 CompletableFuture를 적극적으로 활용하면 성능을 개선할 수 있다!