-
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`를 사용하는 경우:
* 여러 비동기 작업을 병렬로 실행하고 모든(또는 일부) 결과가 나올 때까지 기다려야 할 때.
* 한 비동기 작업의 결과가 다른 비동기 작업의 입력으로 사용되는 등 작업 간의 의존성이 존재할 때.
* 비동기 작업 중 발생할 수 있는 오류를 체계적으로 처리하고 싶을 때.
* 비동기 작업을 조합하여 복잡한 비즈니스 로직을 구성해야 할 때.'자바 및 spring boot' 카테고리의 다른 글
FAIL_ON_UNKNOWN_PROPERTIES = false (관용 모드, Spring Boot 기본값) (1) 2026.04.20 Blocking Queue (5) 2025.02.25 [Kafka] 멱등성/At least once/At most once/Exactly once (0) 2025.02.25 LocalDateTime 직렬화 역직렬화 오류 (0) 2025.02.10 [JPA] @Modifying이란? (0) 2025.02.07