
‘supplyAsync’는 Java의 CompletableFuture API에 있는 비동기 실행 메서드입니다. 주요 의미와 동작은 다음과 같습니다. - 무엇을 하는가 - Supplier
를 비동기적으로 실행하고 그 결과를 담는 CompletableFuture를 즉시 반환합니다. - 즉시 반환되며, Supplier의 실행은 별도 스레드에서 나중에 수행됩니다. - 대표 시그니처 - CompletableFuture.supplyAsync(Supplier supplier) - CompletableFuture.supplyAsync(Supplier supplier, Executor executor) - 실행 위치(스레드) - 인자를 하나만 쓰면 ForkJoinPool.commonPool()에서 실행됩니다. - Executor를 전달하면 그 Executor가 작업을 실행합니다(권장: 블로킹/IO 작업에는 별도 스레드풀 사용). - 반환과 예외 처리 - 반환값: CompletableFuture (Supplier가 반환한 T가 완료값). - Supplier가 예외를 던지면 CompletableFuture는 "예외적으로 완료"됩니다. get()은 ExecutionException을 던지고 join()은 CompletionException을 던집니다. - 예외 처리/대체는 exceptionally, handle, whenComplete 등을 통해 할 수 있습니다. - runAsync와의 차이 - runAsync는 Runnable을 받아 결과값이 없는 CompletableFuture를 반환. - supplyAsync는 값을 반환하는 Supplier로 결과값 있는 CompletableFuture를 반환. - 사용 예시 (개념) - 간단 사용: CompletableFuture.supplyAsync(() -> slowComputation()); - Executor 사용: CompletableFuture.supplyAsync(() -> ioCall(), myThreadPool); - 실무에서 주의할 점 - commonPool는 CPU 중심 작업에 적합. 블로킹 작업을 commonPool에서 많이 실행하면 풀 고갈로 성능 저하가 발생하므로 별도 Executor 사용 권장. - Supplier 내부에서 긴 블로킹/차단 호출이나 외부 자원 접근 시 타임아웃/취소 및 스레드풀 크기 고려. - 취소(cancellation)는 CompletableFuture.cancel()로 시도할 수 있으나 이미 실행 중인 작업은 스레드 인터럽트에 의해만 중단될 수 있으므로 Supplier가 인터럽트에 반응해야 실제 중단됨. - 조합과 활용 - 반환된 CompletableFuture는 thenApply, thenCompose, thenAccept 등으로 이어붙여 비동기 파이프라인을 구성할 수 있음. 요약: supplyAsync는 값을 반환하는 작업(Supplier)을 별도 스레드에서 비동기 실행해 그 결과를 CompletableFuture로 제공하는 메서드이며, 기본 풀 대신 사용자 Executor 사용, 예외 처리, 블로킹 작업에 대한 스레드풀 관리 등을 주의해야 합니다.