Spring 5 버전에 새롭게 추가된 기술 스택은 바로 리액티브(Reactive) 스택이다.
그리고 리액티브 스택이 Spring 5에 추가되면서 항상 언급되는 기술이 바로 WebFlux다.
Reactor는 기본적으로 두 가지 타입을 지원한다.
➜ 0개 또는 1개의 데이터만 emit하는Mono
& N(0개 이상)개의 데이터를 emit하는Flux
🔗 Ref. Project Reactor
ᅠ
🔅WebFlux
라는 용어는 Reactor의 타입인Flux
가 Web에서 사용된다고 할 수 있다.
· · ·
The reactive-stack web framework, Spring WebFlux, was added later in version 5.0.
➜ Spring 공식 사이트의 Spring WebFlux에 대한 설명
ReactiveAdapter
와 ReactiveAdapterRegistry
를 통해 사용 가능)Reactive Stack이 Spring WebFlux에 해당 되고, Servlet Stack이 Spring MVC에 해당된다.
Spring WebFlux ➡️ Non-Blocking 통신 방식
Spring MVC ➡️ Blocking 통신 방식
Spring WebFlux ➡️ Reactive Adapter를 사용하여 Reactor 뿐만 아니라 RxJava 등 다른 리액티브 라이브러리를 사용할 수 있는 유연함 제공
Spring MVC ➡️ Servlet API 스펙에 의존적
Spring WebFlux & Spring MVC 모두 보안을 위해 Spring Security 사용
Spring WebFlux ➡️ WebFilter를 사용해 리액티브 특성에 맞게 보안 적용
Spring MVC ➡️ 서블릿 필터 방식으로 보안 적용
Reactive Stack ➡️ 웹 계층(프리젠테이션 계층, API 계층)에서는 Spring WebFlux 사용
Servlet Stack ➡️ Spring MVC 사용
Spring WebFlux ➡️ 완전한 Non-Blocking 통신을 위해 리액티브 스택을 데이터 액세스 계층까지 확장
Spring MVC ➡️ Repository 사용
🪧 R2DBC(Reactive Relation Database Connectivity)
- 관계형 데이터베이스에 Non-Blocking 통신을 적용하기 위한 표준 사양(Specification)
- MySQL, Oracle 등의 데이터베이스 벤더에서는 R2DBC 사양에 맞는 드라이버를 구현해서 공급함
[이미지 출처] Web on Reactive Stack
✔ 공통점
@Controleller
, @RestController
같은 애너테이션의 사용
RestTemplate을 대체할 수 있는 WebClient의 사용
🔗 Ref. WebClient 1
🔗 Ref. WebClient 2
Tomcat, Jetty 등의 서블릿 컨테이너는 서블릿 방식과 리액티브 방식의 통신 모두 지원
애플리케이션을 실행시키면 메인 애플리케이션은 8080 포트에서 실행되며, 외부 애플리케이션은 7070 포트에서 실행된다.
🔅 Spring MVC 샘플 애플리케이션과 Spring WebFlux 샘플 애플리케이션 모두 그림과 같은 구조로 구성된다.
애플리케이션이 두 개이므로 애플리케이션 구현 코드 역시 IntelliJ IDE 상에서 각각의 프로젝트에서 구현된다.
✔ 차이점
☑️ Spring MVC
Thread가 차단되는 Blocking 처리 방식
💡
SpringMvcMainSampleApplication
클래스의 요청 처리 결과를 보면, 각 요청마다 5초의 시간이 걸린 것을 확인할 수 있다. (약 25초)
Thread 모델
➡️ request 당 매번 thread 하나가 매핑되어 처리하는 방식
핸들러 메서드의 리턴타입으로 ResponseEntity
사용
➡️ ResponseEntity<CoffeeResponseDto>
☑️ Spring WebFlux
Thread가 차단되지 않는 Non-Blocking 처리 방식
💡
SpringWebFluxMainSampleApplication
클래스의 요청 처리 결과를 보면, 하나의 쓰레드에서 여러 개의 요청을 한 번에 받아서 거의 동시에 동작해 약 6초의 시간이 걸린 것을 확인할 수 있다.
Thread 모델
➡️ CPU 코어 개수만큼의 적은 쓰레드로 대량의 트래픽을 처리하는 이벤트 루프(Event loop) 방식
핸들러 메서드의 리턴타입으로 Mono
혹은 Flux
사용
➡️ Mono<CoffeeResponseDto>
데이터 엑세스 계층은 Non-Blocking 처리 방식을 지원하는 R2DBC 사용
🔗 Ref. R2dbcEntityTemplate
연관 관계 매핑 지원 X
➡️ 테이블 내에 외래키를 작성하면 됨
모든 로직을 Mono
혹은 Flux
Operator 체인 내에 작성해야 함
➡️ Spring WebFlux 기반 클래스는 Mono
혹은 Flux
로 래핑한 값을 리턴하기 때문
Spring 리액티브 스택의 경우, H2 웹 콘솔을 정상적으로 지원하지 않음
Spring Data R2DBC는 Auto DDL 기능을 제공하지 않음
➡️ 직접 SQL 스크립트 설정을 추가 해야 함