지금까지의 기존의 스프링에서는 request 와 response 가 명백히 존재했다.
하지만 요즘 같은 시대에는 동시에 여러개의 작업이 이루어지고,
그러면서 나오는 개념이 동기식/ 비동기식, 그리고 블로킹/ 논블로킹의 개념이다.
해당 개념에 대해서는 아래 참고 포스팅을 확인해보도록 하자.
그리고 또한 요즘에는 리액티브 프로그래밍이라 하여
"리액티브(reactive)"란 용어는 I/O 이벤트에 반응하는 네트워크 요소, 마우스 이벤트에 반응하는 UI 컨트롤러 등 변화에 반응하는 것을 중점으로 둔 프로그래밍 모델을 말한다. 그런 의미에서 논 블로킹(non-blocking)은 리액티브다. 이유는 블로킹되지 않고 작업이 완료되거나 데이터가 사용 가능해짐 등과 같은 알림에 반응하기 때문이다.
수많은 요청에 의해 응답을 줘야하는데 기존의 MVC 방식의 아래 그림과 같은 상황에서는 많이 부하가 있을수 밖에 없다.
이 상황을 대비해서 리액티브 프로그래밍인 스프링 웹플럭스가 등장하게 되었다.
먼저 그림으로 보여주면 아래와 같다.
MVC 패턴에서 역시 WAS 를 사용하고 거기엔 톰캣을 주로 사용하곤 했다.
Webflux는 Project Reactor와 Netty하고 관련이 있다. 결론부터 이야기 하면 두가지 매우 중요한 장점이 있다.
- 이벤트기반 아키텍처를 사용해서 자원을 매우 효율적으로 사용할 수 있게 된다. (Context 스위칭을 최소화 해서 CPU를 매우 효율적으로 사용할 수 있다.)
- 이벤트 기반 아키텍처이기 때문에 기존에 동기(sync) 처리되던 것이 비동기(async)처리 될 수 있는데 그 방법이 매우 간단하다.
Project Reactor는 Reactive Stream을 자바에 구현해낸 구현체로 볼 수 있다. 본래는 RxJava라던지 여러가지 형태로 존재해 왔고, 지금은 Reactor가 나타나면서 가장 많이 사용하고 있는 것 같다. (VMware것이고 VMware는 현재 스프링을 만드는 회사다.)
Reactive Stream은 일종의 비동기 프로그래밍의 표준으로 하나(Mono) 혹은 여러개(Flux)의 Element들을 처리할 때, 비동기처리를 매우 간단하게 해주는 것으로 보면 된다. 다만 프로그래밍 모델 자체가 조금 다르긴 하다.
Netty도 비동기 기반 웹서버로 Webflux 프로젝트를 만들게 되면 기본으로 탑재된다.
사용법은 기존 스프링부트 webflux 디펜던시를 추가하고, 메소드의 리턴 타입만 Mono, Flux, CompletableFuture 등으로 바꿔주면 알아서 적용해준다.
기존 MVC 와 비교하면 다음과 같은 벤다이어그램으로 표현할수 있다.
참고 포스팅
https://thenicesj.tistory.com/299
https://thenicesj.tistory.com/159
'IT > Java' 카테고리의 다른 글
Mybatis 3.0 이상 적용하기 (43) | 2022.09.02 |
---|---|
Spring Batch (part 1. 소개) (40) | 2022.08.25 |
Optional 이란? (51) | 2022.08.23 |
@Valid annotation (BindingResult, Error)(유효성 검사) (48) | 2022.08.22 |
querydsl 동적 쿼리 관련 (60) | 2022.08.21 |
댓글