ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Async 와 CompletableFuture 차이
    자바 및 spring boot 2026. 1. 15. 10:27

    @Async

       * 목적: 메소드 호출을 별도의 스레드에서 실행하여 호출 스레드를 블로킹하지 않도록 하는 간단한 방법입니다. "fire-and-forget" (실행하고 결과를 기다리지 않는) 방식에 적합합니다.
       * 동작 방식:
           * 메소드에 @Async 어노테이션을 붙이면, Spring이 해당 빈의 프록시를 생성합니다.
           * 이 메소드가 호출되면 프록시가 호출을 가로채고, 실제 메소드 실행을 TaskExecutor(스레드 풀)에 제출한 후 즉시 반환합니다.
           * 메소드는 public이어야 하며, 같은 클래스 내의 다른 메소드에서 호출하면 비동기적으로 동작하지 않습니다 (프록시 때문에).
           * 반환 타입은 void 또는 Future (또는 CompletableFuture)일 수 있습니다.
       * 장점: 사용하기 매우 쉽고 간편합니다. 간단한 비동기 작업에 적합합니다.
       * 단점: 비동기 작업 간의 복잡한 조합, 의존성 관리, 섬세한 예외 처리가 어렵습니다. 비동기 흐름에 대한 제어력이 떨어집니다.

      CompletableFuture

       * 목적: 복잡한 비동기 작업을 구성하고, 여러 비동기 작업의 결과를 조합하며, 논블로킹 방식으로 결과를 처리할 수 있는 강력한 도구입니다. Java 8에 도입되었습니다.
       * 동작 방식:
           * 비동기 작업의 결과를 나타내는 Future의 확장입니다.
           * 다양한 콜백(callback) 메소드(thenApply, thenCompose, thenCombine, allOf, anyOf 등)를 제공하여 비동기 작업의 성공 또는 실패에 따라 다음 작업을 정의하고 연결할 수 있습니다.
           * 작업이 어떤 Executor에서 실행될지 명시적으로 제어할 수 있습니다.
           * 비동기 작업 간의 의존성을 쉽게 표현하고 오류를 처리할 수 있습니다.
       * 장점: 비동기 작업의 조합, 의존성 관리, 유연한 예외 처리 등 복잡한 비동기 로직 구현에 매우 강력합니다. 비동기 흐름에 대한 세밀한 제어가 가능합니다.
       * 단점: @Async에 비해 사용법이 복잡하고, 학습 곡선이 있습니다. 간단한 작업에는 오버헤드가 될 수 있습니다.

      어떤 것을 선택해야 할까?

       * `@Async`를 사용하는 경우:
           * 결과를 즉시 기다리지 않고, 단순히 백그라운드에서 실행하고 싶은 "일회성" 작업.
           * 작업의 성공/실패 여부를 직접적으로 추적하거나, 다른 비동기 작업과 연계할 필요가 없을 때.
           * 예: 이메일 발송, 로깅, 단순 캐시 업데이트 등.

       * `CompletableFuture`를 사용하는 경우:
           * 여러 비동기 작업을 병렬로 실행하고 모든(또는 일부) 결과가 나올 때까지 기다려야 할 때.
           * 한 비동기 작업의 결과가 다른 비동기 작업의 입력으로 사용되는 등 작업 간의 의존성이 존재할 때.
           * 비동기 작업 중 발생할 수 있는 오류를 체계적으로 처리하고 싶을 때.
           * 비동기 작업을 조합하여 복잡한 비즈니스 로직을 구성해야 할 때.

Designed by Tistory.