전체 글
-
Sequence 필터링 OperatorSpring Reactive Web Application/Project Reactor 2023. 8. 4. 05:00
filter filter() Operator는 Upstream에서 emit된 데이터 중 조건에 일치하는 데이터만 Downstream으로 emit 합니다. 즉, 파라미터로 입력받은 Predicate의 리턴 값이 true인 데이터만 Downstream으로 emit 합니다. import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; /** * filter 예제 */ @Slf4j public class Example14_15 { public static void main(String[] args) { Flux .range(1, 20) .filter(num -> num % 2 != 0) .subscribe(data -> log.info("# onN..
-
Sequence 생성 OperatorSpring Reactive Web Application/Project Reactor 2023. 8. 3. 23:00
justOrEmpty justOrEmpty()는 just()의 확장 Operator로서, just() Operator와 달리, emit할 데이터가 null일 경우 NullPointException이 발생하지 않고 onComplete Signal을 전송합니다. emit할 데이터가 null이 아닐 경우 해당 데이터를 emit하는 Mono를 생성합니다. import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Mono; @Slf4j public class Example14_1 { public static void main(String[] args) { Mono .justOrEmpty(null) .subscribe(data -> {}, error -> {..
-
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..