매일 매일, 차곡 차곡 쌓기



완벽하지 않은 것을 두려워 말며,
완성도를 높히는데 집중하자.

Spring/Webflux 17

2. 리액티브 스트림즈

1. 리액티브 스트림즈란? 데이터 스트림을 Non-Blocking이면서 비동기적인 방식으로 처리하기 위한 리액티브 라이브러리의 표준 사양 리액티브 스트림즈를 구현한 구현체로 RxJava, Reactor, Akka Streams, Java 9 Flow API 등이 있다. 2. 리액티브 스트림즈 구성요소 리액티브 스트림즈를 통해 구현해야되는 API 컴포넌트는 Publisher, Subscriber, Subscription, Processtor가 있습니다. Publisher : 데이터를 생성하고 통지(발행, 게시, 방출)하는 역할을 한다. Subscriber : 구독한 Publisher로부터 통지(발행, 게시, 방출)된 데이터를 전달받아서 처리하는 역할을 한다. Subscription : Publisher에 ..

Spring/Webflux 2024.03.07

1. 리액티브 시스템과 리액티브 프로그래밍

1. 리액티브 시스템이란? 리액티브 시스템은 리액티브한 원리와 원칙을 적용하여 개발된 소프트웨어 시스템을 의미합니다. 쉽게 말하면 어떤 이벤트나 상황이 발생했을 때, 그에 따라 적절하게 반응을 잘 하는 시스템을 말합니다. 2. 리액티브 선언문으로 리액티브 시스템 이해하기 리액티브 선언문 : https://www.reactivemanifesto.org/ko 2.1 Means(방법) 리액티브 시스템에서 주요 통신 수단으로 무엇을 사용할 것인지 표현한 것입니다. 그림에 나와 있는 비동기 메세지 기반 통신을 통해서 구성요소들 간의 느슨한 결합, 격리성, 위치 투명성을 보장하빈다. 2.2 Form(형성) 메세지 기반 통신을 통애서 어떠한 형태를 지니는 시스템으로 형성되는지를 나타냅니다. 그림에서는 리액티브 시스템..

Spring/Webflux 2024.03.06

Multicasting a Flux to several Subscribers

publish 구독 시점에 즉시 데이터를 Emit 하지 않고, connect()를 호출하는 시점에 데이터를 emit한다. Hot Sequence로 변환되기 때문에 구독 시점 이후에 emit된 데이터만 전달 받을 수 있다. autoConnect 파라미터로 지정한 숫자만큼의 구독이 발생하는 시점에 Upstream 소스에 자동으로 연결된다. 즉, publish() 처럼 connect()를 직접 호출할 필요가 없다. refCount 파라미터로 지정하는 숫자만큼의 구독이 발생하는 시점에 Upstream 소스에 자동으로 연결된다. 파라미터로 입력한 숫자 만큼의 구독이 취소되거나 Upstream 데이터 emit이 종료되면 연결이 해제된다. replay 구독 시점에 즉시 데이터를 emit 하지 않고, connet()를..

Spring/Webflux 2024.03.05

Splitting a Flux

window Upstream에서 emit되는 첫 번째 데이터부터 maxsize 숫자만큼의 데이터를 포함하는 새로운 Flux로 분할한다. Upstream 에 요청하는 데이터 개수 = Downstream에서 요청한 개수 x maxSize buffer Upstream 에서 emit 되는 데이터가 maxSize 숫자만큼 버퍼에 채워지면 버퍼를 비운다. 버퍼에 비워진 데이터는 List 형태로 한번에 Downstream으로 emit된다. bufferTimeout Upstream에서 emit된 데이터가 버퍼에 채워질 때, maxTime에 도달하면 버퍼를 비운다. maxTime에 도달하기 전에 maxSizxe 만큼의 데이터가 버퍼에 채워지면 maxTime까지 기다리지 않고, 버퍼를 비운다. groupBy groupBy..

Spring/Webflux 2024.03.05

Handling errors

