Reactive streams 구현 라이브러리 ReactiveStreams의 구현 라이브러리를 하나씩 알아보자. Project reactor 리액티브 스트림 스펙의 구현체 중 하나로, 리액티브 프로그래밍 라이브러리 RxJava 리액티브 프로그래밍을 위한 라이브러리 Mutiny 리액티브 프로그래밍을 위한 작은 크기의 라이브러리 Project reactor Pivotal 사에서 개발 Spring reactor에서 사용 Java 및 Spring에서 사용되는 리액티브 프로그래밍 라이브러리 Mono와 Flux publisher를 통해 비동기적으로 데이터를 다룰 수 있다. Project reactor - Flux 0..n개의 item을 전달 에러가 발생하면 error signal 전달하고 종료 모든 item을 전달..
들어가며 리액티브 스트림즈(Reactive Streams)에 대해 공부하고 간단하게 정리했던 포스팅이 있다. https://devfunny.tistory.com/333 Reactive Streams Reactuve Streans를 들어가기 이전 Reactive Streams 포스팅을 들어가기전, Reactive Spring의 개념에 대해 알아야한다. 포스팅 바로가기 : devfunny.tistory.com/314?category=820617 Reactive Spring / Reactive Programming Reactive devfunny.tistory.com 리액티브 프로그래밍 책을 읽다보면, 해당 내용을 계속 만나게되는데 여러번 반복하며 학습한 결과 내용을 이해하는데 어려움은 없지만 볼때마다 헷갈리..
Spring WebFlux Spring WebFlux는 리액티브 웹 애플리케이션 구현을 위해 Spring 5.0부터 지원하는 리액티브 웹 프레임워크다. 대량의 요청 트래픽을 Spring MVC 방식이 처리하지 못하는 상황이 잦아짐에 따라 적은 수의 스레드로 대량의 요청을 안정적으로 처리할 수 있는 비동기 Non-Blocking I/O 방식의 Spring WebFlux가 등장했다. Spring WebFlux 기술 스택 1) 서버 Non-Blocking I/O 방식으로 동작하는 Netty 등의 서버 엔진에서 동작한다. 2) 서버 API 기본 서버 엔진이 Netty이지만 Jetty나 Undertow 같은 서버 엔진에서 지원하는 리액티브 스트림즈 어댑터를 통해 리액티브 스트림즈를 지원한다. 3) 보안 WebFl..
Reactor의 디버깅 Reactor는 처리되는 작업들이 대부분 비동기적으로 실행되고, Reactor Sequence는 선언형 프로그래밍 방식으로 구성되므로 디버깅이 쉽지않다. Reactor에서는 디버깅을 할 수 있는 방법을 몇가지 제공한다. Debug Mode Debug Mode를 활성화해서 Reactor Sequence를 디버깅할 수 있다. @Slf4j public class Example12_1 { public static Map fruits = new HashMap(); static { fruits.put("banana", "바나나"); fruits.put("apple", "사과"); fruits.put("pear", "배"); fruits.put("grape", "포도"); } public st..
Context the situation, events, or onformation that are related to something and that help you understand it '어떤 것을 이해하는데 도움이 될만한 관련 정보나 이벤트, 상황'로 해석된다. 즉, Context는 어떠한 상황에서 그 상황을 처리하기 위해 필요한 정보라고 볼 수 있다. 프로그래밍 세계에서의 Context 예시 1) ServletContext는 Servlet이 Setvlet Container와 통신하기 위해서 필요한 정보를 제공하는 인터페이스다. 2) Spring Framework에서 ApplicationContext는 애프리케이션의 정보를 제공하는 인터페이스다. 3) Spring Security에서 Securi..
Thread 개념 이해 Reactor에서 사용되는 Scheduler Reactor Sequence에서 사용되는 스레드를 관리해 주는 관리자 역할을 한다. 컴퓨터 시스템에서 스레드는 물리적인 스레드(Physical Thread)와 논리적인 스레드(Logical Thread)로 구분된다. CPU의 코어(Core) 코어는 CPUD의 명령어를 처리하는 반도체 유닛이다. 일반적으로 코어의 개수가 많으면 더 많은 수의 명령어를 더 빠르게 병렬로 처리할 수 있다. 코어와 물리적인 스레드 관계 ▶ 물리적인 스레드 (Physical Thread) 하나의 코어는 두개의 스레드를 포함하고 있는데 이 두개의 스레드는 물리적인 코어를 논리적으로 나눈 것을 의미한다. 이렇게 물리적인 코어를 논리적으로 나눈 코어를 물리적인 스레드..
Backpressure 리액티브 프로그래밍에서의 배압, 즉 Backpressure은 Publisher가 끊임없이 emit하는 무수히 많은 데이터를 적절하게 제어하여 데이터 처리에 과부하가 걸리지 않도록 제어하는 것이다. Publisher가 빠르게 데이터를 emit하는 경우 Subscriber의 처리속도가 느려서 처리가 끝나기도 전에 계속해서 emit하게된다. 이렇게되면 처리되지 않고 대기 중인 데이터가 지속적으로 쌓이게되어 오버플로가 발생하거나 최악의 경우에는 시스템이 다운되는 문제가 발생한다. 이 문제를 해결하기 위한 수단이 바로 Backpressure이다. Reactor에서의 Backpressure 처리 방식 첫번째 방법. Subscriber가 적절히 처리할 수 있는 수준의 데이터 개수를 Publis..
Cold와 Hot의 의미 지난 RxJava 공부 시기에 위 개념을 공부했었는데 다시보면 기억하기가 쉽지 않다. 리액티브 프로그래밍을 공부하면서 다시 나온 개념을 기억하고자 포스팅한다. Cold와 Hot의 의미를 모르는 사람은 없을 것이다. 대표적인 예시로 Hot Swapt이나 Hot Deploy를 보자. Hot Swap 컴퓨터 시스템의 전원이 켜져 있는 상태에서 디스크 등의 장치를 교체할 경우 시스템을 재시작하지 않고서도 바로 장치를 인식한다. Hot Deploy 서버를 재시작하지 않고서 응용 프로그램의 변경 사항을 적용한다. 공통점을 찾아보자. Hot은 무언가 처음부터 다시 시작하지 않고, 같은 작업이 반복하지 않는 느낌이다. 이와 반대인 Cold는 처음부터 새로 시작해야하고, 새로 시작하기 때문에 같..
해당 세미나 강의를 보고 정리 - https://tv.kakao.com/channel/3150758/cliplink/391418995 스프링 웹플럭스 스프링 5.0에 새로 등장한 (새로운) 웹 프레임워크 + 리액티브 스택 SpringMVC 이후 15년만에 처음으로 등장한 신규 웹 프레임워크 초기 이름은 스프링 웹 리액티브였고, 웹플럭스로 명칭이 변경되었다. 스프링 웹플럭스 vs MVC Spring WebFlux - 리액티브 스택 Servlet은 사용 방식은 다르지만 Reactive Stack, Servlet Stack 모두 포함되어있다. JPA(블록킹) 등은 Reactive Stack에는 포함되어있지 않다. Reactor (Reactive Library) 라이브러리 : 웹플럭스의 플럭스는 리액터 라이브러..
Mono vs Flux 객체 차이 설명 Mono 0 ~ 1 개의 데이터 전달 Reactive Streams 의 Publisher 인터페이스를 구현하는 구현체 Flux 0 ~ N 개의 데이터 전달 Reactive Streams 의 Publisher 인터페이스를 구현하는 구현체- 하나의 데이터를 전달할 때마다 onNext() 이벤트를 발생한다.- Flux 내의 모든 데이터의 전달 처리가 완료되면 onComplete() 이벤트가 발생한다. 'Mono 예제 맛보기' 포스팅 바로가기 https://devfunny.tistory.com/882 Flux 예제 맛보기 Event.java @Data @AllArgsConstructor public class Event { long id; String value; } Mo..
Mono vs Flux 객체 차이 설명 Mono 0 ~ 1 개의 데이터 전달 Reactive Streams 의 Publisher 인터페이스를 구현하는 구현체 Flux 0 ~ N 개의 데이터 전달 Reactive Streams 의 Publisher 인터페이스를 구현하는 구현체 - 하나의 데이터를 전달할 때마다 onNext() 이벤트를 발생한다. - Flux 내의 모든 데이터의 전달 처리가 완료되면 onComplete() 이벤트가 발생한다. 'Flux 예제 맛보기' 포스팅 바로가기 https://devfunny.tistory.com/883 gradle 설정 implementation 'org.springframework.boot:spring-boot-starter-webflux' Mono 예제 맛보기 1) ..
CompletableFuture Java5에 등장한 Future의 단점을 보완한 java8의 클래스다. Future은 get()을 호출하여 작업을 완료하고, get()은 비동기 작업의 결과를 가져올때까지 블로킹 상태가 된다. 여러 Future을 조합할 수 없고, 예외 처리도 불가능하여 이를 보완한 CompletableFuture을 사용하여 비동기 작업을 직접 완료할 수 있다. public class CompletableFuture implements Future, CompletionStage { CompletableFuture는 CompletionStage 인터페이스를 구현한다. CompletionStage는 비동기 연산을 체이닝으로 연속해서 작업들을 중첩시킬 수 있다. public interface C..