프로젝트를 진행하면서 비동기적인? 통신을 구현하고 있는데, 기존에 mvc 패턴만 쓰다가 새롭게 webflux를 공부해서 적용해봤다.
이번 시간엔 둘의 차이점에 대해서 설명하고자 한다👴
먼저, 동기/비동기, 블로킹/논블로킹 방식에 대해서 정리하고 진행하겠다.
먼저 그림으로 간단하게 표현하면 다음과 같다!
동기는 말그대로 동시에 일어날 수 있다는 뜻인데,
호출과 응답이 동시에 이루어지는 것
을 의미한다.
그래서 함수를 호출한 곳에서 바로 응답을 받는다.
비동기는 동기와 다르게
호출과 응답이 동시에 이루어지지 않는 것
을 의미한다.
호출시점과 처리결과에 대한 응답시점이 같지 않아서,
함수를 호출했을 때 그에 대한 처리 결과를 추후에 처리가 완료된 불특정 시점에 전달받는다.
블로킹은 함수를
call했을 때 응답을 받기 위해 멈춰있는 상태
를 의미한다.
그래서함수가 종료되어야 다음 줄을 실행
한다.
논블로킹은 함수를
call했을 때 결과를 받기 위해 멈춰있지 않고 바로 다음 줄을 실행하는 상태
를 의미한다.
일단, 우리가 아는 Spring MVC(SpringBoot)는 동기적으로 동작하고, Spring Webflux는 비동기적으로 동작한다. 라고만 알고 넘어가보자.
요청마다 쓰레드
를 계속 생성한다. -> 쓰레드풀에 할당한다.쓰레드풀에 인해 요청이 들어오면, 그 요청을 큐에 쌓아두고, 쓰레드풀에 미리 만들어둔 쓰레드를 하나씩 가져와서 사용하는 방식이다.
하지만, 엄청나게 많은 사용자가 동시에 요청을 보낼 경우 풀사이즈를 초과해서 큐에 요청이 계속 쌓이게 되는 현상이 발생한다.