[Spring] Spring MVC VS Spring Webflux

무1민·2024년 3월 9일
1

Spring

목록 보기
9/9
post-thumbnail

프로젝트를 진행하면서 비동기적인? 통신을 구현하고 있는데, 기존에 mvc 패턴만 쓰다가 새롭게 webflux를 공부해서 적용해봤다.
이번 시간엔 둘의 차이점에 대해서 설명하고자 한다👴

먼저, 동기/비동기, 블로킹/논블로킹 방식에 대해서 정리하고 진행하겠다.

동기 vs 비동기, 블로킹 vs 논블로킹

먼저 그림으로 간단하게 표현하면 다음과 같다!

동기(Synchronous)

동기는 말그대로 동시에 일어날 수 있다는 뜻인데, 호출과 응답이 동시에 이루어지는 것을 의미한다.
그래서 함수를 호출한 곳에서 바로 응답을 받는다.

비동기(Asynchronous)

비동기는 동기와 다르게 호출과 응답이 동시에 이루어지지 않는 것을 의미한다.
호출시점과 처리결과에 대한 응답시점이 같지 않아서,
함수를 호출했을 때 그에 대한 처리 결과를 추후에 처리가 완료된 불특정 시점에 전달받는다.

블로킹(Blocking)

블로킹은 함수를 call했을 때 응답을 받기 위해 멈춰있는 상태를 의미한다.
그래서 함수가 종료되어야 다음 줄을 실행한다.

논블로킹(Non-Blocking)

논블로킹은 함수를 call했을 때 결과를 받기 위해 멈춰있지 않고 바로 다음 줄을 실행하는 상태를 의미한다.

일단, 우리가 아는 Spring MVC(SpringBoot)는 동기적으로 동작하고, Spring Webflux는 비동기적으로 동작한다. 라고만 알고 넘어가보자.

Spring MVC

Spring MVC는 동기적으로 동작하는 블로킹 방식이다.

  • 사용자 요청마다 쓰레드를 계속 생성한다. -> 쓰레드풀에 할당한다.
  • 많은 사용자가 동시 요청을 보냈을 때 쓰레드 풀에 남아있는 쓰레드가 없다면 요청을 처리하지 못하는 문제가 있다.
  • Tomcat은 이러한 Spring MVC 애플리케이션을 호스팅하는데 가장 일반적으로 사용되는 서블릿 컨테이너
    • 보통 tomcat 서버는 default로 200개의 thread를 가진 thread pool을 지원한다.

쓰레드풀에 인해 요청이 들어오면, 그 요청을 큐에 쌓아두고, 쓰레드풀에 미리 만들어둔 쓰레드를 하나씩 가져와서 사용하는 방식이다.
하지만, 엄청나게 많은 사용자가 동시에 요청을 보낼 경우 풀사이즈를 초과해서 큐에 요청이 계속 쌓이게 되는 현상이 발생한다.

Spring Webflux

Spring Webflux는 비동기적으로 동작하는 논블로킹 방식이다.

  • Reactive programming(반응형 프로그래밍)
  • 하나의 쓰레드가 여러 개의 작업을 처리할 수 있다.
    • 쓰레드를 몇개 쓰는지는, 내부 CPU 코어 수에 의해 결정된다.
  • 요청이 발생할 경우, 그것에 맞는 핸들러에게 처리를 위임하고, 처리가 완료되면 callback 메소드를 통해 응답한다.
  • 이벤트 루프를 통해 리액티브 프로그래밍을 한다고 하는데, 이는 Node.js가 요청을 처리하는 방식이랑 똑같다고 한다.
  • Spring WebFlux는 Netty와 같은 리액티브 서버를 사용한다.
    • Netty는 비동기 네트워킹을 지원하는 프레임워크
profile
야호

0개의 댓글