https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-why-reactive

논-블럭킹과 펑셔널에 대해 언급했는데 왜 리액티브를 해야 하며 그게 무슨 의미가 있을까?

"리액티브"라는 단어는 I/O 이벤트에 반응하는 네트워크 컴포넌트, 마우스 이벤트에 반응하는 UI 컨트롤러 등 어떤 변화에 반응하는 것을 아우르는 프로그래밍 모델을 뜻한다. 그런 점에서 논-블럭킹은 반응형이다 왜냐면 블럭킹되지 않고 작업이 완료되거나 데이터가 전달되는 등의 알림에 반응하는 모델 속에 있기 떄문이다.

우리가 스프링 팀에서 "리액티브"와 더불어 중요하게 여기는 매커니즘 하나가 바로 논-블럭킹 백 프레셔(back pressure)다. 동기적이고, 순차적인 코드, 블럭킹 콜은 자연적으로 백 프레셔를 제공한다. 왜냐면 호출한 쪽이 그 작업이 끝날 때까지 기다려야 하니까. 하지만 논-블럭킹 코드에서는 이벤트를 공금하는 쪽(publisher)이 지나치게 빨라서 그걸 소비하는 쪽이 뻗지 않게 이벤트 비율을 조절하는것이 중요해진다.

리액티브 스트림은 작은 규모의 스팩이고 자바 9가 채용했다. 플로우 API로 비동기적인 컴포넌트간의 백 프레셔를 고려한 상호 교류를 정의했다. 예를 들어, 데이터 저장소는 발행자처럼 동작하며 데이터를 공급할 수 있다. 그리고 그 데이터를 구독자처럼 동작하는 HTTP server가 받아서 응답을 작성할 수 있다. 리액티브 스트림의 주요 목적은 구독자로 하여금 얼마나 빨리 또는 느리게 공급자가 데이터를 생성해야 하는지 제어할 수 있게끔 하는 것이다.

자주받는 질문: 발행자를 늦출 수 없으면?
리액티브 스트림의 목적인 오로지 그러한 매커니즘과 경계를 만들는 것 뿐이다. 만약에 발행자를 늦출 수 없다면 버퍼에 담을지, 버릴지, 실패할지 정해야 한다.