목차
1. Webflux 란
Webflux 란 Spring 5에서 새롭게 추가된 모듈이며, 클라이언트와 서버에서 Reactive 한 개발을 할 수 있도록 도와준다.
1.1. Spring MVC (전통적 웹 방식)
- Spring MVC 는 Servlet 기반으로 만들어졌고, Sync + Blocking 방식으로 동작한다.
- 하나의 요청을 처리할 때 요청당 1개의 스레드(Thread)를 사용하며, Response 를 기다리며 Thread 를 지연시킨다.
- 물론 Spring MVC 모델을 사용해도, 서버 자원량을 늘려서 Multi Thread 를 사용하면 block 되지 않고 많은 요청을 처리 할 수 있지만 스레드(Thread) 간의 Context Swith 발생 시 비용이 생겨 비효율적이다.
- 요청에 따라 무한정 스레드를 생성할 수 없기 때문에 스레드풀(Thread Pool) 을 사용해 스레드를 재사용한다.
- Tomcat 의 스레드풀(Thread Pool)에서 사용할 최대 스레드 개수 기본값은 200 개 이다.
1.2. Spring Webflux (리액티브 프로그래밍)
- Spring Webflux 는 요청이나 응답을 처리하는 IO 를 Async + Non-Blocking 방식으로 수행하여 callback 을 통하여 작업이 진행되기 때문에 Blocking 이나 Polling 방식을 사용하지 않는다.
- 더 적은 스레드(Thread) 로 같은 일을 할 수 있기 때문에 Context Switching 에 따른 비용이 훨씬 적다.
- 즉 적은 서버 자원으로 더 많은 요청을 처리할 수 있기 때문에 효율적이다.
1.3. Event Loop
- 이벤트기반 아키텍처를 사용해서 자원을 매우 효율적으로 사용할 수 있게 된다. (Context 스위칭을 최소화 해서 CPU를 매우 효율적으로 사용할 수 있다.)
- 네티 (Netty) 의 주요 개념은 EventLoop라고 하는 쓰레드풀을 가지고 있는 것이고, 이 쓰레드풀은 보통 코어 수만큼 만들어진다. (설정에서 변경 가능)
- 모든 요청들은 이벤트로 처리되기 시작하고 이벤트 핸들러(Event Handler) 에 등록이 된다. 요청 후 응답이 없는 경우에는 이벤트 핸들러에 등록만 되고 어떤 쓰레드도 점유하지 않을 수 있다.
- 다만 , 이벤트 루프가 실행되는 동안 매우 느린작업이 실행되면 전체 이벤트 루프가 느려지는 Reactor MeltDown 이 발생할 수 있으므로 Blocking 로직을 최소화하는 프로그래밍이 필요하다.
다음 포스팅에서는 Spring Webflux CRUD 코드를 소개한다.
참고
'Spring , JPA' 카테고리의 다른 글
Spring Boot Logging (log4j, logback, log4j2) (0) | 2023.07.09 |
---|---|
Spring Boot , Java Application Graceful Shutdown (0) | 2023.03.13 |
[spring] Spring Webflux CRUD (0) | 2023.01.16 |
[kafka] kafka Install (0) | 2023.01.09 |
Webflux with MDC (0) | 2023.01.04 |