본문 바로가기

Reactive Programming

(12)
240815 WebClient 1️⃣ WebClientSpring 5부터 지원하는, Spring WebFlux에서 제공하는 비동기식 HTTP 클라이언트주로 서버 측에서 다른 API나 웹 서비스와 통신하기 위해 사용됩니다.브라우저에서 동작하는 클라이언트 애플리케이션을 직접 개발하기 위한 도구는 아닙니다.서버 측에서 HTTP 요청을 보낼 수 있게 해주는 역할을 합니다.Non-Blocking, Blocking HTTP 요청을 모두 지원Spring MVC의 RestTemplate (Blocking)을 대체할 수 있습니다.WebClient가 필요한 이유WebClient는 서버 사이드 애플리케이션에서 다른 서비스와 통신할 때 유용합니다.마이크로서비스 간 통신:마이크로서비스 아키텍처에서 서비스 간 통신이 필요할 때, WebClient를 사용해 다..
240815 Reactive Streaming 데이터 처리 1️⃣ HTTP 프로토콜 기반 실시간 통신 방법| Long  Polling, SSE, WebSocket① 통신 방법 비교비교 요약특징Long PollingSSEWebSocket통신 방향단방향 (서버 → 클라이언트)단방향 (서버 → 클라이언트)양방향 (서버 ↔ 클라이언트)연결 방식비지속적지속적지속적재연결요청마다 새로운 연결자동 재연결기본 제공 안 됨(클라이언트 구현 필요)서버 부하높음 (반복적인 연결/해제)중간 (지속적 연결)낮음 (지속적 연결, 양방향)브라우저 지원거의 모든 브라우저에서 지원대부분의 최신 브라우저에서 지원대부분의 최신 브라우저에서 지원사용 예시제한적 실시간 통신실시간 알림, 뉴스 피드, 주식 가격 업데이트실시간 게임, 채팅, 금융 거리 시스템 1. Long Polling통신 방식: 클라이..
240809금 Spring Data R2DBC 1️⃣ R2DBC란- Reactive Relational Database Connectivity- 관계형 데이터베이스에 리액티브 프로그래밍 API를 제공하기 위한 개방형 사양- 드라이버 벤더가 구현하고 클라이언트가 사용하기 위한 SPI① Reactive Relational Database Connectivity✔️ Reactive- 리액티브 프로그래밍을 통해 데이터를 비동기적으로 처리한다.- 리액티브 프로그래밍은 데이터 흐름과 변화에 반응하는 방식으로 프로그래밍을 한다. ✔️ Relational Databaes- 전통적인 관계형 데이터베이스- ex) MySQL, PostgreSQL, SQL Server ✔️ Connectivity- 리액티브 프로그래밍과 관계형 데이터베이스 두 가지를 연결하는 API를 제..
240804 Spring MVC vs Spring WebFlux 동시성 모델Spring MVC동기적 요청 처리- 서블릿 기반의 동기적 요청-응답 모델을 따른다.- 클라이언트의 요청을 처리할 때, 서블릿 컨테이너는 요청을 스레드 풀에서 하나의 스레드로 할당한다. 블로킹 I/O- 모든 요청은 블로킹 방식으로 처리된다.- 요청을 처리하는 동안 해당 스레드는 응답이 완료될 때까지 차단된다.Spring WebFlux비동기적 요청 처리- 비동기, 논블로킹 요청-응답 모델을 따른다.- Netty, Undertow와 같은 논블로킹 I/O 런타임 위에서 동작할 수 있다. 논블로킹 I/O- I/O 작업이 완료되기를 기다리지 않고 바로 다음 작업을 수행한다.- 높은 동시성을 처리할 수 있다. 스레드 모델Spring MVC스레드 당 요청- 각 클라이언트 요청은 서블린 컨테이너에서 스레드 ..
240804 Operators :: Sequence 내부 동작 확인 | doOnXXXX() Operator doOnXXXX()- Consumer 또는 Runnable 타입의 함수형 인터페이스를 파라미터로 가진다.- 별도의 리턴 값이 없다.- 디버깅 용도로 많이 사용된다.연산자설명예시 및 용도doFirst스트림이 구독되기 전에 호출된다.구독 전 초기화 작업doOnSubscribeFlux 또는 Mono가 구독될 때 특정 작업을 수행한다.초기화 작업, 로깅, 모니터링doOnRequest구독자가 데이터를 요청할 때 호출된다.요청 로그, 요청량 모니터링doOnNext각 데이터 항목이 emit될 때 호출된다.데이터 처리 로그, 데이터 검증doOnEach각 신호(onNext, onComplete, onError)마다 호출된다.모든 신호 로그, 각 신호 처리doOnComplete스트림..
240804 Operators :: Sequence 변환 | map, flatMap, concat, merge, zip, and, collectList, collectMap 요약map(): 단일 값 변환, 새로운 Publisher 생성하지 않음.flatMap(): 여러 Publisher로 변환 후 병합.concat(): 여러 Publisher를 순차적으로 연결.merge(): 여러 Publisher를 병렬로 실행하여 병합.zip(): 동일한 인덱스의 데이터를 Tuple로 묶어 emit.and(): 여러 Publisher가 완료될 때까지 기다리며 완료 신호만 emit.collectList(): 데이터를 List로 수집하여 단일 Mono로 emit.collectMap(): 데이터를 key-value 쌍으로 변환하여 Map으로 수집, 단일 Mono로 emit. ma..
240720 Testing :: StepVerifier, TestPublisher PublisherProbe 요약- StepVerifier는 Publisher의 전체 흐름을 단계별로 검증할 때 유용하다.- TestPublisher는 임의의 데이터 발행과 비정상 시나리오 테스트에 유용하다.- PublisherProbe는 특정 Publisher가 호출되었는지 검증할 때 사용된다.도구주요 목적주요 기능StepVerifierPublisher의 단계별 검증Publisher의 각 단계를 순서대로 검증TestPublisher임의의 데이터 발행 및 비정상 시나리오 테스트임의의 시점에 데이터, 완료 신호, 에러 신호 발행PublisherProbe내부 Publisher 호출 검증Publisher 신호 기록 및 검증 1️⃣ StepVerifier- Reactor Stream의 동작을 단계별로 검증할 수 있는 도구- Publishe..
240720 Reactor의 Context Reactor에서의 ContextContext 란어떤 상황에서 그 상황을 처리하기 위한 정보 Context의 요소- 상황- 목표- 정보 Reactor에서의 ContextReactor의 구성요소 사이에서 특정 기능을 수행하기 위해 전파되는 key-value 형태의 저장소 Reactor Context의 구성 요소- 상황 : Reactor의 구성요소들의 체인 ( 구성요소 예 : Operator)- 목표 : 특저 기능 수행- 정보 : key-value 형태의 저장소Context 특징- key-value 형태의 저장소- Reactor Component 간에 전파되는 요소- 전파 방향 : Downstream → Upstream- Subscriber와 매핑된다 : 구독이 발생할 때마다 해당 구독과 연결된 하나의 Co..
240714 Reactor의 Schedule 목표Reactor Sequence에서 사용되는 스레드를 관리하는 Scheduler 이해 들어가기 전에Scheduler는 스레드를 관리해 주는 관리자 역할을 수행한다.Scheduler를 이해하려면 스레드를 먼저 이해해야 한다. # Thread란| CPU Core, 물리적 스레드, 논리적 스레드요약 CPU Core물리적 스레드논리적 스레드정의- CPU의 실제 처리 단위- 각 CPU Core가 동시에 처리할 수 있는 실제 작업의 수- 운영체제가 관리하는 소프트웨어 스레드역할- 각 코어는 프로그램 명령어를 읽고 실행한다.- 실제 하드웨어 스레드로 동시에 실행 가능한 작업 수- 실제 프로그램의 실행 단위- 물리적 스레드에 매핑 CPU 및 CPU Core◾️ CPU Core는 CPU 내에서 독립적으로 명령을 실행할..
240714 Backpressure 목표Backpressure 이해목차# 데이터 발행 및 소비 방식# Backpressure 문제# Backpressure 매커니즘# Backpressure 전략   1️⃣ 데이터 요청   2️⃣ 데이터 버퍼링   3️⃣ 코드 설명# 데이터 발행 및 소비 방식  1. 데이터 생성    - 생산자가 데이터를 생성한다.    - 데이터가 생성될 때 버퍼에 저장되지 않고, 직접 소비자에게 전달된다.  2. 데이터 소비    - 소비자가 데이터를 처리한다.    - 소비자가 데이터를 처리하는 동안 생산자는 데이터를 계속 생성한다.  3. 버퍼링 시작    - 소비자가 데이터를 소비하는 속도가 생산자가 데이터를 생성하는 속도보다 느려서 소비자가 데이터를 처리할 수 없는 상황이 발생한다.    - 데이터가 버퍼(JVM..