JAVA/JAVA 개인 공부

Java의 Future, 그리고 CompletableFuture이 무엇인지, 왜쓰는지
깝몬 2025. 6. 26. 07:17

📌 1. "그냥 작업"이란 무엇인가?

Java에서 **"그냥 작업"**이란, 보통 다음과 같은 방식으로 처리됩니다:

int result = doSomething(); // 결과가 나올 때까지 기다림 (동기 방식)
 
  • 메서드를 호출하면 → 결과가 나올 때까지 프로그램이 멈춤.
  • 하나의 작업이 끝나야 다음 줄로 넘어감.
  • 예: 파일 다운로드, DB 조회 등 → 오래 걸리는 작업이면 전체 앱이 느려짐.

📌 2. Future란?

Java 5부터 등장한 Future<T>는 비동기 처리의 시작이에요.

 
ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(() -> { Thread.sleep(2000); // 2초 동안 일하는 작업 
return 10; }); int result = future.get(); // 여기서 결과 기다림
  • submit()으로 백그라운드에서 작업 시작
  • future.get() 호출 시 → 그때까지는 기다려야 함 (블로킹)
  • 단점:
    • 중간에 콜백 처리 없음
    • 여러 작업을 연결하거나 예외 처리하기 어려움

📌 3. CompletableFuture란? (Java 8)

CompletableFuture<T>는 Future의 확장판이에요. 비동기 + 논블로킹 + 함수형 프로그래밍 스타일까지 가능해짐.

예시:

CompletableFuture<Integer> cf = CompletableFuture.supplyAsync(() -> { // 비동기로 처리할 코드 return 10; }); 
cf.thenApply(result -> result * 2) .thenAccept(System.out::println); // 결과를 처리
🔍 주요 특징:
기능설명
✅ 비동기 실행 supplyAsync, runAsync로 백그라운드 작업
✅ 논블로킹 처리 .thenApply(), .thenAccept() 등으로 결과를 기다리지 않고 처리 등록
✅ 콜백 연결 then...() 체인으로 여러 단계 연결 가능
✅ 예외 처리 exceptionally, handle 등으로 오류 처리
✅ 여러 작업 조합 allOf(), anyOf() 같은 메서드로 병렬 작업 조합 가능
 

📌 4. 기존 방식과 무엇이 달라졌나?

항목전통적인 방식FutureCompletableFuture
처리 방식 동기 비동기 + 블로킹 완전 비동기 + 논블로킹
작업 연결 불가능 불편함 매우 쉬움 (체이닝)
예외 처리 try-catch 복잡 간편 (exceptionally, handle)
동시 작업 병합 어렵다 어렵다 .allOf(), .anyOf()로 쉬움
 

📌 5. 왜 좋은가?

  • UI 앱, 서버, 마이크로서비스처럼 비동기 성능이 중요한 곳에서 유용
  • 오래 걸리는 작업을 다른 쓰레드에 맡기고, 그동안 다른 일들을 처리할 수 있음
  • 코드 흐름이 깔끔하고, 유지보수에 강함

🧠 비유로 설명

  • 전통 방식: 식당에서 주문하면 요리가 나올 때까지 서서 기다림
  • Future: 주문하고 대기번호표를 받고, 부르면 가는 방식
  • CompletableFuture: 주문하고, 앱에 알림 등록해서 요리 끝나면 자동으로 알림받고 처리

✅ 결론

CompletableFuture는 Java에서 비동기 작업을 선언형으로 쉽게 처리하고, 병렬 처리/논블로킹/콜백/예외처리까지 모두 품은 현대적인 API입니다.
처음은 낯설지만, 적응하면 병렬 작업 처리에 강력한 무기가 됩니다.

필요하시면 실전 예제나 패턴도 이어서 보여드릴게요.