Reactor에서 Test하기reactor-test라는 테스트 전용 모듈을 통해 여러 가지 유형의 테스트를 지원한다.dependencies { testImplementation 'io.projectreactor:reactor-test'} StepVerifier를 사용한 테스팅Reactor에서 일반 적으로 Flux 또는 Mono를 Reactor Seqence로 정의한 후, 구독 시점에 해당 Operator 체인이 시나리오대로 동작하는지 테스트한다.Reactor Seqence에서 다음에 발생한 시그널, 기대하던 데이터들이 emit 되었는지, 특정 시간 동안 emit된 데이터가 있는지 등을 단계적으로 테스트 Signal 이벤트 테스트expectXXXX() 메서드메서드설명expectSubscription()구..
Reactive Programming
Reactor에서의 디버깅Reactor는 처리되는 작업들이 대부분 비동기적으로 실행되고, Reactor Sequence는 선언형 프로그래밍 방식으로 구성되므로 디버깅이 쉽지않다. Debug ModeHooks.onOperatorDebug()를 통해서 Debug Mode를 활성화하면 Reactor Sequence를 디버깅할 수 있다.@Slf4jclass DebugModeExam { public static Map fruits = new HashMap(); static { fruits.put("banana", "바나나"); fruits.put("apple", "사과"); fruits.put("pear", "배"); fruits.put("grape", "포도"); } public s..
Reactor에서의 Context는 Operator 같은 Reactor 구성요소 간에 전파되는 key/value 형태의 저장소라고 정의한다. 여기서의 전파란?Downstream에서 Upstream으로 Context가 전파되어 Operator 체인상의 각 Operator가 해당 Context의 정보를 동일하게 이용할 수 있음을 의미한다.Reactor의 Context는 ThreadLocal과 다소 유사하지만 각각의 실행 스레드와 매핑되는 ThreadLocal과 달리 실행 스레드와 매핑되는 것이 아니라 Subscriber와 매핑된다.구독이 발생할때마다 해당 구독과 연결된 하나의 Context가 생긴다. Context 기본 예제@Slf4jclass ContextBasicExam { public static v..
물리적 스레드와 논리적 스레드물리적인 스레드는 병렬성과 관련이 있으며, 논리적인 스레드는 동시성과 관련이 있다. 물리적 스레드하나의 코어는 두개의 스레드를 포함하고 있는데 이 두개의 스레드는 물리적인 코어를 논리적으로 나눈 것을 의미한다.이렇게 물리적인 코어를 논리적으로 나눈 코어를 물리적인 스레드라고 한다.쉽게 하드웨어와 관련된 스레드라고 생각할 수 있다. 논리적 스레드소프트웨어적으로 생성되는 스레드를 의미하며, Java 프로그래밍에서 사용되는 스레드를 말한다.프로세스 내에서 실행되는 세부 작업 단위이론적으로는 메모리가 허용하는 범위 내에서 얼마든지 만들 수 있지만 결국 물리적인 스레드의 가용 범위 내에서 실행될 수 있다. Scheduler란?운영체제 레벨에서의 Scheduler는 실행되는 프로그램인 ..
Sinks란?리액티브 스트림즈의 구성요소 중 하나로 Subscriber로서 기능할 땐 다른 Publisher를 구독할 수 있고, Publisher로서 기능할 땐 다른 Subscriber가 구독할 수 있습니다.Signal을 프로그래밍 방식으로 푸시할 수 있는 구조 (Flux, Mono의 의미 체계를 가진다.)명시적으로 Signal을 전송할 수 있다. 기존의 Reactor의 Processor 방식을 개선한 Sinks가 지원되면서 Reactor 3.5.0 부터 제거 되었다.onNext, onComplete, onError 메서드를 직접적으로 호출함으로써 스레드 안정성이 보장되지 않을 수 있었다.Sinks의 경우에는 동시 접근을 감지하고, 동시 접근하는 스레드 중 하나가 빠르게 실패함으로써 스레드 안전성을 보장..