동기,비동기와 block,non-block를 명확하게 구분
두 개념은 관점의 차이로 볼 수 있음
동기로 실행되는 함수는 함수의 처리의 완료될 때까지 기다렸다가 직접 처리해줌
비동기로 실행되는 함수는 함수의 처리가 완료될 때까지 기다리지 않고 함수를 종료 -> 함수 처리 결과는 callback 함수에 의해 처리완료 시점에 간접적으로 처리해줌
blocking은 A라는 함수가 다른 함수 B를 호출할 때 A가 실행 주도권을 유지하는지 안하는지에 따라 결정됨
예를 들어 A 함수 실행 중 B 함수를 호출했을 때,
javascript ajax 호출의 경우 비동기, non-blocking의 예제로 볼 수 있음 => ajax 호출 결과에 대해 callback을 등록해 처리(비동기 호출), ajax를 호출한 함수가 ajax 요청이 응답을 받을 때까지 기다리지 않고 다른 작업을 수행함(non-blocking)
Spring WebFlux
서블릿 기반 Spring MVC에서는 클라이언트 request 당 스레드를 1개씩 부여해 처리함. 따라서 웹서버(스프링에서 하는건가?)에서 설정한 스레드풀을 넘어서는 요청이 들어올 경우 요청 처리속도가 급격하게 느려짐 =>
==> WebFlux(반응형) 프레임워크에서는 Spring MVC보다 적은 수의 스레드로 요청을 처리함. 하지만 대규모 요청을 받아들이는 서비스에서 Spring MVC보다 높은 처리속도를 보여주는데 Spring이 API 요청이나 I/O 요청을 동기요청으로 처리하는 반면 WebFlux는 이를 비동기 요청으로 처리해 해당 task가 처리될 때까지 기다리지 않고 다른 요청을 처리할 수 있기 때문임.