2024. 3. 18. 00:13ㆍSpring Boot
Spring WebFlux는 Reactive Programming을 위한 라이브러리다.
Reactive Programming은 데이터 스트림과 관련된 선언적 프로그래밍을 의미한다.
.Spring WebFlux는 Spring MVC와 비교된다

제일 중요하다고 생각되는 차이점 점은 Non Blocking과 Blocking인데
Spring MVC는 Blocking I/O이고
Spring WebFlux는 Non-Blocking I/O이다
MVC는 요청이 오면 Thread Pool에서 Thread를 가져오거나
새로운 Thread를 만들어 한 개의 Thread가 해당 Request를 끝까지 담당한다.
그런데 만약 해당 Thread가 시간이 오래 걸리는 DB I/O 작업등을 요청 할 경우
MVC는 Blocking이기 때문에 요청이 돌아올 때까지
해당 Thread는 Blocked 되어서 작업이 끝나서 요청이 올 때까지 놀게된다.
그래서 가용 가능한 Thread가 줄어들게 된다.
대규모 요청이 들어 왔을 경우 성능이 급격하게 하락한다
이 문제를 해결하기 위해 나온 것이 Reactive Programming인 WebFlux이다.
WebFlux는 Event-Driven Atchitecture으로 Event Loop를 통해
Non-Blocking I/O을 구현했다.
우선 Event Loop는 Single Thread로 구현되어 Event들을 처리한다
그리고 이런 Event Loop를 코어 개수에 맞춰 여러개 만들어 Event Loop Group을 형성한다
Event Loop가 이벤트를 처리하다 I/O이 발생하며 응답을 기다리는 게 아니라
바로 callback함수를 return하고 Client와의 연결을 유지한채 다른 작업을 먼저 처리한다.
그러다가 응답이 돌아오면 Client에 데이터를 전송한다.
그리서 중간에 Blocked되어 Thread가 쉬는 일이 적고 Context Switching도 적게 일어난다.
그래서 보다 적은 양의 Thread로도 충분한 동시성을 확보할 수 있다.
얼핏 보면 WebFlux가 무조건 좋아보이지만
제대로된 WebFlux를 위해 기존의 MVC구조에서 완전히 갈아 엎어서
End-To-End Reactive하게 구성해서
전체가 Non-Blocking이 되어야 되기 때문에 구조 변경 및 학습 시간이 필요하다
그래서 MVC로 잘 되는 경우 굳이 바꿀 필요는 없다.
'Spring Boot' 카테고리의 다른 글
| 여러 데이터 베이스 사용 시 Transaction (0) | 2024.07.10 |
|---|---|
| R2DBC (0) | 2024.06.17 |
| Spring WebClient (0) | 2024.03.10 |
| Asynchronized (0) | 2024.03.02 |
| Spring Boot Studying (0) | 2024.02.28 |