Programming/Spring

[Spring] Spring MVC 와 Spring Webflux의 차이점

bu119 2024. 3. 17. 09:00
728x90
반응형

Spring Framework에는 대표적인 프로그래밍 모델이 있다.

첫 번째는 가장 널리 알려지고 대중적으로 사용되는 Spring MVC 모델이고,

두 번째는 Spring WebFlux 모델이다.

 

Spring WebFlux란?

Spring WebFlux는 Spring 5에서 새롭게 도입된 모듈이며, 비동기 및 리액티브 프로그래밍을 지원한다. Spring MVC와는 다르게 Servlet API를 기반으로 하지 않고, 리액티브 프로그래밍 모델을 채택하여 작동한다.

 

이전에는 Servlet API를 기반으로 한 Spring MVC를 사용하여 동기적인 처리 방식으로 웹 애플리케이션을 개발했다. 동기적인 처리 방식은 한 번에 하나의 요청을 처리하는데, 이는 높은 트래픽과 데이터 양을 효과적으로 처리하기 어렵다.

 

최근에는 더 많은 트래픽과 데이터량을 효율적으로 처리하기 위한 필요성이 증가했고 리액티브 프로그래밍이 등장하게 되었다.

 

리액티브 프로그래밍은 데이터 스트림과 변화의 전파를 중심으로 하는 프로그래밍 패러다임으로, Spring WebFlux는 Reactor라는 리액티브 스트림 스펙을 기반으로 개발되었다. 이를 통해 비동기적이고 논블로킹 방식으로 동작하여 더 많은 동시 요청을 처리하고, 데이터 스트림을 효율적으로 처리할 수 있게 되었다.

 

따라서, Spring WebFlux는 현대적이고 확장 가능한 웹 애플리케이션을 개발하는 데 유용한 도구이다. 이 모듈을 사용하면 개발자는 비동기적이고 효율적인 방식으로 작업할 수 있다.

 

Spring WebFlux와 Spring MVC를 비교할 때 가장 큰 차이는 리액티브 프로그래밍의 도입이다.

 

리액티브 프로그래밍이란?

리액티브 프로그래밍은 변화에 반응하여 동작하는 프로그래밍 모델로서, 비동기적이고 이벤트 기반의 접근 방식을 통해 데이터 스트림과 변경 사항을 처리하는 것이 핵심이다. 이 패러다임은 데이터의 흐름에 따라 프로그램의 흐름이 결정되며, 데이터가 변경될 때마다 자동으로 관련 코드를 실행하여 응답한다.

 

예를 들어,

블로킹 코드에서는 함수 호출 후 결과를 기다리는 것이 자연스러운 형태이다. 반면, 논블로킹 코드에서 데이터를 전송하는 쪽의 전송속도가 수신자의 처리속도를 앞지르지 않게 이벤트 속도를 제어하는 것이 중요하다. reactive stream은 이런 비동기성 컴포넌트 간의 상호작용에 정의된 작은 스펙이다. 이런 기능을 Back Pressure라고 한다.

 

Spring WebFlux의 특징

  • 리액티브 프로그래밍 모델을 기반으로 한다.
  • Spring MVC와 마찬가지로 어노테이션 기반의 프로그래밍을 한다.
    • 대표적으로 @Controller, @RestController, @GetMapping 등을 사용하여 엔드 포인트를 정의하고 요청을 처리할 수 있다.
  • 함수형 프로그래밍을 지원한다
    • Spring WebFlux는 함수형 엔드포인트 정의와 리액티브 데이터 흐름을 표현하기 위해 Java8의 도입된 람다식을 활용할 수 있다.
  • 비동기 및 논블로킹 기반으로 동작하기 때문에, 대량의 동시 요청에 대한 빠른 응답과 서버의 확장성을 향상하는 개발이 가능하다.
  • Spring과 완벽한 통합을 이루고 netty를 지원한다.

 

 

