MVC와 WebFlux

프로젝트 진행 중 스트림 데이터를 처리할 일이 있어서 방법을 찾아봤다. 찾아보니 스트림 데이터는 WebFlux를 의존한 WebClient을 사용해야 하는데, MVC와 WebFlux를 함께 사용해도 되는지가 의문이어서 찾아보고 공부를 했다.

처음에는 MVC랑 WebFlux가 서로 상반되는 개념의 프레임워크인데 같이 쓰면 문제가 있지 않을까? 하고 찾아봤는데 여러 문서를 찾아보면서 이해한 결과 스트림 형태의 데이터를 처리할 땐 MVC 위에서 WebFlux를 사용하는 게 맞는 거 같다.

MVC와 WebFlux 비교

일단 MVC는 동기적 프레임워크고 WebFlux는 반응형 스타일의 비동기적 프레임워크인데 WebFlux는 어플리케이션이 완전 반응형일 때(모든 코드가 비동기, 논블로킹일 때) 성능이 MVC보다 훨씬 유리하다. 다만, 블로킹 코드가 하나라도 있으면 성능이 떨어진다고 한다. 이런 이유에서 이미 MVC로 구현한 코드를 WebFlux로 바꿀 필요는 없다. MVC에서 반응형 코드가 필요한 상황이면 WebFlux를 접목해서 쓰면 된다.

공식 문서에도

Adding both spring-boot-starter-web and spring-boot-starter-webflux modules in your application results in Spring Boot auto-configuring Spring MVC, not WebFlux. This behavior has been chosen because many Spring developers add spring-boot-starter-webflux to their Spring MVC application to use the reactive WebClient. You can still enforce your choice by setting the chosen application type to SpringApplication.setWebApplicationType(WebApplicationType.REACTIVE).

MVC, WebFlux 의존성을 둘 다 추가하면 기본적으로 MVC로 동작한다. 많은 Spring 개발자들이 반응형 WebClient를 사용하기 위해 Spring MVC 응용 프로그램에 spring-boot-starter-webflux를 추가하기 때문이다.

라고 나와 있는 걸 보면 스프링 공식에서도 MVC에 WebFlux를 추가해서 쓰는 걸 잘 지원하고 있고 개발자들도 많이 쓰는 방법인 거 같다.

처음에 부정적인 인식이 있었던 이유

처음에는 둘을 같이 쓰는 것에 대해 비관적인 의견들을 봤었고, 부정적인 인식을 가지고 있었다. 그러나 해결할 방법이 없어 더 찾아보면서 생각이 바뀌었다. 처음에 부정적인 인식을 가졌던 이유는 이거인 것 같다.

  1. 기존에 스프링에 RestTemplate이라고 동기적 HTTP 클라이언트가 있었는데 스프링 5.0부터 WebClient가 나왔다. WebClient는 WebFlux에 의존하는 비동기적 HTTP 클라이언트인데 동기적인 작동도 지원을 한다. 그런데 RestTemplate이 나온지 10년이 넘었고 메소드도 직관적이지가 않아서 한번 deprecated 된다는 얘기가 나왔었고, 그러면서 공식에서 WebClient 사용을 권장했다. 그 이후로 개발자들은 동기적 HTTP 클라이언트를 구현할 때도 WebClient를 쓰게 되면서 굳이 WebFlux 의존성을 추가해야 했다. 그래서 좋아하지 않는 사람들이 있었고, 내가 그런 사람들 얘기를 본 거 같다. 이걸 개선하려고 출시한 게 RestClient라고 RestTemplate처럼 동기적인 HTTP 클라이언트인데 WebClient처럼 문법도 유창하고 직관적인 코드로 구현할 수 있어서 기존에 RestTemplate을 대체하던 WebClient를 대체할 수 있다. 동기적으로만 작동하는데도 WebFlux 의존성을 추가하면서까지 WebClient를 썼던 사람들은 RestClient로 갈아타면 되는 거다. 내가 지금 ML 서버와 통신할 때 쓰고 있는 방법이 RestClient이다.
  2. 그리고 당연히 WebFlux랑 MVC를 같은 기능에서 사용하면 코드가 복잡해지고 충돌이 날 수 있어 권장되지 않는 방법이다.

결론

결론은 용도만 잘 구별하면 MVC 위에서 스트림 데이터를 처리할 때 WebFlux에 의존하는 WebClient를 써도 아무 문제 없는 것 같다!!