728x90
Spring Boot Webflux
- 반응형 및 비동기적인 웹 애플리케이션 개발을 지원하는 모듈이다.
- 이 모듈은 Reactive Streams 사양을 기반으로 하여, 비동기적인 이벤트 지향 프로그래밍을 통해 높은 확장성과 성능을 제공한다.
- Webflux를 사용하는 목적은 반응형 프로그래밍을 통해 '높은 처리량'과 '확장성'을 갖는 애플리케이션을 만드는 것을 목표로 한다.
[ 더 알아보기 ]
💡 Webflux는 Spring Framework 5.0부터 지원한다고 들었는데 Spring Boot는 몇 버전이 되어야 하는가?
- Spring Framework 5.0은 Spring Boot 2.0 이상을 요구하므로 Webflux를 사용하는데 Spring Boot 2.0 이상 버전이 최소 요구사항이 됩니다.
Webflux 특징
Webflux는 ‘반응형 프로그래밍(Reactive Programming)’을 구현하기 위해 Reactor라는 라이브러리를 이용한다.
Reactor는 Netty 서버를 통해 비동기식 이벤트 기반의 서버를 환경을 제공하며 이를 이용하여 비동기 방식의 논 블로킹 요청을 통해 이벤트 기반의 반응형 스트림으로 데이터를 주고받는다.
1. 반응형 프로그래밍(Reactive Programming)
- Spring Webflux는 반응형 프로그래밍(Reactive Programming) 방식을 통해 ‘이벤트 기반의 비 동기식 애플리케이션’을 구축할 수 있습니다.
- 이 이벤트는 ‘비 동기적’으로 처리되며 새로운 이벤트가 발생하면 이벤트 스트림이 생성이 되며 스트림을 구독하면 이벤트를 처리할 수 있습니다.
[ 더 알아보기 ]
💡 프로그래밍 패러다임으로 본 명령형 프로그래밍 vs 반응형 프로그래밍
- 명령형 프로그래밍의 경우는 컴퓨터가 수행해야 하는 일을 명령의 목록으로 나열을 하고 이를 순서대로 실행합니다. 반응형 프로그래밍의 경우는 데이터 스트림을 처리하며 이 데이터 스트림이 변경될 때마다 반응하는 것을 의미합니다.
분류 | 명령형 프로그래밍 | 반응형 프로그래밍 |
처리 방식 | 명령어를 순서대로 실행 | 데이터 스트림을 처리하며, 데이터 변화에 반응 |
동기/비동기 | 대부분 동기적 | 대부분 비동기적 |
코드 구성 | 명령형 코드 | 선언형 코드 |
사용 예시 | 계산기, 루프 등 | 이벤트 처리, UI 업데이트 등 |
프로그래밍 종류 | Spring MVC | Webflux |
2. Reactor
- 반응형 프로그래밍(Reactive Programming)을 구현하기 위한 Reactor는 Reactive 라이브러리 중 하나이다.
- Publisher-Subscriber 패턴을 중심으로 동작하며 데이터를 생성하고 가공하고 구독자에게 전달하는 역할을 한다.
- Reactor에서는 Mono와 Flux의 데이터 스트림 유형을 지원한다.
Publisher-Subscriber 패턴: 반응형 스트림(Reactive Stream)
💡 반응형 스트림(Reactive Stream)
- 비 동기적 및 이벤트 기반 응용 프로그램을 위한 ‘스트림 처리 기술’을 의미합니다. 해당 기술의 핵심은 ‘Publisher’가 ‘Subscriber’에게 데이터를 제공하는 것을 의미합니다.
- 이는 Publisher는 데이터를 생성하고 Subscriber는 이를 처리합니다. 이러한 방식으로 스트림을 처리함으로써 데이터를 더 효율적으로 처리할 수 있습니다.
객체 | 설명 |
Publisher : 발행자 | 데이터를 생성하고, Subscriber에게 전송합니다. |
Subscriber : 구독자 | Publisher로부터 데이터를 받아들이고, 소비합니다. |
Subscription : 구독 | Subscriber가 처리할 데이터의 양을 정의합니다. |
3. Netty
- 자바 기반의 네트워크 애플리케이션 프레임워크로 ‘비동기식 이벤트 기반 서버’를 만드는 데 사용된다.
- 높은 성능과 확장성을 갖추고 있으며, 다양한 프로토콜을 지원하고 있어 네트워크 애플리케이션 개발에 매우 유용하다.
💡 Netty와 Tomcat의 비교
특성 | Netty | Tomcat |
아키텍처 | 이벤트-기반 | 요청 당 쓰레드 |
성능 | 비동기 처리로 인한 높은 성능 | 동기 처리로 인한 상대적으로 느린 성능 |
확장성 | 다수의 동시 접속 처리가 가능한 높은 확장성 | 쓰레드 개수 제한으로 확장성 한계 |
프로토콜 지원 | HTTP, WebSocket, TCP 등 다수의 프로토콜 지원 | 주로 HTTP에 특화 |
유연성 | 다양한 애플리케이션에 사용 가능한 높은 유연성 | 웹 애플리케이션에 특화된 제한된 유연성 |
사용 편의성 | 이벤트-기반 아키텍처로 인한 학습 곡선이 높음 | 전통적인 서블릿 기반 아키텍처에 익숙한 개발자에게 사용하기 편리 |
4. Blocking Request / Non-Bloking Request
- 일반적으로 Webflux를 사용하는 경우 Non-Blocking Request를 사용하는 것이 좋다. Blocking Request를 사용하면 스레드가 차단되어 성능이 저하되기 때문
- WebFlux는 Reactive Programming 모델을 위해 설계되었으며, Non-Blocking Request를 사용하면 이러한 모델을 더욱 효과적으로 활용할 수 있다.
💡 Blocking Request (=Synchronous request)
- 기존 Spring MVC에서 사용되던 Blocking Request를 수행하면서 클라이언트에서 요청을 보내면 결과가 반환될 때까지 대기를 하는 것을 의미한다.
5. Multi Event Loop
- Reactor Core에서 지원을 하며 단일 스레드로 동작하는 ‘이벤트 루프를 여러 개 사용’하는 것을 의미한다.
- 이를 통해 블로킹 I/O 작업이 발생하더라도 다른 이벤트 루프를 통해 애플리케이션이 멈추지 않고 계속 동작할 수 있다.
webClient
- WebFlux의 일부인 Webclient는 비동기적인 방식으로 HTTP 요청을 보내고 응답을 받을 수 있는 라이브러리를 의미합니다.
- 다수의 외부 API 호출이나, 다른 서비스들과의 통합 작업에서 유용합니다.
- WebFlux의 WebClient는 비동기적인 방식으로 HTTP 요청을 보내고 응답을 받을 수 있는 라이브러리입니다. 이를 통해 Reactive Streams를 이용하여 높은 성능의 네트워크 통신을 구현할 수 있습니다.
[ 더 알아보기 ]
💡 Spring MVC 환경에서 WebClient를 사용해도 될까?
- Spring MVC는 WebFlux와 달리 블로킹 I/O를 사용하기 때문에, 동기적인 작업을 수행할 때는 WebClient보다 RestTemplate을 사용하는 것이 더 적합합니다. 하지만 비동기적인 작업에서는 WebClient를 사용하는 것이 더욱 효율적입니다.
💡 WebClient, RestTemplate와 같은 HTTP 클라이언트들 외에 다른 것도 있는가?
- OkHttp, Retrofit, Feign와 같은 것들이 있습니다.
💡 RestTemplate와 WebClient 비교
분류 | RestTemplate | WebClient |
I/O 모델 | 블로킹 | 논블로킹 |
동시성 | 낮음 | 높음 |
성능 | 동기식 | 비동기식 |
응답 타입 | ResponseEntity | Mono, Flux |
클라이언트 측 부하 분산 | 지원 안 함 | 지원 |
스트리밍 | 지원 안 함 | 지원 |
'공부 > Spring Boot' 카테고리의 다른 글
@SQLRestriction 어노테이션: 사용법과 장단점 분석 (1) | 2024.11.20 |
---|---|
[Java] Spring Boot - JPA @PrePersist, @PreUpdate (0) | 2024.11.20 |
[Spring Boot] ResponseEntity (0) | 2023.08.16 |