Spring MVC란?

웹 계층의 서블릿 API를 기반으로 클라이언트의 요청을 처리하는 모듈 개발 영역을 MVC(Model-View-Controller)로 구분하여 각 역할에 맞게 코드를 작성하는 개발 방식이다.

MVC 패턴을 도입하면서 UI 영역과 도메인(비즈니스 로직) 영역이 구분되어 서로에게 영향을 주지 않으면서 개발과 유지보수를 가능한 방향으로 설계되었다.

 

  • Model
    • Spring MVC 기반의 웹 애플리케이션이 클라이언트의 요청을 전달받으면 요청 사항을 처리하기 위한 작업이다.
    • 처리한 작업의 결과 데이터를 클라이언트에게 응답을 돌려주어야 하는데, 클라이언트에게 응답으로 돌려주는 작업의 처리 결과 데이터를 Model이라고 칭한다.
    • 클라이언트의 요청을 구체적으로 처리하는 영역을 서비스 계층이라 하며, 요청 사항을 처리하기 위해 Java 코드로 구현한 것을 비즈니스 로직이라고 한다.
  • View
    •  Model을 이용하여 웹 브라우저와 같은 애플리케이션의 화면에 보이는 리소스를 제공하는 역할이다.
    • HTML 페이지 등을 출력하는 것 뿐만이 아닌 PDF, Excel 등의 문서 형태 출력 그리고 자주 사용되는 XML, JSON 등 특정 형식의 포맷 변환까지 View가 담당한다.
  • Controller
    • 클라이언트 측의 요청을 직접적으로 전달받는 엔드포인트로 Model과 View의 중간에서 상호작용을 해주는 역할이다.
    • 클라이언트의 요청을 전달받아 비즈니스 로직을 거친 후, Model 데이터가 만들어지면 이 Model을 View로 전달하는 역할을 수행한다.

 

Spring MVC의 구조

 

동작 순서

  1. 핸들러 조회 : URL에 매핑된 핸들러(컨트롤러)를 조회
  2. 핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어댑터를 조회
  3. 핸들러 어댑터 실행
  4. 핸들러 실행
  5. ModelAndView 반환 : 핸들러 어댑터는 핸들러가 반환하는 정보를 변환하여 반환
  6. viewResolver 호출 : 뷰의 논리 이름을 물리 이름으로 변경
  7. View 반환 : 렌더링 역할을 담당하는 뷰 객체 반환
  8. View 랜더링 : 뷰를 통해 뷰를 렌더링

 

Spring MVC와 Spring WebFlux 비교

 

공통점

  • MVC와 Webflux 모두 Spring Framework에서 웹 애플리케이션을 개발하기 위한 프레임워크로 공통적으로 @Controller, Reactive Client이 존재한다.
  • 둘 다 Tomcat, Jetty, Undertow와 같은 서버에서 실행할 수 있다.

 

차이점

Spring MVC

  1. 동기적 처리
    • 기본적으로 동기적인 방식으로 HTTP 요청을 처리한다.
    • 요청이 들어오면 해당 요청을 처리하기 위한 스레드를 할당하고, 해당 요청에 대한 응답을 준비할 때까지 기다린다.
  2. 서블릿 기반:
    • 서블릿 API에 의존하여 구현되어 있다.
    • 이는 전통적인 서블릿 기반의 웹 애플리케이션 개발 방식을 따르며, 서블릿 컨테이너를 기반으로 동작한다.
  3. 전통적인 프로그래밍 모델
    • Spring MVC는 전통적인 웹 애플리케이션 개발 모델을 따른다.
    • 컨트롤러, 서비스, DAO 등의 구성 요소를 사용하여 비즈니스 로직을 처리하고, 서블릿 기반의 요청-응답 사이클을 처리한다.
  4. 스레드 모델
    • 각각의 요청에 대해 별도의 스레드를 할당하여 처리하므로, 스레드 당 요청 처리량이 제한될 수 있다.

 

