전체 글
-
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:..
-
Reactor 개요Spring Reactive Web Application/Project Reactor 2023. 7. 22. 06:00
Reactor Reactor는 Spring Framework 팀의 주도하에 개발된 리액티브 스트림즈의 구현체로서 Spring Framework 5 버전부터 리액티브 스택에 포함되어 Spring WebFlux 기반의 리액티브 애플리케이션을 제작하기 위한 핵심 역할을 담당합니다. 리액티브 스트림즈의 구현체인 Reactor는 리액티브 프로그래밍을 위한 라이브러리라고 정의할 수 있습니다. 따라서 Reactor Core 라이브러리는 Spring WebFlux 프레임워크에 라이브러리로 포함되어 있습니다. Reactor 특징 Reactive Streams: Reactor는 리액티브 스트림즈 사양을 구현한 리액티브 라이브러리입니다. Non-Blocking Java's functional API: Reactor에서 Pu..
-
Blocking I/O와 Non-Blocking I/OSpring Reactive Web Application/Reactive Programming 2023. 7. 22. 05:00
웹 애플리케이션에서 I/O는 File I/O, DB I/O, 네트워크 I/O 등이 있습니다. Blocking I/O I/O 작업이 진행되는 동안 요청 스레드가 자신의 작업을 중단한 채, I/O 작업이 끝날 때까지 대기하는 것을 의미합니다. Blocking I/O 방식의 문제점을 보완하기 위해 멀티스레딩 기법으로 추가 스레드를 할당하여 차단된 시간을 효율적으로 사용할 수는 있습니다. 멀티스레딩 기법의 문제점 컨텍스트 스위칭(Context Switching)으로 인한 스레드 전환 비용이 발생합니다. Note. 컨텍스트 스위칭(Context Switching) 실행되고 있는 프로세스 정보는 CPU의 레지스터에 저장됩니다. 프로세스들이 번갈아 가며 실행되는 과정에서 PCB(Process Control Block..
-
리액티브 스트림즈(Reactive Streams)Spring Reactive Web Application/Reactive Programming 2023. 7. 21. 05:00
리액티브 스트림즈(Reactive Streams) 데이터 스트림을 Non-Blocking이면서 비동기적인 방식으로 처리하기 위한 리액티브 라이브러리의 표준 사양입니다. 리액티브 스트림즈를 구현한 구현체로 RxJava, Reactor, Akka Streams, Java 9 Flow API 등이 있습니다. 리액티브 스트림즈 구성요소 Publisher: 데이터를 생성하고 통지(발행, 게시, 방출)하는 역할을 합니다. Subscriber: 구독한 Publisher로부터 통지(발행, 게시, 방출)된 데이터를 전달받아서 처리하는 역할을 합니다. Subscription: Publisher에 요청할 데이터의 개수를 지정하고, 데이터의 구독을 취소하는 역할을 합니다. Processor: Publisher와 Subscri..
-
리액티브 시스템과 리액티브 프로그래밍Spring Reactive Web Application/Reactive Programming 2023. 7. 20. 07:00
리액티브 시스템(Reactive System) 리액티브 시스템이란 반응을 잘하는 시스템으로 클라이언트의 요청에 즉각적으로 응답함으로써 지연 시간을 최소화합니다. 리액티브 선언문으로 리액티브 시스템 이해하기 리액티브 선언문: https://www.reactivemanifesto.org/ MEANS: 비동기 메시지 기반의 통신을 통해 구성요소들 간 느슨한 결합, 격리성, 위치 투명성을 보장합니다. FORM: 비동기 메시지 통신 기반하에 탄력성과 회복성을 가지는 시스템이어야 합니다. Elastic(탄력성): 시스템으로 유입되는 입력이 많든 적든 간에 시스템에서 요구하는 응답성을 일정하게 유지하는 것을 말합니다. Resilient(회복성): 시스템에 장애가 발생하더라도 응답성을 유지하는 것을 의미합니다. VAL..
-
테스트(2)BackEnd/RxJava 2023. 7. 16. 10:00
TestSubscriber / TestObserver 테스트 용도로 사용되는 소비자 클래스로 TestSubscriber는 Flowable에서, TestObserver는 Observable에서 사용합니다. assertXXX 함수를 이용해 통지된 데이터를 검증할 수 있습니다. awaitXXX 함수를 이용해 지정된 시간 동안 대기하거나 완료 또는 에러 이벤트가 발생할 때까지 대기할 수 있습니다. 완료, 에러, 구독 해지 등의 이벤트 발생 결과 값을 이용해서 데이터를 검증할 수 있습니다. assertEmpty 테스트 시점까지 통지받은 데이터가 없다면 테스트에 성공합니다. Observable.empty()로 생성 시 완료를 통지하기 때문에 테스트가 실패합니다. 즉, 통지 이벤트 자체가 없는지를 테스트 할 수 있습..
-
테스트(1)BackEnd/RxJava 2023. 7. 16. 07:00
비동기 처리 결과를 테스트하려면 현재 쓰레드에서 호출 대상 쓰레드의 실행 결과를 반환 받을 때까지 대기할 수 있어야 합니다. RxJava에서는 현재 쓰레드에서 호출 대상 쓰레드의 처리 결과를 받을 수 있는 blockingXXX 함수를 제공합니다. Observable에서 통지되고 가공 처리된 결과 데이터를 현재 쓰레드에 반환하므로, 반환된 결과 값과 예상되는 기대값을 비교해서 단위 테스트를 수행할 수 있습니다. blockingFirst 생산자가 통지한 첫번째 데이터를 반환합니다. 통지된 데이터가 없을 경우 NoSuchElementException을 발생시킵니다. package com.itvillage.section03; import com.itvillage.common.Car; import org.juni..