Spring/스프링으로 시작하는 리액티브 프로그래밍 18

[Reactor] Context

Context프로그래밍 세계에서의 Context는 어떠한 상황을 처리하거나 해결하기 위해 필요한 정보를 제공하는 어떤 것ex) Spring Security에서 SecurityContextHolder는 SecurityContext를 관리하는 주체, 여기서의 SecurityContext는 애플리케이션 사용자의 인증 정보를 제공하는 인터페이스ex) Spring Framework에서 ApplicationContext는 애플리케이션의 정보를 제공하는 인터페이스로 ApplicationContext에서 제공하는 대표적인 정보가 Spring Bean Reactor에서 Context는 각 리액티브 시퀀스의 실행 시점에 관련된 데이터를 보관할 수 있는 불변 데이터 구조Map과 유사한 key-value 쌍의 형태로 데이터를..

[Reactor] Scheduler

SchedulerOS에서 사용되는 Scheduler와 의미가 비슷OS 레벨에서의 Scheduler는 실행되는 프로그램인 프로세스를 선택하고 실행하는 등 프로세스의 라이프 사이클을 관리해 주는 관리자 역할Reactor의 Scheduler는 비동기 프로그래밍을 위해 사용되는 쓰레드를 관리해 주는 역할Scheduler를 사용하여 어떤 쓰레드에서 무엇을 처리할지 제어Reactor Scheduler를 사용하면 코드 자체가 매우 간결해지고 Scheduler가 쓰레드의 제어를 대신해 주기 때문에 멀티 쓰레드 환경에서의 예상치 못한 오류가 발생할 확률을 최소화시킬 수 있음 Scheduler를 위한 전용 OperatorReactor에서 Scheduler는 Scheduler 전용 Operator를 통해 사용할 수 있음su..

[Reactor] Sinks

SinksReactor 3.4.0 버전부터 지원되기 시작했으며 리액티브 스트림즈의 구성 요소 중 하나로 Processor의 기능을 개선했음Sink는 Reactor에서 이벤트를 방출하는 엔터티를 의미  부연 설명Sink는 리액티브 스트림즈의 Signal을 프로그래밍 방식으로 푸시할 수 있는 구조이며 Flux 또는 Mono의 의미 체계를 가짐Sinks를 사용하면 프로그래밍 코드를 통해 명시적으로 Signal을 전송할 수 있음Sinks는 멀티 쓰레드 방식으로 Signal을 전송해도 thread-safe하기 때문에 예기치 않은 동작으로 이어지는 것을 방지해줌generate() Operator나 create() Operator는 싱글 쓰레드 기반에서 Signal을 전송하는 데 사용 1. create() Opera..

[Reactor] Backpressure

BackpressurePublisher와 Subscriber 간의 데이터 흐름을 제어하는 메커니즘Publisher가 끊임없이 내보내는 무수히 많은 데이터를 적절하게 제어하여 데이터 처리에 과부하가 걸리지 않도록 제어하는 역할Backpressure가 없다면 시스템이 과부하 되거나 메모리 부족 등의 문제가 발생할 수 있음과도한 데이터 생성: Publisher가 매우 빠르게 데이터를 생성할 때, 소비자가 그 데이터를 제시간에 처리하지 못하면 데이터가 쌓이게 됨리소스 제한: Subscriber는 제한된 리소스(메모리, CPU 등)를 사용하여 데이터를 처리하는데 Subscriber의 처리 속도가 Publisher의 생성 속도를 따라가지 못할 때 문제가 발생함시스템 안정성: Backpressure를 통해 시스템의 ..

[Reactor] Cold Sequence, Hot Sequence

컴퓨터 시스템에서의 Cold, Hot 의미Cold는 무언가를 새로 시작하고, Hot은 무언가를 새로 시작하지 않는다고 이해하는 것이 편함ex) 암호화폐의 Hot Wallet은 인터넷에 연결되어 있기 때문에 즉시 사용이 가능하지만 보안에 취약ex) 암호화폐의 Cold Wallet은 인터넷과 단절되어 있어서 사용성은 떨어지지만 보안이 강화됨 (사용하기 위해서는 인터넷에 다시 연결해야 함) SequencePublisher가 내보내는 데이터의 연속적인 흐름을 정의해 놓은 것코드로 표현하면 Operator 체인 형태로 정의 Cold SequenceSubscriber가 구독할 때마다 데이터 흐름이 처음부터 다시 시작되는 Sequence  부연 설명위 쪽에 위치한 Subscriber가 구독을 하면 Publisher는..

마블 다이어그램 (Marble Diagram)

마블 다이어그램리액티브 프로그래밍에서 사용되는 시각적 도구로, 스트림의 흐름과 데이터 변환을 이해하기 쉽게 표현한 것주로 RxJava나 Reactor와 같은 리액티브 라이브러리의 문서에서 자주 사용Reactor에서 지원하는 Operator를 이해하는 데 중요한 역할마블 다이어그램을 먼저 보고 난 후 API 문서를 읽을 때와 그렇지 않을 때의 이해도에는 상당한 차이가 존재처음 사용해 보는 Operator를 올바르게 이해하고 사용하기 위해서 해당 Operator의 API 설명을 보기 전 마블 다이어그램부터 먼저 확인하는 것을 권장  1. Publisher가 데이터를 내보내는 타임라인그림에서는 단순히 Publisher의 타임라인으로 표시했지만 해당 Publisher는 데이터 소스를 최초로 내보내는 Publis..

[Java] Reactor 간단 정리

ReactorSpring Framework 팀의 주도하에 개발된 리액티브 스트림즈의 구현체Spring Framework 5 버전부터 리액티브 스택에 포함되어 Spring WebFlux 기반의 리액티브 애플리케이션을 제작하기 위한 핵심 역할 담당간단하게 요약하면 리액티브 스트림즈의 구현체인 Reactor는 리액티브 프로그래밍을 위한 라이브러리 1. Reactor의 주요 특징Reactive Streams: 앞서 언급했다시피 Reactor는 리액티브 스트림즈 사양을 구현한 리액티브 라이브러리Non-Blocking: Reactor는 JVM 위에 실행되는 non-blocking 애플리케이션을 제작하기 위해 필요한 핵심 기술Java's Functional API: Reactor에서 Publisher와 Subscri..

[Java] 리액티브 프로그래밍

1. 리액티브 시스템과 리액티브 프로그래밍 1.1 리액티브 시스템(Reactive System)reactive의 사전적 의미는 `반응을 하는`이라는 뜻이며 어떤 이벤트나 상황이 발생했을 때, 반응을 해서 그에 따라 적절하게 행동하는 것을 의미리액티브 시스템은 `반응을 잘하는 시스템`이며 클라이언트의 요청에 즉각적으로 응답함으로써 지연 시간을 최소화 1.2 리액티브 선언문(Reactive Manifesto)리액티브 선언문은 리액티브 시스템 구축을 위한 일종의 설계 원칙이자 리액티브 시스템의 특징리액티브 선언문을 통해 리액티브 시스템이 지향하는 바가 무엇인지 명확하게 알 수 있음리액티브 시스템의 설계 원칙에 따라 대규모 분산 시스템 또는 멀티코어 기반의 클라우드 시스템, 모바일 시스템 등 빠른 응답성을 바탕..