엄범

 

CompleatbleFuture에 대해

 

Future, CompletableFuture, ListenableFuture

Future

  • Futures
  • `` Future<>``를 반환함으로써 callback 지옥에 빠지지 않을 수 있음
    • callback 지옥? "리턴값이 필요해서 callback 안에 callback..."
  • 하지만 필요한 결과를 얻으려 ``java future.get()``를 호출하여 외부 실행과 동기화해야 함
    • 이 때 Future 결과가 아직 준비 안되었다면 결과가 만들어 질 때 까지 blocking 된다.
  • Future 들을 조합하는 등 복잡한 연산에 대한 지원이 미흡

 

CompletableFuture ( ListenableFuture )

  • CompletableFuture (completion_stage)  
  • 괜찮은 방법이지만, 몇 가지 부족한 점이 있음.
    • 결국 CompletableFuture 로직을 호출 스레드가 아니라 별도 스레드풀 (ForkJoinPool) 에서 돌리겠다는 아이디어인데
      • 시간이 오래 걸리는 blocking http request api를 CompletableFuture에서 실행한다고 가정해보자.
      • 호출 스레드 기준으로 보면 non blocking이고 thenXXX로 결과를 수신하면서 비동기적으로 callback을 실행하게 되니 async이긴 하지만
      • 스레드풀 ForkJoinPool의 스레드 1개는 blocking이 걸린 상태로 응답을 기다리고 있어야 하기 때문에 결국 blocking이 걸린다.
    • 그리고 Mono는 data가 필요할 때 resolve되는 반면(subscribe), CompletableFuture는 내가 지금 당장 필요하든 필요하지 않든 일단 스레드풀에서 실행해서 resolve한다. (= lazy execution이 불가)
  • Spring 4 MVC에서는 JDK8부터 제공되는 `` CompletionStage`` 대신, 그 역할을 하는 `` ListenableFuture``를 자체적으로 제공했음 (하위 호환성 때문)
  • 참고로 `` RedisFuture``와 `` CompletableFuture``는 같은 것을 상속받지만 호환되지 않는 다른 타입이다. 그래서 toCompletableFuture()가 있음.

 

Reactive Programming (Mono, Flux)

이러한 문제점을 보완하기 위해 스프링에서는 리액티브 프로그래밍 지원을 위한 새로운 모듈을 구현하기로 했음 

https://stackoverflow.com/questions/54866391/mono-vs-completablefuture

  • Reactive Programming  
  • 앞서 얘기했듯이 Future와의 제일 큰 차이는 data가 필요할 때(=subscriber가 data를 consume할 준비가 되었을 때) resolve할 수 있다는 Back Pressure 개념이다.

 

기타

'Languages & Frameworks > Java' 카테고리의 다른 글

[Java8] CompletableFuture  (0) 2020.10.13
[Java] Enum to Json / Enum to Object  (0) 2020.04.27
[Spring] resources 경로 문제  (0) 2020.03.18
[Effective Java] 12장 직렬화  (0) 2020.02.28
[Effective Java] 11장 동시성  (0) 2020.02.28
[Effective Java] 10장 예외  (0) 2020.02.27