스프링 Spring
20. Spring WebFlux와 비동기 프로그래밍 (Reactor, Mono, Flux 개념)
안녕하세요! 태마입니다.
Spring 기초 강좌입니다.
강좌의 경우
1. 주제 간단 정리
2. 상세 주제 정리
으로 이루어져 있습니다.
스프링 Spring
포스팅 시작하겠습니다 :)
1. 주제 간단 정리
1. Spring WebFlux란?
✔ Spring WebFlux는 비동기(Non-Blocking) 방식으로 동작하는 Spring의 웹 프레임워크
✔ Servlet 기반의 동기(Spring MVC)와 달리, Reactive Streams를 기반으로 동작
📌 Spring WebFlux의 주요 특징
비동기(Non-Blocking) 동작 | 요청이 들어와도 쓰레드가 대기하지 않고 다른 작업을 수행 가능 |
Reactor 기반(Flux, Mono 지원) | Reactive Streams 표준을 지원하는 Mono, Flux 활용 |
Servlet 대신 Netty 지원 가능 | Tomcat 외에도 Netty, Undertow와 같은 비동기 서버 사용 가능 |
백프레셔(Backpressure) 지원 | 소비자가 데이터를 감당할 수 있도록 데이터 흐름을 조절 가능 |
📌 Spring WebFlux를 사용하면 "비동기 방식으로 높은 처리량을 지원하는 웹 애플리케이션을 개발 가능"
2. 비동기 프로그래밍이 필요한 이유
✔ 동기 방식(Spring MVC)에서는 요청이 들어오면 해당 쓰레드가 응답이 끝날 때까지 대기
✔ 비동기 방식(WebFlux)에서는 요청을 처리하는 동안 쓰레드를 다른 작업에 활용 가능
📌 Spring MVC vs Spring WebFlux 비교
요청 처리 방식 | 동기(Blocking) | 비동기(Non-Blocking) |
멀티쓰레드 사용 | 하나의 요청이 하나의 쓰레드 사용 | 하나의 쓰레드가 여러 요청 처리 가능 |
성능 | 요청이 많아지면 쓰레드 풀 부족 가능 | 적은 쓰레드로 높은 요청 처리 가능 |
적용 사례 | 일반적인 웹 애플리케이션 | 실시간 스트리밍, 데이터 처리량이 많은 서비스 |
📌 Spring WebFlux는 "높은 성능과 비동기 처리를 요구하는 애플리케이션에 적합"
✅ 여기까지 Spring WebFlux의 개념과 비동기 프로그래밍이 필요한 이유를 배웠습니다!
👉 "그렇다면, Spring WebFlux에서 Mono와 Flux는 어떻게 사용할까?"
✅ 2부에서 Spring WebFlux에서 Mono와 Flux를 활용한 비동기 프로그래밍 방법을 배워봅시다!
2. 상세 주제 정리
1. Reactor란?
✔ Reactor는 Spring WebFlux에서 사용하는 비동기 스트림 라이브러리
✔ Mono와 Flux를 제공하여 비동기 데이터를 처리 가능
📌 Reactor의 핵심 개념
Mono | 하나의 값을 처리하는 비동기 데이터 흐름 |
Flux | 여러 개의 값을 처리하는 비동기 데이터 흐름 |
Subscriber | 데이터를 소비하는 구독자 |
Publisher | 데이터를 생성하는 발행자 |
Operator | 데이터를 변환, 필터링하는 함수형 연산자 |
📌 Mono와 Flux를 사용하면 "비동기 데이터 스트림을 쉽게 처리 가능"
2. Mono란? (하나의 값 처리)
✔ Mono는 단 하나의 값을 비동기적으로 반환하는 데이터 흐름
✔ Spring WebFlux에서 비동기적으로 단일 데이터를 처리할 때 사용
📌 Mono 기본 예제
import reactor.core.publisher.Mono;
public class MonoExample {
public static void main(String[] args) {
Mono<String> mono = Mono.just("Hello WebFlux");
mono.subscribe(System.out::println); // Hello WebFlux 출력
}
}
✔ Mono는 단일 데이터(Hello WebFlux)를 비동기적으로 처리
📌 Mono에서 데이터 변환
Mono.just("Spring WebFlux")
.map(String::toUpperCase)
.subscribe(System.out::println); // SPRING WEBFLUX 출력
✔ Mono의 map() 연산자를 활용하여 데이터를 변환 가능
📌 Mono의 주요 메서드
Mono.just(value) | 하나의 값을 반환 |
Mono.empty() | 빈 값을 반환 |
Mono.error(exception) | 에러를 반환 |
Mono.map(fn) | 데이터를 변환 |
Mono.flatMap(fn) | 비동기 연산을 적용 |
📌 Mono는 "비동기 방식으로 단일 데이터를 처리할 때 유용"
3. Flux란? (여러 개의 값 처리)
✔ Flux는 여러 개의 값을 비동기적으로 반환하는 데이터 흐름
✔ Spring WebFlux에서 스트리밍 데이터나 여러 개의 데이터를 비동기적으로 처리할 때 사용
📌 Flux 기본 예제
import reactor.core.publisher.Flux;
public class FluxExample {
public static void main(String[] args) {
Flux<String> flux = Flux.just("Spring", "WebFlux", "Reactor");
flux.subscribe(System.out::println);
// Spring
// WebFlux
// Reactor
}
}
✔ Flux는 여러 개의 데이터를 순차적으로 비동기 처리
📌 Flux에서 데이터 필터링
Flux.just("Spring", "WebFlux", "Reactor", "Mono")
.filter(name -> name.startsWith("W"))
.subscribe(System.out::println); // WebFlux 출력
✔ Flux의 filter() 연산자를 활용하여 특정 데이터만 선택 가능
📌 Flux의 주요 메서드
Flux.just(values...) | 여러 개의 값을 반환 |
Flux.fromIterable(list) | 리스트 데이터를 Flux로 변환 |
Flux.range(start, count) | 특정 범위의 숫자를 생성 |
Flux.map(fn) | 데이터를 변환 |
Flux.flatMap(fn) | 비동기 연산을 적용 |
📌 Flux는 "여러 개의 데이터를 비동기적으로 처리할 때 유용"
4. Spring WebFlux에서 비동기 REST API 구현
✔ Spring WebFlux를 사용하여 비동기 REST API를 개발 가능
📌 WebFlux Controller – Mono를 활용한 API 예제
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;
@RestController
@RequestMapping("/webflux")
public class WebFluxController {
@GetMapping("/mono")
public Mono<String> getMono() {
return Mono.just("Hello, WebFlux!");
}
}
✔ 비동기 방식으로 단일 값을 반환하는 Mono API 구현
📌 WebFlux Controller – Flux를 활용한 API 예제
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import java.time.Duration;
@RestController
@RequestMapping("/webflux")
public class WebFluxController {
@GetMapping("/flux")
public Flux<String> getFlux() {
return Flux.just("Spring", "WebFlux", "Reactor")
.delayElements(Duration.ofSeconds(1)); // 1초 간격으로 응답
}
}
✔ 비동기 방식으로 여러 개의 데이터를 순차적으로 반환하는 Flux API 구현
📌 Spring WebFlux를 사용하면 "비동기 REST API를 손쉽게 개발 가능"
✅ 여기까지 Spring WebFlux와 비동기 프로그래밍을 배웠습니다!
👉 "그렇다면, Spring Boot에서 웹소켓(WebSocket)과 실시간 데이터 처리는 어떻게 할까?"
✅ 다음 회차에서 Spring Boot에서 웹소켓(WebSocket)과 실시간 데이터 처리를 배워봅시다!
'IT Developer > Spring' 카테고리의 다른 글
Spring 기초 <23. Spring Boot에서 Multi-Tenancy 아키텍처 구현> (0) | 2025.04.09 |
---|---|
Spring 기초 <22. Spring Security에서 RBAC(Role-Based Access Control) 적용> (1) | 2025.04.08 |
Spring 기초 <21. Spring Boot에서 웹소켓(WebSocket)과 실시간 데이터 처리> (1) | 2025.04.07 |
Spring 기초 <19. Spring Boot에서 API Gateway 및 Rate Limiting 설정 (Rate Limiter)> (0) | 2025.04.05 |
Spring 기초 <18. OAuth2.0 인증 및 소셜 로그인(Google, Facebook, GitHub) 적용> (0) | 2025.04.04 |
Spring 기초 <17. Spring Boot에서 JWT(Json Web Token) 인증 구현> (0) | 2025.04.03 |
Spring 기초 <16. Spring Security 기본 개념 및 인증 방식 (JWT, OAuth2, Session 비교)> (0) | 2025.04.02 |
Spring 기초 <15. Spring Batch – 대용량 데이터 처리 및 배치 작업 구현> (0) | 2025.04.01 |