본문 바로가기

Spring

스프링5 웹플럭스와 테스트 전략 - 이일민 (토비) [ifkakao-2018]

web flux

spring 5.0에 새로 등장한 웹 프레임워크 + 리액티브 스펙

  • spring mvc와 두 개의 웹 기술 트랙
  • 초기 이름은 스프링 웹 리액티브
  • 플럭스-리액티브
Sprint Data Reactive Repository
  • Mongo, Cassandra, Redis, Couchbase

스프링 웹 플럭스 도입 이유

  • 100%(I/O, 데이터 처리) 논블록킹 개발
  • 확장성과 고효율성이 매우 중요
  • 업, 다운 스트리밍과 Back pressure가 필요
  • 고속 서비스 오케스트레이션 개발
  • 유사한 프로그래밍 모델의 경험
  • 유연하게 커스터마이징이 가능한 웹 프레임워크 구성
  • 본격적인 함수형 프로그래밍 모델 사용

스프링 웹 플럭스를 사용하지 않는게 좋은 이유

  • 웹 플럭스가 왜 필요한지 분명하게 모름
  • 블로킹이 서버, 코드, 라이브러리에 존재
    (JPA, JDBC x)
    (ADBA : JDBC 차세대 버전, 논블록킹 가능)
    (R2DBC : 리액티브 방식으로 디비 접근)
  • Spring MVC로 개발했더니 아무 문제 없음

리액티브(함수형) 프로그래밍

  • 연속적으로 일어나는 이벤트를 다루는 프로그래밍 기법
  1. UI 이벤트, 비동기적인 I/O 이벤트, 통제 불가능한 이벤트 스트림 처리
  2. 동시성, 비동기/논블로킹 호출을 다루는데 탁월
  3. 조합 가능한 비동기 로직을 다루는 함수형 프로그래밍

비동기/논블로킹 API 호출 - 가장 단순한 리액티브

  • 동기/블로킹 API 호출 - RestTemplate
    • 장점: 쉽고 간단함
    • 단점: IO 동안 블로킹
      => 시스템 특성에 따라 매우 비효율적이 될 수도 ($로 해결)
  • 비동기/논블로킹 API 호출
    • AsyncRestTemplate (Spring4)
    • Async/Await (Java8+)
    • WebClient (Spring5)
    • 장점 : 확장성이 뛰어나고 높은 처리율과 낮은 레이턴시를 가지는 효율적인 서버 구성이 가능할 수도($ 절약)
    • 단점 : 장점을 얻을 만한 경우가 많지 않음
      => 자칫하면 코드가 복잡하고 이해하기 어려움

비동기/논블로킹 API 호출 - CompletableFuture

  • 노드의 Promise 같은 방식으로 사용
  • 각각 api 호출에 대한 예외 처리를 한번에 가능 (코드 간결)

비동기/논블로킹 API 호출 - Reactor Flux/Mono

CompletableFuture 동작 방식과 유사
Mono : 단일 결과를 받음
Flux : 여러 결과를 받음

CompletableFuture vs Reactor Flux/Mono

공통점
  • 람다식을 사용하는 함수형 스타일
  • 비동기와 비동기 작업의 조합 (componse, flatmap)
  • 비동기와 동기 작업의 적용(apply, map)
  • Exceptional 프로그래밍
  • 작업별 쓰레드 풀 지정 가능
Flux/Mono 방식의 장점
  • 데이터 스트림(Flux) <-> List/Collection
  • 강력한 연산자 제공
  • 지연 실행, 병함, 분산, 시간 제어
  • 유연한 스케줄러
  • ReactiveStreams, Java9+ 표준
  • 다양한 지원 라이브러리, 서비스, 서버

테스트

CountDownLatch를 사용해서 main 쓰레드를 테스트가 끝날때까지 웨이팅 시킨다.
block() + assert 를 사용해서 테스트 가능

=> 이 두가지 방법은 효율적이지 않음

StepVerifier
  • 비동기 논블록킹으로 동작하는 코드 테스트 툴
  • 데이터 스트림의 검증
  • 예외, 완료도 검증
  • 가상시간을 이용해 오랜 시간의 이벤트 테스트

WebClient

리액티브 HTTP API 통합 테스트 - MockWebServer

  • 테스트용 mock 서버를 만들어서 테스트 권장
  • com.squareup.okhttp3:mockwebserver 를 사용해서 mock 서버 생성 가능

웹플러스 API 서비스 테스트

  • WebTestClient
    • 테스트 대상 구성이 가능한 리액티브 HTTP(Mock) 테스트 도구
    • WebClient와 동일한 방식
    • Spring boot - @WebFluxTest

함수형 엔드포인트 테스트 방법

  • bindToRouterFunction
  • @WebFluxTest
    = DispatcherHandler와 RouterFunctionMapping
  • 함수 단위 테스트
    • 본격적인 함수형 스타일 웹 프로그래밍
    • 조합 가능한 마이크로 프레임워크
    • 작고 가벼운 비동기 논블로킹 웹

프레임워크나 라이브러리를 공부할 때 해당 기술의 테스트 코드를 보면서 공부하게되면 만드는 사람의 의도를 파악해서 사용할 수 있다. (참고)

'Spring' 카테고리의 다른 글

Toby's Spring - Chap 6 - AOP  (0) 2020.07.19
Toby's Spring - Chap 4 - Exception  (0) 2020.06.29
Spring - Assert  (0) 2020.06.28
Toby's Spring - Chap 3 - Template/Callback practice  (0) 2020.06.23
Toby's Spring - Chap 3 - Template  (0) 2020.06.23