예시) A가 저녁 뭐냐고 물었을 때 대답을 얻기까지 과정은 아래의 프로세스에 따라서 진행이 된다. 하지만 두가지 문제점이 있다.
문제점을 해결할 수 있는 게 Reactive programming(반응형 프로그래밍)이다.
Reactive programming(반응형 프로그래밍)이란? 요청이 있을 때 멍때리지 않고 응답하는 방식
client, server, db 라고 생각하고 흐름 이해해보자
만약 db에서 10초 걸린다고 했을 때 server가 그걸 기다리면서 멍때린다면 어떤 문제가 생길까?
A의 요청을 해결하기 위해 계속 멍 때리기 때문에 다른 클라이언트의 요청을 받지 못한다.
그래서 기존엔 이러한 문제 때문에 Thread 방식을 사용했다.
Time slicing 방법으로 해야할 일을 쪼개서 진행했다. 하지만 이러한 경우에 context switching 문제가 생긴다.
Thread 방식으로 처리해도 느리면 어떻게 처리할까? 바~~로 비동기처리
server가 db에 요청 보냈을 때 10초 걸린다고 바로 응답을 준다. server도 client한테 바로 응답을 준다. 그렇다면 server는 할 일이 없어지기 때문에 다른 요청 받을 수 있다. 그렇기에 비동기처리가 가능해진다.
단, A가 요청한 이벤트를 기억해야 하는데, 이것을 이벤트 루프라고 부른다.
이렇게 이벤트 루프 덕분에 서버는 멍 때리지 않고 여러가지 요청을 동시에 받고 기억할 수 있어서 비동기처리가 가능해진다.
HTTP 프로토콜 방식은 무상태이기 때문에 client가 요청을 보내고 server가 응답을 한 번 보내면 그 선이 끊긴다. 그러면 이벤트 루프에서 기억하던 응답을 다시 보낼 수 없게 된다.
그래서 응답을 안끊고 계속 유지시켜야한다. 응답을 stream으로 유지시키는 방식을 SSE 프로토콜 방식이라고 한다.
아래 그림의 왼쪽처럼 요청 있고 응답 유지하는 것은 웹소켓방식
오른쪽처럼 요청 필요없어서 끊고 응답만 유지시키는 것이 SSE(Server Send Event) 프로토콜 방식
4번 째 이미지에서 봤듯이 Mono와 Flux에 대해 알아보다 간단하게 말하자면
Mono 는 0~1개 응답을 해주고 Flux 는 1~N개의 대답을 해준다는 큰 차이만 알고 가면 될 거 같다.