문서의 내용이 많아 분리해서 관리하고 있습니다. 전체 내용은 링크를 통해서 확인할 수 있습니다.
리액터(Reactor)는 반응형 프로그래밍 패러다임의 구현체로, 다음과 같이 요약할 수 있다.
Reactive programming은 비동기로 동작해 데이터 스트림과 변화를 전달하며 데이터 흐름을 쉽게 표현한다.
Reactive programming 패러다임은 Observer pattern으로 확장된 Object oriented 프로그래밍으로 표현하기 도 한다.
데이터 스트림은 무엇일까?
데이터 스트림은 데이터 요소를 데이터 프로세서에 운반하여 지속적으로 공급하는 무한 컨베이어 벨트라고 표현할 수 있다.
정보를 전송할 때 사용되는 연속적인 흐름을 의미하는데, 데이터 스트림을 이용하면 이벤트나 변화를 실시간으로 처리할 수 있다. 데이터 스트림의 특성은 다음과 같다.
- 연속성
- 불완전성
- 휘발성
Reactive programming의 동작은 Iterator 간 동작처럼 보여 reactive streams pattern을 익숙한 Iterator design pattern과 비교하는데, 주요 차이점은 Iterator는 pull-based이지만 reactive streams은 push-based
이라는 것이다.
Ractive Streams는
Iterable
에 의해 흐름은 제어되지만 동작은 개발자에 의해 제어된다. 즉,Iterable
에 의해 흐름이 제어되는 데에도 불고하고 명령(imperatively) 프로그래밍 패턴이 시퀀스를 어떤 메서드를 추가할지는 개발자에게 달렸다는 의미이다.
Reactive Streams은 Iterator와 마찬가지로 Publisher-Subscriber
한 쌍으로 동작하지만 내부 동작은 완전하게 다르다.
첫 번째 차이점은 Reactive Streams의 Publisher
는 새로운 값을 생성했을 때 Subscriber
에게 알리는데, Reactive Streams에서는 이러한 알리는 관점이 중요하다.
두 번째 차이점은 푸시된 값에 적용되는 연산들은 명령적(imperatively)으로 표현되지 않고 선언적(declaratively)으로 표현된다는 것이다.
선언형과 명령형의 차이
- 선언형
- 해야할 작업을 나열하는 방법(ex. SQL)
- 명령형
- 해야할 작업을 정의하는 방법 (ex. Java)
앞서 확인했던 것처럼 값을 가공하고 전달하는 행위를 정말 잘한다. 또한 Reactive Streams는 오류나 완료 처리도 잘 다룬다. Publisher
는 onNext
를 호출하여 새 값을 Subscriber
에 전달할 수 있지만 onError
를 호출하여 오류를 표시하거나 onComplete
를 호출하여 완료를 표시할 수도 있다.
받은 데이터의 끝을 알아야 다음 데이터를 받을 수 있는데, Reactive Streams는 완료 처리를 통해 흐름의 끝을 파악해 다른 작업으로 빠르게 진행할 수 있다.