반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Effective Java 3
- Effective Java
- 김영한
- 스프링부트
- 카카오 면접
- 오블완
- 이펙티브 자바
- 스프링
- 이펙티브자바
- 코딩테스트
- 티스토리챌린지
- ElasticSearch
- effectivejava
- 카카오
- 자바스크립트
- 알고리즘정렬
- 스프링핵심원리
- 클린아키텍처
- 이차전지관련주
- kubernetes
- 예제로 배우는 스프링 입문
- 스프링 핵심원리
- Sort
- java
- 자바
- Spring
- JavaScript
- 엘라스틱서치
- k8s
- 알고리즘
Archives
- Today
- Total
Kim-Baek 개발자 이야기
Spring Webflux 란 본문
1. Spring WebFlux란?
Spring WebFlux는 Spring Framework 5에서 도입된 논블로킹(Non-blocking) 및 리액티브(Reactive) 프로그래밍을 지원하는 웹 프레임워크입니다. 기존의 Spring MVC가 서블릿 기반의 동기(Blocking) 모델을 사용한다면, WebFlux는 논블로킹 처리를 통해 더 높은 확장성과 성능을 제공합니다.
주요 특징:
- 논블로킹 I/O: 요청 처리 동안 스레드가 블로킹되지 않습니다.
- 리액티브 스트림: 데이터 스트림을 비동기적으로 처리합니다.
- 함수형 라우팅: 함수형 프로그래밍 방식을 사용한 라우팅 지원.
- 다양한 런타임 지원: Netty, Undertow 등 서블릿 컨테이너가 아닌 서버에서도 실행 가능.
2. Spring MVC와의 차이점
Spring MVC:
- 동기 블로킹 모델: 요청 처리 시마다 하나의 스레드가 할당되어 작업을 수행하고 응답을 반환.
- 서블릿 기반: 서블릿 컨테이너(Tomcat, Jetty 등)에서 동작.
- 적합한 경우: 트래픽이 비교적 낮고 동기 처리가 적합한 애플리케이션.
Spring WebFlux:
- 논블로킹 비동기 모델: 적은 수의 스레드로 많은 요청을 효율적으로 처리.
- 리액티브 스트림 활용: 데이터의 흐름을 제어하고 처리.
- 적합한 경우: 고성능, 높은 동시성을 요구하는 애플리케이션, 마이크로서비스 아키텍처 등.
3. 리액티브 프로그래밍이란?
리액티브 프로그래밍은 데이터의 흐름과 변화를 비동기적으로 처리하는 프로그래밍 패러다임입니다. 이벤트 기반으로 동작하며, 데이터 스트림을 통해 비동기적으로 데이터가 전달될 때마다 처리합니다.
핵심 개념:
- Publisher와 Subscriber: 데이터를 생산하는 주체(Publisher)와 소비하는 주체(Subscriber)로 구분.
- Backpressure: 데이터 소비 속도가 생산 속도보다 느릴 때의 처리를 제어.
- 비동기 처리: 작업이 완료될 때까지 기다리지 않고 다른 작업을 계속 수행.
리액티브 프로그래밍을 구현하기 위해 Reactor와 같은 라이브러리가 사용됩니다.
4. Spring WebFlux의 주요 특징
4.1. 논블로킹 서버 및 클라이언트
- 서버 사이드: Netty, Undertow, Tomcat 등의 논블로킹 서버를 지원.
- 클라이언트 사이드: WebClient를 사용한 논블로킹 HTTP 클라이언트 제공.
4.2. 리액티브 스트림 지원
- Mono: 0 또는 1개의 값을 비동기적으로 처리.
- Flux: 0부터 N개의 값을 비동기적으로 처리.
4.3. 함수형 프로그래밍 스타일
- 함수형 라우팅: 라우트를 선언할 때 람다식을 사용하여 선언적으로 설정.
- 함수형 핸들러: 비즈니스 로직을 함수형으로 작성.
4.4. 자동 구성 및 통합
- Spring Boot와의 뛰어난 통합으로 자동 구성 지원.
- 데이터베이스, 메시징 시스템 등 다양한 기술과 쉽게 통합 가능.
5. 주요 컴포넌트 및 구조
5.1. Router Functions
라우팅 규칙을 설정하는 컴포넌트로, 요청 URL과 HTTP 메서드에 따라 적절한 핸들러 함수로 연결합니다.
@Bean
public RouterFunction<ServerResponse> route(Handler handler) {
return RouterFunctions
.route(RequestPredicates.GET("/hello"), handler::hello);
}
5.2. Handler Functions
비즈니스 로직을 처리하는 함수로, 요청을 받고 응답을 생성합니다.
@Component
public class Handler {
public Mono<ServerResponse> hello(ServerRequest request) {
return ServerResponse.ok().body(BodyInserters.fromValue("Hello, WebFlux!"));
}
}
5.3. WebClient
논블로킹 HTTP 클라이언트로, 외부 API 호출 등을 비동기적으로 수행할 수 있습니다.
WebClient client = WebClient.create("http://localhost:8080");
Mono<String> response = client.get()
.uri("/hello")
.retrieve()
.bodyToMono(String.class);
5.4. 리액티브 데이터 처리
Spring Data와 통합하여 리액티브 데이터 처리를 지원합니다. 예를 들어, MongoDB나 R2DBC와 같은 데이터베이스를 지원.
public interface UserRepository extends ReactiveCrudRepository<User, String> {
}
6. Spring WebFlux의 장점
- 높은 성능과 확장성: 논블로킹 I/O와 효율적인 리소스 사용으로 높은 동시성을 처리할 수 있습니다.
- 리소스 효율성: 적은 수의 스레드로 많은 요청을 처리할 수 있어 서버 리소스를 절약할 수 있습니다.
- 비동기 처리의 쉬운 구현: 리액티브 스트림을 통해 복잡한 비동기 로직을 간결하게 구현할 수 있습니다.
- 모던 웹 애플리케이션 적합: 실시간 데이터 처리, 스트리밍, 마이크로서비스 등에 적합합니다.
7. Spring WebFlux의 사용 사례
- 실시간 애플리케이션: 채팅 애플리케이션, 실시간 대시보드 등.
- 마이크로서비스 아키텍처: 경량화된 서비스 간 통신에 적합.
- API 게이트웨이: 다양한 외부 API 호출을 효율적으로 관리.
- 스트리밍 데이터 처리: 대용량 데이터 스트림을 처리하는 서비스.
- 비동기 작업 처리: 외부 시스템과의 비동기 통신이 필요한 애플리케이션.
반응형
'개발 > Spring' 카테고리의 다른 글
Write-Behind Caching (0) | 2024.11.21 |
---|---|
SLF4J 와 Logback (1) | 2024.11.20 |
Quartz 란? (0) | 2024.11.15 |
JPA N+1 문제 (0) | 2024.11.14 |
Apache Kafka 란? (0) | 2024.11.10 |
Comments