• Reactive Programing 이란 무엇인가.
• WEB Flux의 탄생
Synchronous Vs Asynchronous 차이점
o Non-Blocking Vs ASynchronous 차이점
o Blocking Vs Synchronous 차이점
Spring MVC를 안쓰고 왜 Spring Webflux를 쓰느냐?
대체 왜? 뭐가 좋은데 이걸 쓰는가 설명해보고
CRUD 예제까지 만들어보도록한다.
Reactive Programing 이란 무엇인가.
1. 어떤 요청이 들어왔을 때 멈춤 없이 응답하기 위해.
2. 리액티브 프로그램이란? 말 그대로 반응하는 프로그램.
[ex) A가 B에게 몇시농? 물어본다.
하지만 B는 시계가 없다 C에게 물어본다.
C가 안방으로가서 시간을 보고 B에게 알려주고 다시 A에게 알려준다.
문제는 A가 응답을 받는데 시간이 굉장히 오래걸린다는 것이다.
4. 우리 사람들은 멀티 스레드가 되기 때문에 낭비되는 시간이 없다
시간을 기다리는 동안 다른 것을 하면 되는데
컴퓨터는 멀티스레드가 안된다.
낭비시간이 발생하게 된다는 것이다.
기다리는 시간동안 A와 B는 C가 응답을 주기 전까지 아무것도 하지 못한다.
5. 때문에 이 낭비 하는 시간을 없애기 위해 만든 것이 리액티브 프로그래밍이다.
WEB Flux의 탄생
클라이언트 쪽에서는 비동기를 하니까 그다지 중요하지 않다
중요한 것은 서버쪽에서 낭비하는 시간을 없애야한다.
기존에는 스레드를 늘리는 방식으로 일을 시켰다 (Time 슬라이싱)
이렇게 하면 문제가 생긴다, 컨택트 스위칭 문제가 생긴다.
가장 빠르게 문제를 해결하는 방법은
하나의 요청을 다 처리하고 나머지를 순차적으로 처리하는 것.
하지만 유저의 경험을 좋게하려면
하나의 요청을 처리하고 나머지를 처리하고 또 나머지를 처리하고
다시 돌아와서 계속 반복한다
타임 슬라이싱을 짧게 하면 유저 경험을 좋게 만들어 줄 수 있다
스레드를 늘리는 방식은 느려진다.
느려지게 하기는 싫고 빠르게 해야한다.
방법은 비동기처리를 해주면 된다.
A(고객)가 몇시인지 B(서버)에게 물어본다.
B(서버)는 C(DB)에게 몇시인지 물어본다.
그러면 C(DB)는 즉각 답변한다 10초 걸린다 B(서버)에게 알린다
B(서버)는 A(고객)에게 10초 걸린데 알려주고 다른 일을 한다.
10초 뒤에 A에게 다시 알려줘야한다.
B(서버)가 10초 뒤에 알려줘야하는 일이 이벤트 루프에 저장한다.
10초 뒤에 A(고객에게) 이벤트 루프에 저장된 것을 알려준다.
동기적인 요청을 받으면 동시에 다른 일을 못하니까.
비동기로 처리해서 일을 하게 하면 된다.
기존 http 프로토콜에서는 A가 요청하고 B가 10초 걸린다 하면
http는 스테이트리스라 응답이 끊긴다.
이 응답을 안끊고 유지시켜 놓으면 응답을 할 수 있다.
지속적인 응답을 유지시키기 위해서 Stream을 사용한다.
멈춤을 현상을 해결하기 위해서 이벤트 루프를 사용하고
지속적인 응답을 유지하려고 Stream을 사용한다.
응답을 유지시키만 하면 되니까
SSE 프로토콜을 사용한다
이 지속적인 스트림을 다른 말로하면 Flux라 한다.
Flux는 흐름이라는 뜻이다.
SSE 기술을 적용시키고 이벤트 루프를 적용하면 완성이 된다.
이 기술을 스프링에 적용시킨 것이 WEB에서 하는 Flux 기술
즉 WEBFlux이다.
응답을 통해 지속적인 응답을 유지 시키면 비동기 처리가 가능.
14. 근데 RDBMS는 비동기 처리를 못한다.
때문에 몽고DB 같은 것을 써야하는데
R2DBC 라이브러리로 비동기 데이터베이스를 구현가능하다.
JPA 레파지토리 이걸 사용하지 못한다.
장점 – MVC 보다 빠르다 (응답속도)
– MVC 보다 가볍다 (낮은 CPU, MEMORY 사용)
단점 – Blocking 코드가 들어가면 MVC 보다 느려진다.
굳이 잘 돌아가는 MVC 어플리케이션이라면 웹플럭스를 도입할 당위성은 없다는 것이
공식문서의 주장이 있을 정도다.
어떻게 사용하면 되나요?
Spring Boot을 사용한다면 Webflux 디펜던시를 추가하고
메소드 리턴 타입만 mono, Flux, CompletableFuture로 적용해준다.
성능 이야기 전에
1. 블로킹(Blocking)과 논블로킹(NoneBlocking)
1) 블로킹 방식
블로킹 방식은 어떤 일을 누군가에게 요청하고, 결과 혹은 응답이 오기를 계속 기다리는 것을 의미합니다.
전통적인 서버 요청 방식이나 일반적인 함수 호출을 예로 들 수 있습니다.
2) 논블로킹 방식
논블로킹 방식은 말 그대로 막히지 않는다. 멈추지 않는다.라고 생각할 수 있습니다.
어떤 일을 누군가에게 요청한 후 결과를 기다리지 않고 자신의 일을 계속 수행해나가는 처리 방식을
의미합니다.
• 요청을 보낸후 응답을 받아야하지만 다음 동작이 이루어지는 방식
• 모든 일이 순차적으로 실행됌.
• 동기에서는 시스템 콜이 끝날때까지 기다리고 결과물을 가져온다.
2) 비동기 방식
• 요청을 즉시 처리하지 않아도 그 대기 시간동안 또 다른 동작이 이루어지는 방식
• 모든 일이 병렬적으로 실행
• Asynchronous에서는 시스템 콜이 완료되지 않아도 나중에 완료가 되면 그때 결과물을 가져온다.
•
Synchronous Vs Asynchronous 차이점
• 가장 큰 차이점은 결과물을 가저오는 시점이 다르다.
Non-Blocking Vs ASynchronous 차이점
System Call이 즉시 Return될 때 데이터의 포함 유무
• Asynchronous은 요청에 처리 완료와 관계없이 응답한다. 이후 운영체제에서 응답할 준비가 되면 응답한다.
• Non-Blocking은 요청에 처리할 수 있으면 바로 응답하고 아니면 Error를 반환한다.
Blocking Vs Synchronous 차이점
Wait Queue 유무
• Blocking은 System Call의 Return을 기다리는 동안 필수로 Wait Queue에 머문다.
• Synchronous은 System Call의 Return을 기다리는 동안 Wait Queue에 머물 수도 아닐 수도 있다.
build.gradle 의존성 추가
웹플럭스 CRUD EXAMPLE
https://github.com/eternityhwan/boardWebflux