https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-server-choice

스프링 웹플럭스는 네티, 언더토우, 톰캣, 제티와 서블릿 3.1+ 컨테이너를 지원한다. 모두 리액티브 스트림 API를 채용했다. 스프링 웹플럭스 프로그래밍 모델은 그러한 공통 API에 기반하여 만들었다.

자주 받는 질문: 톰캣이랑 제티를 어떻게 두 가지 스택에서 다 쓸 수 있는거지?

톰캣과 제티의 코어 자체는 논-블러킹이다. 하지만 서블릿 API가 그 위에 블럭킹 퍼사드를 추가했다. 서블릿 3.1 API부터 논-블럭킹 I/O를 제공하는 선택지를 제공하지만 그것을 사용하려면 다른 동기적이고 블럭킹 요소를 피하도록 주의해야 한다. 그러한 이유로 스프링의 리액티브 웹 스택은 리액티브 스트림과 연결해주는 로우 레벨 서블릿 어댑터을 가지고 있으며 서블릿 API를 노출 시키지 않아서 직접 사용할 수 없도록 했다.

스프링 부트 2는 웹플럭스를 사용할 때 네티를 기본으로 사용한다. 왜냐면 네티가 비공기, 논-블럭킹 영역에서 가장 널리 사용되고 있으며 클라이언트과 서버 모두 공유할 수 있는 리소스를 제공한다. 서블릿 3.1 논-블럭킹은 아직 많이 사용되지 않았는데 쓰기 어렵기 떄문이다. Spring WebFlux opens one practical path to adoption. (?)

스프링 부트가 기본 서버를 선택할 때 주로 바로 사용할 수 있는 것(out-of-the-box)을 선택한다. 애플리케이션은 여전히 성능 최적화 되어있고, 완전히 논-블럭킹이고 리액티브 백 프레셔를 채택한 어떤 서버든 선택할 수 있다. 스프링 부트에서 매우 손쉽게 서버를 바꿀 수 있을 것이다.