[Section 4] Spring WebFlux

Kim·2022년 12월 1일
0

Boot Camp

목록 보기
59/64

Spring WebFlux

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에 대한 설명

  • Spring WebFlux는 Spring 5부터 지원하는 리액티브 웹 애플리케이션을 위한 웹 프레임워크
  • Spring WebFlux 프레임워크를 사용해서 리액티브한 웹 애플리케이션을 구현할 수 있음
  • WebFlux는 리액티브 스트림즈(Reactive Streams)의 사양인 인터페이스를 기반으로 동작
    • 리액티브 스트림즈를 구현한 구현체라면 대부분 Reactor 대신 사용 가능
      (Reactor 이외의 리액티브 라이브러리는 ReactiveAdapterReactiveAdapterRegistry를 통해 사용 가능)

Spring WebFlux 애플리케이션 vs Spring MVC 애플리케이션

✅ 기술 스택 비교

Reactive Stack이 Spring WebFlux에 해당 되고, Servlet Stack이 Spring MVC에 해당된다.

  1. Spring WebFlux ➡️ Non-Blocking 통신 방식
    Spring MVC ➡️ Blocking 통신 방식

  2. Spring WebFlux ➡️ Reactive Adapter를 사용하여 Reactor 뿐만 아니라 RxJava 등 다른 리액티브 라이브러리를 사용할 수 있는 유연함 제공
    Spring MVC ➡️ Servlet API 스펙에 의존적

  3. Spring WebFlux & Spring MVC 모두 보안을 위해 Spring Security 사용
    Spring WebFlux ➡️ WebFilter를 사용해 리액티브 특성에 맞게 보안 적용
    Spring MVC ➡️ 서블릿 필터 방식으로 보안 적용

  4. Reactive Stack ➡️ 웹 계층(프리젠테이션 계층, API 계층)에서는 Spring WebFlux 사용
    Servlet Stack ➡️ Spring MVC 사용

  5. 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 등의 서블릿 컨테이너는 서블릿 방식과 리액티브 방식의 통신 모두 지원

✅ 샘플 코드로 보는 Spring MVC와 Spring WebFlux

애플리케이션을 실행시키면 메인 애플리케이션은 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 스크립트 설정을 추가 해야 함

0개의 댓글