프로젝트 진행 중 스트림 데이터를 처리할 일이 있어서 방법을 찾아봤다. 찾아보니 스트림 데이터는 WebFlux를 의존한 WebClient을 사용해야 하는데, 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를 추가해서 쓰는 걸 잘 지원하고 있고 개발자들도 많이 쓰는 방법인 거 같다.
처음에는 둘을 같이 쓰는 것에 대해 비관적인 의견들을 봤었고, 부정적인 인식을 가지고 있었다. 그러나 해결할 방법이 없어 더 찾아보면서 생각이 바뀌었다. 처음에 부정적인 인식을 가졌던 이유는 이거인 것 같다.
결론은 용도만 잘 구별하면 MVC 위에서 스트림 데이터를 처리할 때 WebFlux에 의존하는 WebClient를 써도 아무 문제 없는 것 같다!!