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로 개발했더니 아무 문제 없음
리액티브(함수형) 프로그래밍
- 연속적으로 일어나는 이벤트를 다루는 프로그래밍 기법
- UI 이벤트, 비동기적인 I/O 이벤트, 통제 불가능한 이벤트 스트림 처리
- 동시성, 비동기/논블로킹 호출을 다루는데 탁월
- 조합 가능한 비동기 로직을 다루는 함수형 프로그래밍
비동기/논블로킹 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 |