Spring WebFlux

  1. 비동기 및 논블로킹 처리
    • Reactive Streams API를 기반으로 하여 비동기 및 논블로킹 방식으로 HTTP 요청을 처리한다.
    • 이는 요청이 들어오면 해당 요청을 블로킹하지 않고 비동기적으로 처리하며, 응답을 기다리는 동안 다른 요청을 처리할 수 있다.
  2. 비서블릿 기반
    • WebFlux는 서블릿 API에 의존하지 않으며, 서블릿 컨테이너를 기반으로 동작하지 않는다.
    • 대신에 Netty나 Undertow와 같은 비서블릿 기반의 웹 서버를 사용하여 동작한다.
  3. 함수형 및 반응형 프로그래밍 모델
    • WebFlux는 함수형 및 반응형 프로그래밍 모델을 채택하여 비동기적으로 데이터를 처리한다.
    • 이는 Reactive Streams를 기반으로 하여 데이터 스트림을 처리하고 변환할 수 있다.
  4. 적은 수의 쓰레드 사용
    • 적은 수의 쓰레드로 더 많은 요청을 처리할 수 있는 비동기 및 논블로킹 모델을 사용한다.

 

결론

Spring MVC는 전통적인 동기적인 방식으로 웹 애플리케이션을 개발하는 데 사용되는 반면, Spring WebFlux는 비동기 및 논블로킹 방식으로 개발되어 있어 대량의 요청을 효율적으로 처리할 수 있다. 선택은 프로젝트의 요구 사항과 개발자의 선호도에 따라 달라진다.

 

마지막으로 Spring WebFlux에 대해 자세히 정리하자면,

Spring WebFlux는 비동기 및 리액티브 프로그래밍의 개념을 익히고 높은 동시성을 필요로 하는 웹 애플리케이션을 개발하는 데 유용하다.

  1. 대규모 트래픽 처리
    • Non-blocking I/O 모델을 사용하여 단일 쓰레드에서 많은 요청을 처리할 수 있다.
    • 이는 리소스의 효율적인 활용을 가능하게 하며, 대규모 트래픽을 처리하는 데 효과적이다.
  2. 데이터 스트리밍 처리
    • Reactive Streams API를 기반으로 한 WebFlux는 데이터 스트리밍 처리에 적합하다.
    • 이는 데이터를 비동기적으로 처리하고 변환하는 데 유용하며, 실시간 데이터 처리나 이벤트 기반 애플리케이션에서 특히 유용하다.
  3. 다양한 데이터베이스 처리
    • NoSQL 데이터베이스나 비동기적인 데이터베이스 처리가 필요한 경우 Spring WebFlux는 적합하다.
    • 이는 비동기적으로 데이터베이스 호출을 수행하고, 동시성을 높일 수 있다.
  4. 높은 확장성
    • WebFlux는 비동기 및 논블로킹 방식을 사용하여 높은 확장성을 제공한다.
    • 이는 애플리케이션의 부하에 따라 쉽게 확장될 수 있음을 의미한다.

 


참고자료

https://mumomu.tistory.com/176

https://medium.com/@jooomOut/spring-webflux-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC-1902af1c88bf

https://mooonstar.tistory.com/entry/SpringMVC%EB%AA%A8%EB%8D%B8%EA%B3%BC-%EB%B9%84%EA%B5%90%EB%90%98%EB%8A%94-WebFlux%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

https://clairdelunes.tistory.com/158

https://velog.io/@jaehyunup/Srping-Webflux%EC%9D%98-%ED%83%84%EC%83%9D-%EB%B0%B0%EA%B2%BD%EA%B3%BC-MVC%EC%99%80%EC%9D%98-%EC%B0%A8%EC%9D%B4

https://devuna.tistory.com/108

https://pearlluck.tistory.com/726

728x90
반응형