webflux vs mvc 관련 의문점 정리

topics 300-백엔드개발 301 Spring
types 학습 이론
tags

이미 많이 있지만 webflux와 spring mvc를 나의 언어로 정리하고 궁금한 것을 찾아보고자 한다

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

기본 개념

  • MVC
    • Thread-per-Request : 1요청에 1스레드
    • Tomcat
    • Blocking
  • WebFlux
    • Event Loop
    • Netty
    • NonBlocking

요청 들어올 때 처리 과정

-tx-

| MVC | WebFlux |
------------ | :-----------: | -----------: |
1 | HTTP Request ||
2 | Tread Pool(Tomcat) | Event Loop(Netty) |
3 | controller > service> repository ||
4 | Database(Blocking I/O) | Non-Blocking I/O |
5 | HTTP Response ||

궁금한점

틀렷으면 이야기 부탁드립니다...

1. Spring MVC도 비동기 인터페이스 있는데 이거 다 블로킹됨?

CompletableFuture같은 것들 말이지
다 블로킹되면 왜 비동기 쓰지?

Answer

SpringMVC도 모두 blocking은 아니다! 서버 레벨 I/O만 블로킹된다는것이다.
예를 들어 spring filter, servlet, client요청을 읽는 과정에서 블로킹이 발생한다
기존 서블릿 기반 애플리케이션의 한계
But!! WebFlux는 처음부터 끝까지 Non-blocking방식으로 할 수 있음!

즉 java코드레벨 비즈니스 로직은 Java표준에서 제공하는 방식으로 비동기,non-blocking처리될 수 있다.
CompletableFuture은 Java표준에서 제공하는 방식중 하나로 jvm에서 멀티 스레드 방식으로 구현된다

2. Event Loop방식이 뭐임? 기존이랑 뭐가 다름?

웹v8엔진에서 이벤트루프 방식으로 작동하는 방식이랑 비슷한가

Answer

한 스레드에서 여러 I/O를 처리 가능함 How? with EventLoop.
출처 : https://oneny.tistory.com/125
webflux vs mvc-1757788425212.png
그렇다 비슷하다 이벤트 루프가 이벤트가 있는지 확인하고 꺼내서 이벤트를 수행하는 방식이다.
webflux vs mvc-1757788537542.png

3. 리액터와 이벤트 루프는 비슷한 말인가

Answer

Reactor는 일종의 패턴이다 이벤트루프는 이러한 패턴을 구현하기 위한 방식이다.

4. 옵저버패턴과 이벤트루프는 언제 쓰이는가

옵저버 패턴도 많이 쓰인다고 들었는데 두개 언제 쓰이지?
내 생각에는 하드웨어를받아서 처리하는 I/O에서는 이벤트루프 , 소프트웨어 단으로 넘어가선 옵저버 쓸 것 같은데

Answer

이벤트루프는 하드웨어,Lowlevel과 연관된 I/O작업에 쓰이고 이게 소프트웨어 단으로 넘어가서 객체간에 무언가 이벤트를 트래킹하기 위해서는 옵저버 패턴을 씀
리액티브시스템에도 두개 섞어서 많이 쓴다고 함