-
[Spring Webflux] #2 내가 스프링 웹플럭스를 공부한 방법개발 2024. 4. 10. 00:32
작년 9월, 자바의 새로운 LTS 버전인 자바 21가 출시 되면서, 함께 정식 릴리즈 된 가상 스레드가 웹플럭스를 대체할 수 있을 것인지가 주변 개발자들과의 이야기에서 항상 화두에 올랐다.
반년이 지났지만 아직 시기 상조인 것 같다. 스프링의 큰 장점인 거대 자바 생태계가 온전히 가상 스레드를 지원 못하는 탓일까 싶다.
특히 Spring Data JPA가 디폴트로 사용하는 커넥션 풀 라이브러리 HikariCP가 아직 가상 스레드를 지원하지 않는다.
(관련 PR: https://github.com/brettwooldridge/HikariCP/pull/2055)
그리고 식품 e커머스로 꽤 인지도 있는 모 회사의 어느 개발팀에서도 가상 스레드 하나보고 자바 21로 전환을 시도했지만, 여러 한계로 다시 롤백했다는 이야기를 들었다.
결국 이런 저런 이유들로 아직은 웹플럭스가 좀 더 유효하지 않을까...? 라고 생각한다.
사실 BackPressure처럼 데이터 속도를 조절하는 매커니즘이 꽤나 유용하게 작용하는 부분도 있다.
서론이 길었는데, 사실 요즘 주변 스프링 개발자들이 웹플럭스 공부 어떻게 했냐고 물어 보길래,,, 나도 다시 한번 정리해봤다.
Reactor 튜토리얼
만약 Kotlin의 코루틴으로 어플리케이션을 개발한다 해도 Spring Webflux는 기본적으로 Reactor 라이브러리로 구현 되있기에 최소한 Reactor로 작성된 코드는 이해할 줄 알아야 한다고 생각한다.
나는 공식 튜토리얼을 통해 감을 잡는데 큰 도움이 되었다.
(공식 Hands-on: https://tech.io/playgrounds/929/reactive-programming-with-reactor-3/Intro)
반드시 알아야 할 핵심적인 부분들과 테스팅 방법 등 직접 코드를 작성하면서 배울 수 있는 부분이 좋았다.
튜토리얼을 한 내용을 내 레포지토리에 정리해두었다.
https://github.com/nsce9806q/reactor-tutorial
마블 다이어그램
위 튜토리얼에서는 극히 일부 주요 연산자들만 다룬다.
이게 Flux가 제공하는 연산자들의 목록이다. 많기도 하고 안그래도 어려운 이 많은 연산자들의 reactive한 동작을 Javadoc에서 아래와 같은 마블 다이어그램으로 연산자마다의 동작 매커니즘을 그나마 쉽게 이해 할 수 있었다.
근데 이 그림 보고 이해하려면 마블 다이어그램 보는 법을 공부해야한다.
다행히 공식 가이드에 잘 나와있다.
https://projectreactor.io/docs/core/release/reference/#howtoReadMarbles
Reactor 3 Reference Guide
10:45:20.200 [main] INFO reactor.Flux.Range.1 - | onSubscribe([Synchronous Fuseable] FluxRange.RangeSubscription) (1) 10:45:20.205 [main] INFO reactor.Flux.Range.1 - | request(3) (2) 10:45:20.205 [main] INFO reactor.Flux.Range.1 - | onNext(1) (3) 10:45:20.
projectreactor.io
사실 마블 다이어그램도 저 가이드 보면서 이해하다 보면 쉽게 감을 잡을 수 있다.
나는 Reactor에 어떤 연산자가 대략 어떤 상황에 필요한지 정도는 알 수 있도록 훑어보고, 개발에서 동작을 완전히 이해 하지 못한 연산자를 쓰게 된다면 그때 마블 다이어그램을 보면서 확인 하는 편이다. (하나 하나 완전히 외우기엔 너무 많다...)
연산자들은 기회가 되면 정리 해봐야지...
마치며
나는 실무에서 Gateway (Spring Cloud Gateway)나 검색 시스템과 같은 요청이 많고 I/O 작업이 많은 호출이 많은 어플리케이션 개발에 Webflux를 유용하게 쓰고 있다.
웹플럭스는 분명 장점도 있지만, 디버깅이 불편해 트러블 슈팅도 어렵고, AspectJ같은 AOP도 제대로 동작하지 않고, 작성한 코드가 모두 non-blocking한지 생각해야 하는 부분이 정말 스트레스다. 무엇보다 러닝커브가 높다는 것이 너무 큰 단점 인거 같다. 스프링 공식 문서에서 꼭 정말 필요한게 아니라면 Webflux말고 WebMVC를 쓰라고 여러번 이야기하는 이유를 이제는 통감한다...
그럼에도 Reactive는 충분히 매력적이고 재밌?기도 하다 ^~^; 열심히 해야지.
'개발' 카테고리의 다른 글
[Spring Webflux] #4 스프링 웹플럭스의 코틀린 코루틴 지원 내부 구현 뜯어보기 (0) 2024.07.29 [Spring Webflux] #3 스프링 웹플럭스에서 AOP 제대로 사용하기 (1) 2024.04.11 Docker로 Elasticsearch + Kibana 개발환경 구성하기 (2) 2023.11.24 [Spring Webflux] #1 Reactive Streams 이해하기 (0) 2023.02.25 [Spring Webflux] #0 Webflux 기본 개념 (2) 2023.02.22