Spring Reactive Web Application
-
TestingSpring Reactive Web Application/Project Reactor 2023. 7. 29. 10:00
Reactor에서는 reactor-test라는 테스트 전용 모듈을 통해 여러 가지 유형의 테스트를 지원합니다. 의존성 추가(build.gradle) dependencies { testImplementation 'io.projectreactor:reactor-test' } StepVerifier Reactor에서는 Operator 체인의 다양한 동작 방식을 테스트하기 위해 StepVerifier라는 API를 제공합니다. Signal 이벤트 테스트 StepVerifier를 이용한 가장 기본적인 테스트 방식은 Reactor Sequence에서 발생하는 Signal 이벤트를 테스트 하는 것입니다. import org.junit.jupiter.api.Test; import reactor.core.publisher..
-
DebuggingSpring Reactive Web Application/Project Reactor 2023. 7. 28. 21:00
동기식 또는 명령형 프로그래밍 방식은 Exception이 발생했을 때 스택트레이스(Stacktrace)를 확인하거나 예외 발생이 예상되는 코드에 브레이크포인트(Breakpoint)를 걸어서 디버깅합니다. 반면에 Reactor는 처리되는 작업들이 대부분 비동기적으로 실행되고, Reactor Sequence는 선언형 프로그래밍 방식으로 디버깅이 쉽지 않습니다. Reactor에서의 Debugging 방법 Debug 모드를 활성화 하는 방법(Globally) checkpoint() Operator를 사용하는 방법(Locally) log() Operator를 사용해서 Reactor Sequence에서 발생하는 Signal을 확인하는 방법 Debug Mode를 사용한 Debugging Reactor에서는 디버그 모..
-
ContextSpring Reactive Web Application/Project Reactor 2023. 7. 26. 05:00
Context Context는 일반적으로 어떠한 상황에서 그 상황을 처리하기 위해 필요한 정보를 의미합니다. Reactor API 문서에서는 Context를 다음과 같이 정의합니다. A key/value store that is propagated between components such as operators via the context protocol. 즉, Reactor의 Context는 Operator 같은 Reactor 구성요소 간에 전파되는 key/value 형태의 저장소라고 정의합니다. 여기서의 '전파'는 Downstream에서 Upstream으로 Context가 전파되어 Operator 체인상의 각 Operator가 해당 Context의 정보를 동일하게 이용할 수 있음을 의미합니다. Re..
-
SchedulerSpring Reactive Web Application/Project Reactor 2023. 7. 25. 03:00
Reactor에서 사용되는 Scheduler는 Reactor Sequence에서 사용되는 스레드를 관리해 주는 관리자 역할을 합니다. 일반적으로 Java 프로그래밍에서 멀티스레드를 완벽하게 제어하는 것은 쉬운 일이 아닙니다. 스레드 간의 경쟁 조건(Rece Condition) 등을 신중하게 고려해서 코드를 작성해야 하는데, 이로 인해 코드의 복잡도가 높아지고 결과적으로 예상치 못한 오류가 발생할 가능성이 높습니다. Reactor에서는 Scheduler가 스레드의 제어를 대신해 주기 때문에 이러한 문제를 최소화 할 수 있습니다. Note. 스레드의 개념 CPU의 코어는 물리적인 스레드를 의미하며, 이 물리적인 스레드는 논리적인 코어라고도 부릅니다. 논리적인 스레드는 소프트웨어적으로 생성되는 스레드를 의미합..
-
SinksSpring Reactive Web Application/Project Reactor 2023. 7. 24. 07:00
Processor의 기능을 개선한 Sinks가 Reactor 3.4.0 버전부터 지원되기 시작했습니다. Processor와 관련된 API는 Reactor 3.5.0부터 완전히 제거될 예정입니다. Sinks Sinks는 Publisher와 Subscriber의 기능을 모두 지닌 Processor의 향상된 기능을 제공합니다. Reactive Streams에서 발생하는 signal을 프로그래밍적으로 push할 수 있는 기능을 가지고 있는 Publisher의 일종입니다. Sinks는 Sinks.Many 또는 Sinks.One interface를 사용해서 Thread-Safe하게 signal을 발생시킵니다. Note. Reactor에서 프로그래밍 방식으로 signal을 전송하는 가장 일반적인 방법은 generat..
-
BackpressureSpring Reactive Web Application/Project Reactor 2023. 7. 23. 10:30
Backpressure Backpressure는 우리말로 배압 또는 역압이라고 합니다. 리액티브 프로그래밍에서의 배압, 즉 Backpressure는 Publisher가 끊임없이 emit하는 무수히 많은 데이터를 적절하게 제어하여 데이터 처리에 과부하가 걸리지 않도록 제어하는 것입니다. Note. Publisher가 빠른 속도로 데이터를 끊임없이 emit하게 되면 처리되지 않고 대기 중인 데이터가 지속적으로 쌓이게 되어 오버플로가 발생하거나 최악의 경우에는 시스템이 다운되는 문제가 발생하게 됩니다. Reactor에서의 Backpressure 처리 방법 요청 데이터 개수 제어 Backpressure 전략 사용 요청 데이터 개수 제어 Subscriber가 적절히 처리할 수 있는 수준의 데이터 개수를 Publi..
-
Cold Sequence와 Hot SequenceSpring Reactive Web Application/Project Reactor 2023. 7. 23. 09:00
Cold Sequence Subscriber의 구독 시점이 달라도 구독을 할 때마다 Publisher가 데이터를 emit하는 과정을 처음부터 다시 시작하는 데이터 흐름을 Cold Sequence라고 부릅니다. 그리고 이 Cold Sequence 흐름으로 동작하는 Publisher를 Cold Publisher라고 합니다. import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; import java.util.Arrays; /** * Cold Sequence 예제 */ @Slf4j public class Example7_1 { public static void main(String[] args) throws InterruptedExcepti..
-
Mono와 FluxSpring Reactive Web Application/Project Reactor 2023. 7. 22. 09:00
Mono 0개 또는 1개의 데이터를 emit하는 Publisher 입니다. (Compare with RxJava Maybe) 데이터 emit 과정에서 에러가 발생하면 onError signal을 emit 합니다. Note. 마블 다이어그램(Marble Diagram)이란 비동기적인 데이터 흐름을 시간의 흐름에 따라 시각적으로 표시한 다이어그램입니다. import reactor.core.publisher.Mono; /** * Mono 기본 개념 예제 * - 1개의 데이터를 생성해서 emit한다. */ public class Example6_1 { public static void main(String[] args) { Mono.just("Hello Reactor") .subscribe(System.out:..