error 파라미터로 지정된 에러로 종료하는 Mono 또는 Flux를 생성합니다. Java의 throw 키워드를 사용해 예외를 의도적으로 throw 하는것 처럼 Error signal을 Downstream으로 전송한다. onErrorReturn 에러가 발생했을 때, onError signal을 Downstream 으로 전파하지 않고, 대체 값을 emit한다. Java에서 try - catch 문의 catch 블록에서 발생한 예외 대신에 대체 값을 리턴하는 방식과 유사하다. onErrorResume 에러가 발생했을 때, onError signal을 Downstream으로 전파하지 않고 대체 Publisher를 리턴한다. 즉, 에러로 인해 중단된 Sequenece를 다시 재개하는 역할을 한다. onError..

Spring/Webflux 2024.03.05

Transforming an existing sequence

map Upstream에서 emit된 데이터를 mapper Function을 사용하여 변환한 후, Downstream으로 emit한다. map Operator 내부에서 에러 발생시, sequence가 종료되지 않고 계속 진행되도록 하는것이 가능하다. flatMap Upstream 에서 emit된 데이터를 inner Publisher를 통해 변환한다. map이 1대1 매핑인 반면 flatMap은 1대 다 매핑이다. 비동기적으로 동작할 경우, emit되는 순서를 보장하지 않는다. concat 파라미터로 입력되는 Publisher Sequence 들을 연결해서 데이터를 순차적으로 emit한다. 먼저 입력된 Publisher Sequence의 emit이 종료될 때까지 나머지 Publisher Sequenece ..

Spring/Webflux 2024.03.04

Filtering a sequence

filter Upstream에서 emite된 데이터 중에서 조건에 일치하는 데이터만 Downstream으로 emit한다. fileter operator의 파라미터로 입력받은 Predicate의 return 값이 true인 데이터만 Downstream으로 emit한다. skip Upstream 에서 emit 된 데이터 중에서 파라미터로 입력 받은 숫자만큼 건너뛴 후, 나머지 데이터를 Downstream으로 emit한다. 파라미터로 입력받은 시간내에 emit된 데이터를 건너뛴 후, 나머지 데이터를 emit한다. take Upstream에서 emit되는 데이터 중 파라미터로 입력받은 숫자만큼만, Downstream 으로 emit한다. Upstream에서 emit되는 데이터 중에서 파라미터로 입력받은 시간내에 ..

Spring/Webflux 2024.03.04

Creating a new sequence

목적에 맞는 Operator 분류 Creating a new sequence : 리액트 시퀀스를 새롭게 생성할때 Transforming an exisiting sequence : 이미 존재하는 시퀀스를 가공할때 Filtering a sequence : 특정 조건에 맞춰 emit 되는 데이터를 필터링 할 때 Peeking into a sequence : 내부에서 보내는 Signal을 엿볼 수 있는 api Handling error : 에러 다루는것 Working with time : 시간 가지고 작업하는 오퍼레이터 Splittting a Flux : Emit 되는 데이터들을 나눌수 있는것 Multicasting a Flux to several Subscribers : 다수의 Subscriber 에게 한번에..

Spring/Webflux 2024.03.04

R2DBC

R2DBC는 언제 사용할까? Reactive Programming을 하는 과정에서 Dtabase 사용이 필요한 경우에 사용한다. 많은 예제로 Proejct Reactor 기반의 Spring Webflux를 사용하며 Database를 사용해야 할 때 R2DBC를 많이 사용한다. 그냥 Stpring 진영에서 많이 사용하는 JPA를 사용하면 안되나? 사용할 수 있다만, 사용하지 않는것이 좋다. JPA는 기본적으로 비동기를 제공하지 않는다. 즉 Webflux 기반에서 JPA를 사용하면 Database 부분에서 block 되고, 그동안 thread가 기다리게 된다. Webflux 환경에서 이러한 block은 전체 시스템에 영향이 갈 수 있다. 따라서 Webflux 기반에서 JPA를 사용할 수 있으나 사용하지 않는..

Spring/Webflux 2024.03.02