-
Spring WebFlux와 Reactive Programmingspring 2024. 7. 1. 14:12
WebFlux는 Spring 5 에서 도입된 비동기 웹 프레임워크로, Reactive Programming을 기반으로 한다.
Reactivce Programming은 데이터를 비동기적으로 처리하고, 필요할 때 데이터를 가공하며, backpressure 등의 개념을 통해 시스템의 안정성을 높이는 프로그래밍 기법이다.
비동기 처리는 일반적으로 다음과 같은 방식으로 지원된다.
- Non_blolcking I/O
- WebFlux는 Netty나 Servlet 3.1+ container와 같은 논블로킹 서버를 지원한다.
- 이러한 서버 환경 덕분에 스레드가 블로킹 되지 않고 효율적으로 I/O 작업을 처리할 수 있다.
- 비동기 API
- Mono와 Flux는 비동기 API를 제공한다. 예를 들어, 'Mono.fromCallable()'은 Callable을 비동기적으로 실행하고 결과를 Mono로 반환한다.
- 콜백 대신 연산자 사용
- 전통적인 비동기 프로그래밍에서는 콜백을 사용하지만, ReactiveProgramming에서는 연산자를 사용하여 데이터를 처리한다. 예를들어, 'map()', 'flatMap()', 'filter()', 'zip()' 등의 연산자를 사용하여 비동기 데이터 흐름을 제어한다.
- 'onErrorResume()', 'onErrorReturn()' 등의 연산자를 통해 비동기 데이터 흐름에서 발생하는 에러를 처리할 수 있다.
- backpressure
- Flux는 데이터 스트림의 속도를 조절하여 소비자가 생산자의 데이터 생성 속도를 따라가지 못할 때 발생할 수 있는 문제를 해결한다.
즉 Spring WebFlux란, 이러한 이러한 비동기 방식을 쉽게 구현할 수 있도록 도와주는 프레임워크이다.
동기 vs 비동기
위에서 Spring WebFlux에 관한 내용과 사용 이유에 대해서 간략하게 설명했다.
그렇다면 그 이유인 비동기 처리 방식은 어떤 기준으로 선택하고, 어떤 주의점이 있을까?
내 블로그에선 이에 관한 내용을 다룬 적이 없어서 이 기회에 다뤄본다.동기화는 요리사가 순서에 맞게 하나씩 요리하는 방식
전채 요리, 수프, 생선 요리로 이어지는 코스 요리가 존재한다고 가정하자.
동기화 방식은 요리사(스레드)가 전채 요리를 완성할 때 까지 수프, 생선 요리는 대기해야 한다. 전채 요리가 완성되서야 그 다음 요리인 수프의 조리를 시작한다.비동기화는 병렬적으로 요리하는 방식
비동기화 방식에서 요리사는 여러 요리를 병렬적으로 처리할 수 있다.
예를들어 수프를 조리하는 과정 중, 오랜 시간 끓인다거나 하는 잉여 시간이 발생할 수 있다.
그렇다면 그 시간동안 다음 요리인 생선을 손질하는 작업을 함께 처리하여 효율적인 처리를 할 수 있다.의사 선택 기준
동기
- 단순하고 빠른 작업
- 단순 데이터 변환, 메모리 내에서의 간단한 계산
- 상태 관리가 중요한 작업
- 트랜잭션 처리, 순차적인 데이터 처리가 필요한 작업
- 사용자 입력에 즉각적인 응답이 필요한 작업
- 폼 입력 유효성 검사와 같이 바로 피드백을 제공해야 하는 경우
비동기
- I/O 바운드 작업
- HTTP 요청 처리, 파일 읽기/쓰기, 데이터베이스 쿼리
- 긴 시간이 걸리는 작업
- 이미지/비디오 처리, 대규모 데이터 분석
- 병렬 처리가 가능한 작업
- 여러 외부 서비스 호출, 배치 작업
- 사용자 인터페이스 반응성을 높이기 위한 작업
- UI 쓰레드와 분리된 데이터 로깅
- 실시간 데이터 처리
- 채팅 애플리케이션, 실시간 알림 시스템 등
'spring' 카테고리의 다른 글
메시지 큐와 비동기 통신 (0) 2024.07.01 페이징 요청을 받는 두가지 방법 (0) 2024.03.11 application.properties 가 merge 되지 않도록 하는 방법 (0) 2024.02.26 도메인이란 (1) 2023.12.05 Entity, DTO의 개념과 차이 (0) 2023.12.04 - Non_blolcking I/O