티스토리 뷰
스프링웹플럭스?
스프링웹플럭스란 Project Reactor의 웹의 스트리밍 처리를 한다. SpringBoot2(Spring5) 부터 사용가능 하며 Reactive Stack, Servlet Stack 둘중 하나를 선택해서 사용해야 한다.
Spring MVC vs WebFlux
MVC 에서 WebFlux 로 전환하고자 하면 다음을 고려해 보자
1. 이미 잘 동작하고 있는 MVC 프로젝트는 무리 해서 바꿀 필요는 없다. 작성, 소스이해, 디버깅이 비동기 방식보다 이해하기 쉽고, 관련 library 도 많다.
2. 하지만, 논블록킹 웹 스택을 알아보고 있다면, Spring WebFlux 다른 웹스택을 실행환경을 제공하면서도, 다양한 서버, 리액티브 라이브러리를 제공한다.
3. Java8, kotlin 로 개발할 수 있는 경량의 함수형 웹 프레임 워크를 찾고 있다면, Spring WebFlux 을 함수형 엔드포인트를 활용 하면 된다. 소규모 프로젝트나, 마이크로서비스에 효과 적으로 적용 가능 하다.
4. MSA 에서는 MVC로 만든 웹어플리케이션, WebFlux 컨트롤로나 함수형 엔드포인트를 사용한 엔드포인트에 복합적으로 조합이 가능하다. 두 프레임워크 모두 어노테이션 기반 프로그래밍이 가능하기 떄문에 선택 적으로 사용 가능 하다.
5. 웹어플리케이션이 블로킹 방식을 API(JPA, JDBC)를 사용하고 있다면 MVC 를 활용하는 것이 효과 적이다. 리액터나 RxJava 로도 쓰레드 블록킹 API를 호출 할 수 있지만 이렇게 되면은 논블록킹 웹 스택은 거의 활용 못한다.
6. 스프링 MVC 어플리케이션에서 외부 서비스를 많이 호출하고 있다면, 리액티브 webclient 를 활용해서 성능 차이가 있나 살펴 보자. 호출 부가 많으면 더 효과 적으로 작동할 것이다.
7. 기존에 MVC 어플리케이션을 운영하던 조직은 WebFlux 로 전환시 러닝커브가 높기 때문에, 한번에 전환하지 말고 WebClient 적용해서 변화가 있는지 확인해 보는 것이 좋을 것같다.
WebClient ?
Spring WebClient는 웹으로 API를 호출하기 위해 사용되는 Http Client 모듈 중 하나이며, Spring WebClient가 필요한 이유는
요청자와 제공자 사이의 통신을 좀 더 효율적인 Non-Blocking방식으로 하기 위해서이다.
WebClient 동작을 이해하기 위해서 RestTamplate 동작 원리를 먼저 이해 해야 한다.
RestTemplate은 Multi-Thread와 Blocking방식을 사용한다.
위와 같이 동작하게 되면은 하나의 요청에 하나의 Thread 가 할당 되게 되며, 요청이 많아져서 Thread가 꽉차게 되면은 요청은 Queue 에서 대기 하게 된다. 네트워킹이나 DB와의 통신에서 여러스레드가 생성되면 서비스 퍼포먼스가 현저하게 떨어진다.
반면에
Spring WebClient는 Single Thread와 Non-Blocking방식을 사용한다.
Spring WebClient의 경우 Event Loop 가 Client 에 Request에 대해서 결과를 전송하지 않고 계속 job 을 처리하다. CallBack 이 오며는 결과를 Client 에게 응답을 준다. 이런 동작 특성 때문에 Clients 입장에서는 서비스가 block 되지 않게 된다. 이런 동작 때문에 반응성, 탄력성, 가용성, 비동기성을 보장한다.
성능 비교를 하면 더큰 차이를 볼 수 있다.
접속 유저가 많아 질수록 엄청난 성능 차이를 보이며, Spring커뮤니티에서는 RestTemplate을 Depreciated 시키고 WebClient를 사용할것을 강력히 권고하고 있다고 한다.
다음 장에서는 WebClinent 를 실습해 보도록 하겠다.
참고
https://hyunsoori.tistory.com/3
https://godekdls.github.io/Reactive%20Spring/springwebflux/
https://happycloud-lee.tistory.com/220
- Total
- Today
- Yesterday
- MSA
- 퀜트백
- 켄트 백
- MQ
- TDD
- fastapi
- EC2
- kafka
- AWS
- 분산처리
- Python #FastAPI
- data mining
- 테스트 주도 개발
- GateWayApi
- 테스트
- data crawling
- 웹서비스
- Python
- 웹개발
- mongodb
- nodejs
- SpringBoot
- 테스트주도개발
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |