|
| 1 | +### 리액티브 프로그래밍 |
| 2 | + |
| 3 | +- 이벤트나 데이터가 극단적으로 증가하여 대용량 데이터의 저장, 업데이트, 실시간 반영을 효율적으로 해결할 방법으로 주목되었다 |
| 4 | +- 2013 년에 마이크로소프트에서 프로그래밍 모델을 비동기 및 이벤트 중심의 데이터 구조로 재정의한 Reactive Extensions 를 자바 진영으로 가져온것 |
| 5 | + - NetFlix가 공개한 라이브러리 |
| 6 | + |
| 7 | +### Reactive Streams 규칙 |
| 8 | + |
| 9 | +- onSubscribe 는 해당 구독에서 한번 만 발생한다 |
| 10 | +- 통지는 순차적으로 이루어진다 |
| 11 | +- null을 통지하지 않는다 |
| 12 | +- Publisher의 처리는 onComplete 나 onError 를 통지해 종료한다 |
| 13 | + |
| 14 | +### RxJava 기본 구조 |
| 15 | + |
| 16 | +- 데이터를 만들고 통지하는 **생산자** |
| 17 | +- 통지된 데이터를 받아 처리하는 **소비자** |
| 18 | + |
| 19 | +### 생산자 - 소비자 |
| 20 | + |
| 21 | +#### Flowable - Subscriber |
| 22 | +- Reactive Streams 지원 |
| 23 | + - 기본적인 매커니즘이 Reactive Streams 와 같다 |
| 24 | + - Subscription 으로 **데이터 개수 요청**과 **구독 해지** |
| 25 | +- Flowable |
| 26 | + - Reactive Streams 의 생산자인 Publisher를 구현 |
| 27 | +- Subscriver |
| 28 | + - Reactive Streams 의 클래스 |
| 29 | + |
| 30 | +#### Observable - Observer |
| 31 | +- RxJava 2.x 버전 |
| 32 | +- Reactive Streams 미지원 |
| 33 | + - 기본적인 매커니즘은 Flowable - Subscriber 와 거의 같다 |
| 34 | +- 데이터 개수를 제어하는 **배압 기능이 없다** |
| 35 | + - 데이터 개수를 요청하지 않음 |
| 36 | + - 구독 해지 메서드가 있는 인터페이스 **Disposable** 을 사용 |
| 37 | + |
| 38 | +### 연산자 |
| 39 | + |
| 40 | +- 소비자에게 데이터를 통지하기 전에 불필요한 데이터를 삭제한다 |
| 41 | +- 소비자가 사용하기 쉽게 데이터를 변환한다 |
| 42 | +- 연산자가 설정된 시점이 아닌 **데이터가 통지 받는 시점**에 처리가 실행된다 |
| 43 | +- 함수형 프로그래밍의 영향을 받아 **Side Effect** 를 피하는게 좋다 |
| 44 | + - 체인 도중이 아닌 소비자 측에서 하는게 좋다 |
| 45 | + - 여러 스레드에서 공유하는 객체가 없어져 쓰레드 안전을 보장할 수 있다 |
| 46 | + |
| 47 | +### 비동기 처리 |
| 48 | + |
| 49 | +- 개발자가 직접 스레드를 관리할 필요 없이 처리 목적에 맞춰 **스케줄러**를 설정 |
| 50 | + - 데이터를 통지하는 부분과 처리하는 부분에 지정할 수 있다 |
| 51 | + |
| 52 | +### Cold 생산자와 Hot 생산자 |
| 53 | + |
| 54 | +#### Cold 생산자 |
| 55 | + |
| 56 | +- 1개의 소비자와 구독 관계를 맺는다 |
| 57 | +- 새로운 구독이 생기면 데이터를 처음부터 받는다 |
| 58 | +- RxJava 의 기본 생산자는 Cold |
| 59 | + |
| 60 | +#### Hot 생산자 |
| 61 | + |
| 62 | +- 여러 소비자와 구독 관계를 맺는다 |
| 63 | +- 구독한 시점부터 생산된 데이터를 받게 된다 |
| 64 | + |
| 65 | +#### Hot 생산자 생성하기 |
| 66 | + |
| 67 | +- Cold 에서 Hot 으로 변환하는 메서드를 호출 |
| 68 | +- Processor 와 Subject 를 생성 |
| 69 | + |
| 70 | +### ConnectableFlowable/ ConnectableObservable |
| 71 | +- **Hot 생산자** |
| 72 | +- Cold 를 Hot으로 변환하는 연산자로 생성할 수 있다 |
| 73 | +- subscribe 를 호출해도 처리를 시작하지 않고 **connect 를 호출해야 처리 시작** |
| 74 | +- 처음 부터 여러 구독자에게 데이터를 통지할 수 있음 |
| 75 | +- refCount 를 이용해서 일반 Flowable/Observable 을 반환 할 수 있음 |
| 76 | + - 같은 timeline 에서 생성되는 데이터 통지 |
| 77 | + - Connectable 이 아니기 때문에 connect 가 아닌 subscribe 로 데이터 처리 시작 |
| 78 | + |
| 79 | +### Flowable/Observable 을 Cold 에서 Hot 으로 변환 |
| 80 | + |
| 81 | +- publish() |
| 82 | +- replay() / replay(int buffsize) / replay(long time, TimeUnit unit) |
| 83 | +- share() |
| 84 | + |
| 85 | +#### publish |
| 86 | + |
| 87 | +- Cold 생산자에서 Connectable 을 생성하는 연산자 |
| 88 | +- 처리를 시작한 뒤에 구독하면 **구독한 이후에 생성된 데이터 부터 통지** |
| 89 | + |
| 90 | +#### replay |
| 91 | + |
| 92 | +- Cold 생산자에서 Connectable 을 생성하는 연산자 |
| 93 | +- 통지한 데이터를 캐시하여 처리를 시작한 뒤에 구독하면 캐시된 데이터를 먼저 통지 |
| 94 | +- 인자가 없으면 **모든 데이터를 캐시** |
| 95 | + |
| 96 | +#### share |
| 97 | + |
| 98 | +- 여러 소비자가 구독할 수 있는 Flowable/Observable(Hot) 을 생성 |
| 99 | +- **Connectable 을 생성하지 않는다** |
| 100 | +- 실질적으로는 flowable.publish().refCount() 와 같다 |
| 101 | + |
| 102 | +>[!note] 소비자의 처리 속도가 느린 경우 |
| 103 | +>- 소비자들이 같은 데이터를 같은 시점에 받지 않을 수 있습니다. |
| 104 | +>- 이미 구독하고 있던 소비자는 버퍼에 있는데이터를 통지 받음 |
| 105 | +>- 새로 구독한 소비자는 최신 데이터를 통지 받음 |
| 106 | +
|
0 commit comments