주의: 요약 따윈 없음, 내용 많이 김, 진짜 API 뽀갤 생각 아니면 읽는 거 추천 안 함
RxDart에 뭐가 있는가.
까 보면 크게 라이브러리가 다섯 개 있는데
rx: 주요 함수와 클래스들을 포함하며, 기본적인 ReactiveX 연산들을 제공합니다.
rx_streams: Dart의 Stream API를 확장하는 다양한 스트림 클래스와 연산들을 제공합니다.
rx_subjects: 서브젝트 관련 클래스들을 제공합니다. 서브젝트는 동시에 스트림 및 스트림 컨트롤러로 작동하는 객체입니다.
rx_transformers: 스트림의 데이터를 변환하는 연산들을 포함합니다.
rx_utils: 내부적으로 RxDart에서 사용되는 유틸리티와 도우미 함수들을 포함합니다.
요러하다.
자... 그러면 하나하나 까 보자.
클래스를 한 번 보자.
1. AbstractConnectableStream<T, S extends Subject<T>, R extends Stream<T>>
ConnectableStream의 구현을 위한 기본 클래스입니다. S는 전달되는 Subject의 타입입니다. R은 autoConnect와 refCount의 반환 타입입니다(타입 제약: S는 R을 확장합니다).
다양한 스트림 기능을 만들기 위한 기본 틀로, 스트림 연결과 관련된 주요 기능을 갖고 있습니다.
2. BehaviorSubject<T>
컨트롤러에 추가된 가장 최근의 항목을 캡처하고, 그 항목을 새로운 리스너에게 첫 번째 항목으로 전송하는 특별한 StreamController입니다.
마지막으로 넣은 것을 기억하고, 새로 오는 친구에게 그것을 먼저 보여주는 특별한 상자입니다.
3. BufferCountStreamTransformer<T>
소스 스트림에서 값을 특정 개수만큼 버퍼링한 다음 해당 버퍼를 전송하고 지웁니다. 그리고 startBufferEvery 값마다 새로운 버퍼를 시작합니다. startBufferEvery가 제공되지 않으면, 소스의 시작과 각 버퍼가 닫힐 때 즉시 새로운 버퍼가 시작됩니다.
특정 개수만큼 물건을 담은 다음 상자를 보내고 비웁니다. 특정 횟수마다 새 상자를 시작해요.
4. BufferStreamTransformer<T>
소스 시퀀스의 항목을 포함하는 목록이 각 항목인 스트림을 생성합니다.
다양한 물건들을 하나의 상자에 모아서 만들어요.
5. BufferTestStreamTransformer<T>
테스트가 통과될 때마다 배치되는 소스 시퀀스의 항목을 포함하는 목록이 각 항목인 스트림을 생성합니다.
테스트에 합격할 때마다 여러 물건들을 하나의 상자에 모아요.
6. CombineLatestStream<T, R>
주어진 스트림들을 하나의 스트림 시퀀스로 병합합니다. 이 때, combiner 함수는 소스 스트림 시퀀스 중 어느 하나가 항목을 방출할 때마다 사용됩니다.
여러 바구니의 과일을 하나씩 조합해서 새로운 바구니를 만들어요.
7. CompositeSubscription
여러 구독을 한번에 취소할 수 있는 컨테이너 역할을 합니다. 예를 들면, Flutter 뷰에서 해제될 때 취소해야 하는 뷰 구독들과 같은 경우에 사용됩니다.
여러 책을 한꺼번에 담을 수 있는 가방 같아요. 필요하면 한 번에 다 내려놓을 수 있어요.
8. ConcatEagerStream<T>
이전 스트림 시퀀스가 성공적으로 종료된 한, 지정된 스트림 시퀀스들을 연속적으로 연결합니다.
한 줄에 줄을 이어 붙이는데, 앞 줄이 끝나야 다음 줄이 시작돼요.
9. ConcatStream<T>
이전 스트림 시퀀스가 성공적으로 종료된 한, 지정된 스트림 시퀀스들을 연속적으로 연결합니다.
한 줄 뒤에 다른 줄을 붙여요, 앞 줄이 끝나면 바로 다음 줄이 시작돼요.
ConcatEagerStream과 ConcatStream은 기본 개념은 같지만, 내부적인 작동 방식에서 차이점이 있을 것이다.
이거는 API 문서 내부를 샅샅이 봐서 두 클래스의 정확한 차이점을 확인할 필요가 있다.
물론 나는 시간이 없으니까 패스~
10. ConnectableStream<T>
ConnectableStream은 일반 스트림과 유사하지만, 여러 번 들을 수 있고, 듣기 시작할 때 항목을 방출하기 시작하지 않습니다. 대신, connect 메서드가 호출될 때만 방출을 시작합니다.
일반 라디오와 같아요. 버튼을 눌러야만 노래가 나와요, 버튼 안 누르면 노래 안 나와요.
11. ConnectableStreamSubscription<T>
소스 스트림과의 연결을 취소하는 특별한 StreamSubscription으로, 스트림을 구동하는 subject도 닫습니다.
버튼을 누르면 라디오를 꺼요. 그리고 라디오 안의 배터리도 뺄 수 있어요.
12. DebounceStreamTransformer<T>
주어진 윈도우가 완료된 경우에만 소스 시퀀스에서 항목을 방출하도록 스트림을 변환합니다. 이는 소스 시퀀스가 다른 항목을 방출하지 않는 경우에만 적용됩니다.
너무 빨리 누르면 안 되고, 잠시 기다린 후에 버튼을 눌러야 돼요.
13. DefaultIfEmptyStreamTransformer<S>
소스 스트림에서 항목을 방출하거나, 소스 스트림이 아무것도 방출하지 않으면 단일 기본 항목을 방출합니다.
만약 박스 안에 아무것도 없으면, 기본 물건 하나를 넣어줘요.
14. DeferStream<T>
리스너가 그것에 구독할 때까지 defer 팩토리는 대기하고, 그 후 주어진 팩토리 함수로 스트림을 생성합니다.
누군가 듣기 시작할 때까지 기다렸다가, 그때서야 노래(스트림)를 시작해요.
15. DelayStreamTransformer<S>
Delay 연산자는 소스 스트림의 각 항목을 방출하기 전에 지정된 시간만큼 일시 중지하여 스트림이 방출하는 항목의 전체 시퀀스를 지정된 증분만큼 시간에 앞당깁니다.
노래(스트림)의 각 부분을 잠시 기다린 후에 틀어줘요. 이로 인해 전체 노래가 조금 늦게 시작돼요.
16. DelayWhenStreamTransformer<T>
다른 스트림의 방출에 의해 결정된 주어진 시간 간격 동안 소스 스트림의 항목 방출을 지연시킵니다.
다른 스트림이 언제 "시작!"이라고 하면, 그때부터 우리 스트림이 노래(항목)를 틀기 시작해요.
17. DematerializeStreamTransformer<S>
물리화된 스트림에서 onData, onDone, onError Notification 객체를 일반 onData, onDone, onError 이벤트로 변환합니다.
복잡한 메시지를 간단한 메시지로 바꿔줘요, 그래서 더 쉽게 이해할 수 있게 도와줍니다.
18. DistinctUniqueStreamTransformer<S>
제공된 동등성을 사용하여 내부적으로 HashSet을 구현하는 스트림을 생성합니다.
같은 것은 한 번만 나오게 하고, 중복된 것은 없애줘요.
19. DoStreamTransformer<S>
스트림 생명주기의 해당 지점에서 주어진 콜백을 호출합니다. 예를 들면, onDone 콜백을 전달하면, 스트림이 항목 방출을 완료할 때 호출됩니다.
스트림이 특정 작업을 할 때마다 정해진 동작(콜백)을 해줘요.
20. EndWithManyStreamTransformer<S>
소스 스트림에 값의 시퀀스를 추가합니다.
스트림 끝에 여러 값들을 붙여줘요.
21. EndWithStreamTransformer<S>
소스 스트림이 종료되기 전에 값을 추가합니다.
스트림 끝에 한 값만 붙여줘요.
22. ErrorAndStackTrace
오류와 해당 스택 추적을 모두 포함하는 튜플 역할을 하는 객체입니다.
어디서 문제가 생겼는지 알려주는 오류 메시지와 그 위치 정보를 담은 것이에요.
23. ExhaustMapStreamTransformer<S, T>
주어진 매퍼를 사용하여 소스 스트림의 이벤트를 새로운 스트림으로 변환합니다. 새 스트림이 완료될 때까지 소스 스트림의 모든 항목을 무시합니다.
스트림에서 값을 바꿔서 새로운 줄로 만들어요, 그런데 새 줄이 끝날 때까지 다른 건 잠깐 무시해요.
24. FlatMapStreamTransformer<S, T>
주어진 매퍼 함수를 사용하여 각 방출된 항목을 새로운 스트림으로 변환하면서 이러한 스트림에 대한 동시 구독의 최대 수를 제한합니다. 새로 생성된 스트림은 수신되어 항목을 하류로 방출하기 시작합니다.
스트림의 값마다 새로운 줄로 바꿔줘요, 그리고 동시에 여러 줄을 볼 수 있게 제한해줘요.
25. ForkJoinStream<T, R>
여러 스트림 그룹이 있고 각각의 최종 방출 값만을 관심을 가질 때 이 연산자를 사용하는 것이 좋습니다. 이러한 사용 사례 중 하나는 페이지 로드(또는 다른 이벤트)시 여러 요청을 발행하고 모든 응답이 수신되었을 때만 조치를 취하고 싶을 때입니다.
마지막에 모아진 여러 줄의 정보 중에 마지막 내용만 가져와 합쳐요. (마치 여러 친구의 이야기 중 마지막 이야기만 듣는 것처럼!)
26. FromCallableStream<T>
이것을 듣는 중에 특정 함수를 호출하고 해당 함수에서 반환된 값을 방출하는 스트림을 반환합니다.
듣는 순간 특별한 기능을 실행하고 그 결과를 보여줘요.
27. GroupByStreamTransformer<T, K>
GroupBy 연산자는 항목을 방출하는 스트림을 나누어 원래 소스 스트림에서 항목의 부분 집합을 방출하는 GroupedStream을 방출하는 스트림으로 변환합니다.
줄마다 특별한 표시를 해서 비슷한 것끼리 모아 줄을 만들어요.
28. GroupedStream<T, K>
GroupByStreamTransformer에서 사용하는 스트림으로, 키 값으로 그룹화된 이벤트를 포함합니다.
비슷한 주제로 이야기하는 줄들을 모아둔 줄이에요.
29. IgnoreElementsStreamTransformer<S>
모든 방출된 항목을 무시하고 오류/완료 알림만 전달하는 스트림을 생성합니다.
이야기 중 내용은 무시하고, 끝났는지 아니면 문제가 생겼는지만 확인해요.
30. IntervalStreamTransformer<S>
주어진 지속 시간 후에 스트림의 각 항목을 방출하는 스트림을 생성합니다.
정해진 시간마다 줄마다 내용을 차례로 보여줘요.
31. MapNotNullStreamTransformer<T, R extends Object>
스트림의 각 요소에 주어진 변환 함수를 적용한 결과 중 null이 아닌 결과만 포함하는 스트림을 생성합니다.
이야기에서 비어있지 않은 내용만 골라내요.
32. MapToStreamTransformer<S, T>
소스 스트림이 값을 방출할 때마다 출력 스트림에 주어진 상수 값을 방출합니다.
어떤 이야기가 나오든 항상 같은 말을 반복해요.
33. MaterializeStreamTransformer<S>
onData, onDone 및 onError 이벤트를 다운스트림 onData 리스너에 전달되는 Notification 객체로 변환합니다.
이야기의 모든 부분(내용, 끝, 문제)을 특별한 알림으로 바꿔서 보여줘요.
34. MergeStream<T>
주어진 스트림에서 방출된 항목을 단일 스트림 시퀀스로 평탄화합니다.
여러 이야기를 하나의 큰 이야기로 합쳐서 들려줘요.
35. NeverStream<T>
끝나지 않는 스트림 시퀀스를 반환하며, 무한한 기간을 나타내는 데 사용할 수 있습니다.
이 이야기는 끝나지 않아요, 계속 계속 이어져요.
36. Notification<T>
이벤트의 종류, onData의 경우 이벤트의 값 또는 onError의 경우 오류를 캡슐화하는 클래스입니다. 이벤트의 종류(OnData, OnDone, OnError)와 방출된 항목 또는 오류를 래핑하는 컨테이너 객체입니다. onDone의 경우 Notification의 일부로 데이터가 방출되지 않습니다.
이야기의 내용이나 문제 또는 끝을 포장하는 상자 같아요.
37. OnErrorResumeStreamTransformer<S>
오류 이벤트를 가로채고 제공된 recoveryFn 함수로 생성된 복구 스트림으로 전환합니다.
문제가 생기면 다른 이야기로 바꿔서 들려줘요.
38. PairwiseStreamTransformer<T>
n번째와 n-1번째 이벤트를 쌍으로 방출합니다. 첫 번째 이벤트는 두 번째 이벤트가 도착할 때까지 방출되지 않습니다.
이전 이야기와 지금 이야기를 함께 들려줘요.
40. PublishConnectableStream<T>
단일 구독 스트림을 브로드캐스트 스트림으로 변환하는 ConnectableStream입니다.
한 번에 한 명만 들을 수 있는 이야기를 모두에게 들려주게 바꿔줘요.
41. PublishSubject<T>
하나의 예외를 제외하고 일반 브로드캐스트 StreamController와 정확히 같습니다: 이 클래스는 스트림이자 싱크입니다.
이야기를 듣고, 그 이야기를 다른 사람에게도 들려줄 수 있는 도구예요.
42. RaceStream<T>
두 개 이상의 소스 스트림이 주어진 경우, 이 스트림들 중 가장 먼저 항목 또는 알림을 방출하는 스트림의 모든 항목을 방출합니다.
여러 이야기 중 가장 먼저 시작하는 이야기만 들려줘요.
43. RangeStream
지정된 범위 내의 정수 시퀀스를 방출하는 스트림을 반환합니다.
정해진 범위의 숫자 이야기를 차례대로 들려줘요.
44. RepeatStream<T>
스트림이 성공적으로 종료될 때까지 지정된 횟수만큼 소스 스트림을 재생성하고 다시 수신하는 스트림을 생성합니다.
이야기가 끝나면 정해진 횟수만큼 다시 시작해요.
45. ReplayConnectableStream<T>
방출된 항목을 새 리스너에 재생하고, 방출된 값들의 리스트에 동기적으로 접근할 수 있는 브로드캐스트 스트림으로 단일 구독 스트림을 변환하는 ConnectableStream입니다.
이전에 들려준 이야기들을 다시 들려줄 수 있어요.
46. ReplayStream<T>
방출된 값들에 동기적으로 접근할 수 있는 스트림입니다.
이전에 어떤 이야기가 있었는지 바로 알 수 있어요.
47. ReplaySubject<T>
컨트롤러에 추가된 모든 항목을 캡처하는 특별한 StreamController로, 새 리스너에게 첫 번째 항목으로 해당 항목들을 방출합니다.
들어본 모든 이야기를 기억해서 다시 들려줄 수 있어요.
48. RetryStream<T>
스트림이 성공적으로 종료될 때까지 지정된 횟수만큼 소스 스트림을 재생성하고 다시 수신하는 스트림을 생성합니다.
이야기가 잘 안 될 때, 정해진 횟수만큼 다시 시작해요.
49. RetryWhenStream<T>
알림이 새 값을 방출할 때 소스 스트림을 재생성하고 다시 수신하는 스트림을 생성합니다. 소스 스트림이 오류를 방출하거나 완료되면 스트림이 종료됩니다.
문제가 생기면 다른 이야기로 바꾼 후에 다시 시작해요.
50. Rx
RxDart에서 제공하는 다양한 스트림을 생성하기 위한 정적 메서드를 제공하는 유틸리티 클래스입니다.
다양한 종류의 이야기를 만들 수 있는 도구상자예요.
51. SampleStreamTransformer<T>
지정된 window 스트림이 항목을 방출하거나 완료될 때, 소스 스트림에서 이전 샘플 스트림의 방출 이후에 방출된 가장 최근의 항목(있는 경우)을 방출하는 StreamTransformer입니다.
정해진 시간마다 가장 최근의 이야기를 들려줘요.
52. ScanStreamTransformer<S, T>
스트림 시퀀스에 누적 함수를 적용하고 각 중간 결과를 반환합니다. 시드 값은 초기 누적 값으로 사용됩니다.
이야기의 내용을 차례대로 더해가며 새로운 이야기를 만들어요.
53. SequenceEqualStream<S, T>
두 스트림이 동일한 항목 시퀀스를 방출하는지 여부를 결정합니다. 동등성을 결정하기 위해 선택적 equals 핸들러를 제공할 수 있습니다.
두 가지 이야기가 같은 순서와 내용으로 진행되는지 확인해요.
54. SkipLastStreamTransformer<T>
소스 스트림에서 방출된 마지막 count 항목을 건너뜁니다.
이야기의 마지막 부분을 생략하고 나머지만 들려줘요.
55. SkipUntilStreamTransformer<S, T>
주어진 스트림이 이벤트를 방출한 후에만 이벤트를 방출하기 시작합니다.
특정 이벤트가 시작되면 그때부터 이야기를 시작해요.
56. StartWithManyStreamTransformer<S>
소스 스트림 앞에 값의 시퀀스를 추가합니다.
이야기를 시작하기 전에 여러 부분을 먼저 추가해요.
57. StartWithStreamTransformer<S>
소스 스트림 앞에 값을 추가합니다.
이야기를 시작하기 전에 하나의 부분을 먼저 추가해요.
58. Subject<T>
모든 Subjects의 기본 클래스입니다. 새로운 Subject를 생성하려면 이 클래스를 확장하세요.
이야기를 만들기 위한 기본 틀이에요. 여러 버전의 이야기를 만들고 싶다면 이 틀을 사용해요.
59. SwitchIfEmptyStreamTransformer<S>
원래의 스트림이 아무 항목도 방출하지 않으면, 이 연산자는 주어진 대체 스트림에 구독하고 그 스트림에서 항목을 방출합니다.
이야기가 비어있으면 다른 이야기로 바꿔서 들려줘요.
60. SwitchLatestStream<T>
스트림을 방출하는 스트림(즉, 'Higher Order Stream')을 단일 스트림으로 변환하여 최근에 방출된 스트림에서 방출된 항목을 방출합니다.
새로운 이야기가 시작되면 이전 이야기는 멈추고 새로운 이야기만 들려줘요.
61. SwitchMapStreamTransformer<S, T>
주어진 매퍼 함수를 사용하여 각 방출된 항목을 새 스트림으로 변환합니다. 새로 생성된 스트림은 듣기를 시작하고 항목을 방출하기 시작하며, 이전에 생성된 모든 스트림은 방출을 중지합니다.
새로운 이야기가 시작되면 이전 이야기는 멈추고 새 이야기만 들려줘요.
62. TakeLastStreamTransformer<T>
소스 스트림에서 방출된 최종 count 값만을 방출합니다.
이야기의 마지막 부분만을 들려줘요.
63. TakeUntilStreamTransformer<S, T>
다른 스트림 시퀀스가 값을 생성할 때까지 소스 스트림 시퀀스에서 값을 반환합니다.
다른 이야기가 시작되기 전까지만 현재 이야기를 들려줘요.
64. TakeWhileInclusiveStreamTransformer<S>
각 값이 주어진 테스트를 만족하는 한, 소스 스트림에서 방출된 값을 방출합니다. 값이 테스트를 만족시키지 않으면, 그 값을 최종 이벤트로 방출한 후 완료됩니다.
주어진 규칙에 따라 이야기를 듣다가, 규칙에 맞지 않으면 그 부분을 마지막으로 이야기를 끝내요.
65. ThrottleStreamTransformer<T>
소스 스트림에서 값을 방출한 후, window 스트림이 열려있는 동안 후속 소스 값을 무시하고 이 프로세스를 반복하는 StreamTransformer입니다.
잠시 이야기를 듣고 나면, 특정 시간 동안 쉬어요.
66. TimeInterval<T>
스트림에서 방출된 현재 값의 스냅샷을 지정된 간격에서 나타내는 클래스입니다.
특정 시간 간격으로 이야기의 특정 부분을 들려줘요.
67. TimeIntervalStreamTransformer<S>
스트림 시퀀스에서 연속적인 값 사이의 시간 간격을 기록합니다.
이야기의 연속적인 부분 사이에 얼마나 시간이 걸렸는지 알려줘요.
68. TimerStream<T>
지정된 시간 후에 주어진 값을 방출합니다.
일정 시간이 지나면 특정 내용을 들려줘요.
69. Timestamped<T>
스트림에서 방출된 현재 값의 스냅샷을 지정된 타임스탬프에서 나타내는 클래스입니다.
이야기의 특정 부분이 언제 말해졌는지 알려줘요.
70. TimestampStreamTransformer<S>
소스 스트림에서 방출된 각 항목을 Timestamped 객체에 포함하여 방출하는 객체로, 방출된 항목과 항목이 방출된 시간을 포함합니다.
이야기의 각 부분에 언제 말했는지 시간을 붙여서 알려줘요.
71. UsingStream<T, R>
리스너가 듣기 시작할 때, 리소스 팩토리 함수에서 리소스 객체를 생성하고, 주어진 팩토리 함수와 리소스를 인수로 사용하여 스트림을 생성합니다. 마지막으로 스트림이 항목을 방출을 완료하거나 스트림 구독이 취소되면(StreamSubscription.cancel 또는 Stream.listen(cancelOnError: true)를 호출할 때), 리소스 객체에서 dispos 함수를 호출합니다.
이야기를 시작할 때 특정 도구를 준비하고, 이야기가 끝나면 그 도구를 정리해요.
72. ValueConnectableStream<T>
소스 스트림을 브로드캐스트 스트림으로 변환하는 ConnectableStream으로, 최신 값을 새 리스너에 재생하고 최신 방출 값에 동기적으로 접근합니다.
가장 최근의 이야기 부분을 다시 들려주고, 언제든지 그 부분을 확인할 수 있어요.
73. ValueStream<T>
마지막으로 방출된 항목에 동기적으로 접근할 수 있는 스트림입니다.
가장 최근에 말한 이야기 부분을 알려줘요.
74. WhereNotNullStreamTransformer<T extends Object>
스트림에서 방출된 모든 null이 아닌 요소를 원래의 방출 순서대로 포함하는 스트림을 생성합니다.
이야기 중에서 비어있지 않은 부분만을 선택해서 들려줘요.
75. WhereTypeStreamTransformer<S, T>
이 변환기는 Stream.where 다음에 Stream.cast를 사용하는 축약어입니다.
특정 종류의 이야기 부분만 선택해서 들려줘요.
76. WindowCountStreamTransformer<T>
소스 스트림에서 count 값으로 버퍼를 생성한 다음 버퍼를 스트림으로 방출하고 클리어합니다. startBufferEvery 값이 제공되지 않으면, 새 버퍼는 소스의 시작에서 즉시 시작되고 각 버퍼가 닫히고 방출될 때 시작됩니다.
이야기를 일정 부분마다 나눠서 덩어리로 들려줘요.
77. WindowStreamTransformer<T>
각 항목이 소스 시퀀스의 항목을 포함하는 스트림인 스트림을 생성합니다.
이야기의 각 부분을 작은 이야기로 나눠서 들려줘요.
78. WindowTestStreamTransformer<T>
테스트가 통과될 때마다 각 항목이 소스 시퀀스의 항목을 포함하는 스트림인 스트림을 생성합니다.
특정 조건에 맞는 이야기 부분만 작은 이야기로 나눠서 들려줘요.
79. WithLatestFromStreamTransformer<S, T, R>
소스 스트림이 방출될 때 방출하는 StreamTransformer로, 제공된 함수를 사용하여 두 스트림의 최신 값을 결합합니다.
두 친구의 가장 최근에 한 이야기를 함께 묶어서 새로운 이야기로 만들어줘요.
80. ZipStream<T, R>
모든 스트림 시퀀스에서 해당 인덱스에서 항목을 생성할 때 주어진 zipper 함수를 사용하여 지정된 스트림을 하나의 스트림 시퀀스로 병합합니다.
여러 친구들의 이야기를 순서대로 합쳐서 하나의 연속된 이야기로 만들어줘요.
클래스는 이 정도다.
그럼 Extension은 무엇일까?
이는 Dart의 기본 스트림 API를 확장하여 더 많은 연산자와 유틸리티를 제공하는 것이다.
이 확장을 통해, 개발자들은 기본 스트림에 없는 다양한 함수적 연산자와 패턴들을 사용할 수 있게 된다.
예를 들어, Dart의 기본 Stream 클래스는 map, where와 같은 몇몇 기본 연산자만 제공힌다.
rx 라이브러리의 확장을 사용하면, debounce, throttle, zip, combineLatest 등과 같은 추가적인 연산자들을 사용할 수 있게 된다.
이러한 확장은 Reactive Programming 패턴을 쉽게 적용할 수 있게 도와주며, 비동기 데이터 흐름을 더 강력하고 유연하게 조작할 수 있게 해준다.
Reactive Programming(반응형 프로그래밍)은 마치 우리가 도미노를 연쇄적으로 세운 후, 하나를 넘어뜨리면 다음 도미노가 차례로 넘어지는 것과 비슷합니다.
- 도미노 체인 설정 (데이터 스트림 생성): 도미노를 하나씩 세워 놓습니다. 이 도미노들은 데이터의 연속, 즉 스트림입니다.
- 반응 (Reactive): 하나의 도미노(이벤트나 데이터)가 넘어지면, 그 다음 도미노들도 차례로 넘어집니다. 마찬가지로, 우리의 코드는 새로운 데이터나 이벤트가 발생할 때마다 자동으로 반응합니다.
- 변경사항에 따라 자동 반응: 만약 도미노 중간에 하나가 빠지면, 그 뒤의 도미노는 넘어지지 않습니다. 마찬가지로, 데이터에 변화가 생기면 해당 변화에 따라 반응하는 코드를 쉽게 작성할 수 있습니다.
- 연결 (Composable): 여러 도미노 체인을 서로 연결해서 더 큰 도미노 체인을 만들 수 있습니다. Reactive Programming에서는 여러 스트림을 서로 연결하거나 합치는 것도 이처럼 쉽습니다.
즉, Reactive Programming은 데이터의 흐름과 변화에 중점을 둡니다. 데이터가 변화하면, 그 변화에 자동으로 반응하는 코드를 작성하는 방식입니다. 이를 통해 복잡한 상태 관리와 이벤트 처리를 더 간결하고 명확하게 할 수 있습니다.
이전보다 훨씬 반응형 프로그래밍이 이해가 된다.
이제 extension 부분으로 넘어가자.
AddToCompositeSubscriptionExtension
CompositeSubscription 컨테이너에 추가될 수 있는 StreamSubscription 클래스 확장
여기서 말하는 확장은 상속이다.
ChatGPT가 확장을 상속이라 번역하고 있다.
개떡 같이 말해도 찰떡 같이 알아 들으며 넘어가자.
여러 가지 구독(데이터의 연속)을 한 군데에 모아 관리하는 도구입니다.
BufferExtensions
다양한 방법으로 이벤트를 버퍼링(모아두기)할 수 있는 스트림 확장
데이터를 잠시 모아뒀다가 한꺼번에 보내주는 도구입니다.
ConcatExtensions
하나의 스트림을 다른 스트림과 연결할 수 있는 스트림 확장
두 개의 데이터 줄기를 하나로 붙여주는 도구입니다.
ConnectableStreamExtensions
단일 구독 스트림을 ConnectableStream(여러 군데에서 볼 수 있는 스트림)으로 바꿀 수 있는 스트림 확장
데이터 흐름을 여러 사람이 동시에 볼 수 있게 만드는 도구입니다.
DebounceExtensions
다양한 방법으로 이벤트를 디바운스(짧은 시간 내 반복된 이벤트 무시)할 수 있는 스트림 확장
너무 자주 오는 정보를 조금 줄여서 알려주는 도구입니다.
DefaultIfEmptyExtension
비어있을 경우 기본값을 제공하는 확장
정보가 없으면 기본 정보를 주는 도구입니다.
DelayExtension
이벤트가 발생하는 것을 지연시킬 수 있는 스트림 확장
정보를 받은 후, 잠시 기다렸다가 전달하는 도구입니다.
DelayWhenExtension
이벤트가 발생하는 것을 특정 조건에 따라 지연시킬 수 있는 스트림 확장
특별한 상황일 때 정보 전달을 잠시 늦춰주는 도구입니다.
DematerializeExtension
materialized 스트림의 onData, onDone, onError 알림을 일반 onData, onDone, onError 이벤트로 바꾸는 확장
특별한 형태의 정보를 보통 정보로 바꿔주는 도구입니다.
DistinctUniqueExtension
이미 발행된 항목들을 건너뛸 수 있는 스트림 확장
같은 정보는 한 번만 알려주는 도구입니다.
DoExtensions
스트림의 여러 단계에서 콜백 함수를 실행할 수 있는 스트림 확장
정보가 오고 가는 도중에 특별한 일을 해주는 도구입니다.
EndWithExtension
종료하기 전에 주어진 값을 마지막 항목으로 발행하는 스트림 확장
마지막에 특별한 정보를 추가해서 보내는 도구입니다.
EndWithManyExtension
종료하기 전에 주어진 여러 값을 마지막 항목으로 발행하는 스트림 확장
마지막에 여러 가지 특별한 정보들을 추가해서 보내는 도구입니다.
ExhaustMapExtension
스트림을 새로운 스트림으로 변환하는 스트림 확장. 새 스트림은 항목을 발행하고 새 스트림이 완료될 때까지 원본 스트림의 이벤트를 무시합니다.
새로운 정보 통로를 만들고, 그 통로가 끝날 때까지 기존 정보는 무시하는 도구입니다.
FlatMapExtension
원본 스트림의 항목마다 스트림을 새로운 스트림으로 변환하는 확장
받은 정보마다 새로운 정보 통로를 만드는 도구입니다.
GroupByExtension
이벤트를 키에 따라 결합된 이벤트의 스트림으로 변환하는 확장
같은 종류의 정보끼리 모아서 보내는 도구입니다.
IgnoreElementsExtension
데이터 이벤트를 건너뛰거나 무시하는 스트림 확장
일부 정보는 보내지 않게 하는 도구입니다.
IntervalExtension
주어진 시간 간격마다 항목을 발행하는 스트림 확장
일정한 시간마다 정보를 보내는 도구입니다.
MapNotNullExtension
스트림 클래스를 확장하여 이 스트림의 각 요소에 주어진 변환 함수를 적용한 비널 결과만 포함하는 스트림으로 원본 스트림을 변환하는 기능을 제공합니다.
빈칸이 없는 정보만 골라서 보내는 도구입니다.
MapToExtension
스트림 클래스를 확장하여 각 항목을 동일한 값으로 변환하는 기능을 제공합니다.
받은 정보를 같은 모양으로 바꿔서 보내는 도구입니다.
MaterializeExtension
onData, onDone 및 onError 이벤트를 하류 onData 리스너에 전달되는 알림으로 변환하는 기능을 제공하는 스트림 클래스 확장입니다.
정보를 알림 형태로 바꿔서 보내는 도구입니다.
MaxExtension
스트림에서 발행된 가장 큰 항목으로 완료되는 미래로 변환하는 기능을 제공하는 스트림 클래스 확장입니다.
가장 큰 정보만 골라서 보내는 도구입니다.
MergeExtension
하나의 스트림을 다른 스트림과 병합하는 기능을 제공하는 스트림 클래스 확장입니다.
두 개의 정보를 합쳐서 보내는 도구입니다.
MinExtension
스트림에서 발행된 가장 작은 항목으로 완료되는 미래로 변환하는 기능을 제공하는 스트림 클래스 확장입니다.
가장 작은 정보만 골라서 보내는 도구입니다.
25 .OnErrorExtensions
여러 가지 방법으로 오류에서 복구하는 기능을 제공하는 스트림 클래스 확장입니다.
문제가 생겼을 때 다시 잘 돌아가게 하는 도구입니다.
PairwiseExtension
n번째와 n-1번째 이벤트를 쌍으로 발행하는 기능을 제공하는 스트림 클래스 확장입니다.
두 개의 정보를 짝을 지어서 보내는 도구입니다.
SampleExtensions
스트림에서 이벤트를 샘플링하는 기능을 제공하는 스트림 클래스 확장입니다.
일부 정보만 골라서 가끔 보내는 도구입니다.
ScanExtension
스트림 클래스 확장.
정보를 살펴보는 도구입니다.
SkipLastExtension
원본 스트림에서 마지막으로 발행된 항목을 건너뛸 수 있는 기능을 제공하는 스트림 클래스 확장입니다.
마지막 몇 가지 정보를 보내지 않게 하는 도구입니다.
SkipUntilExtension
다른 스트림이 항목을 발행할 때까지 이벤트를 건너뛸 수 있는 기능을 제공하는 스트림 클래스 확장입니다.
어떤 정보가 올 때까지 기다렸다가 시작하는 도구입니다.
StartWithExtension
주어진 값을 첫 번째 항목으로 발행할 수 있는 기능을 제공하는 스트림 클래스 확장입니다.
시작할 때 정해진 정보를 먼저 보내는 도구입니다.
StartWithManyExtension
주어진 값을 첫 번째 항목들로 발행할 수 있는 기능을 제공하는 스트림 클래스 확장입니다.
시작할 때 여러 개의 정보를 먼저 보내는 도구입니다.
SwitchIfEmptyExtension
초기 스트림이 항목 없이 완료되면 대체 스트림을 반환하는 기능을 제공하는 스트림 클래스 확장입니다.
정보가 없으면 다른 정보로 바꿔서 보내는 도구입니다.
SwitchMapExtension
원본이 항목을 발행할 때마다 하나의 스트림을 새로운 스트림으로 변환하는 기능을 제공하는 스트림 클래스 확장입니다. 새 스트림이 생성될 때마다 이전 스트림은 버려집니다.
정보가 올 때마다 새로운 방식으로 바꾸는 도구입니다.
TakeLastExtension
원본 스트림에서 마지막 이벤트만 받을 수 있는 기능을 제공하는 스트림 클래스 확장입니다.
마지막 몇 가지 정보만 받는 도구입니다.
TakeUntilExtension
다른 스트림이 값을 생성할 때까지 원본 스트림에서 이벤트를 받을 수 있는 기능을 제공하는 스트림 클래스 확장입니다.
어떤 정보가 올 때까지만 받는 도구입니다.
TakeWhileInclusiveExtension
주어진 조건을 통과하는 이벤트를 취하고 조건을 통과하지 않는 마지막 이벤트도 포함하는 기능을 제공하는 스트림 클래스 확장입니다.
정해진 규칙에 맞는 정보와 그 다음 정보 한 개만 받는 도구입니다.
ThrottleExtensions
여러 방법으로 이벤트를 조절하는 기능을 제공하는 스트림 클래스 확장입니다.
정보를 조금씩 느리게 보내는 도구입니다.
TimeIntervalExtension
연속적인 값 사이의 시간 간격을 기록하는 기능을 제공하는 스트림 클래스 확장입니다.
정보 사이의 시간을 측정하는 도구입니다.
TimeStampExtension
원본 스트림에서 발행된 각 항목을 발행 항목과 항목이 발행된 시간이 포함된 Timestamped 객체로 감싸는 기능을 제공하는 스트림 클래스 확장입니다.
정보에 언제 온 것인지 시간을 붙여서 보내는 도구입니다.
WhereNotNullExtension
원본 스트림을 이 스트림의 모든 비널 요소를 원래 발행 순서대로 발행하는 스트림으로 변환하는 기능을 제공하는 스트림 클래스 확장입니다.
빈칸이 아닌 정보만 골라서 보내는 도구입니다.
WhereTypeExtension
특정 타입의 이벤트만 필터링하여 받을 수 있는 기능을 제공하는 스트림 클래스 확장입니다.
정해진 종류의 정보만 받는 도구입니다.
WindowExtensions
스트림을 여러 창으로 나누는 기능을 제공하는 스트림 클래스 확장입니다.
정보를 여러 조각으로 나누는 도구입니다.
WithLatestFromExtensions
원본 스트림을 다른 스트림의 마지막으로 발행된 항목과 병합하는 기능을 제공하는 스트림 클래스 확장입니다.
한 정보와 가장 최근의 다른 정보를 합쳐서 보내는 도구입니다.
ZipWithExtension
하나의 스트림을 다른 스트림과 함께 압축하여 병합하는 기능을 제공하는 스트림 클래스 확장입니다.
두 가지 정보를 같이 묶어서 보내는 도구입니다.
당신이 여기까지 모든 내용을 잘 읽었으면 다음과 같은 생각을 했을 가능성이 있다.
'Class랑 extension이랑 지금 내용이 중복되고 있는 거 아니야?'
자... 다음 내용을 읽어 보자.
Class와 extension은 프로그래밍에서 주로 사용되는 용어이며, 동작 방식이나 목적에 따라 서로 다른 역할을 합니다. 두 개념 사이의 기본 차이점을 설명하겠습니다:
중복된 기능에 대한 차이점:
때로는 클래스와 확장 모두에서 동일한 기능이 중복되어 정의될 수 있습니다. 이러한 경우, 기본적으로 클래스 내부에 정의된 기능이 우선시되며, 확장에서 제공되는 기능은 클래스의 기능을 덮어쓰지 않습니다.
예를 들어, 특정 클래스에 printDetails라는 메서드가 이미 있고, 이 클래스를 확장하여 동일한 이름의 printDetails 메서드를 추가하면, 객체에서 printDetails를 호출할 때 원래 클래스의 메서드가 호출됩니다. 만약 확장의 기능을 호출하고 싶다면, 다른 방법이나 추가적인 구현이 필요합니다.
즉, 클래스는 객체의 기본적인 속성과 기능을 정의하는 반면, 확장은 기존 객체에 추가적인 기능이나 수정된 기능을 제공하는 데 사용됩니다.
다음은 Enums다.
라이브러리에 Enum이 있다?
이건 무슨 기능을 하는 걸까?
Rx(Reactive Extensions) 라이브러리는 반응형 프로그래밍을 위한 라이브러리로, 다양한 이벤트나 데이터 스트림을 처리하는데 사용됩니다.
Rx 라이브러리에는 여러 클래스, 확장, 그리고 열거형 (enums)이 포함되어 있습니다.
Enums (열거형)은 프로그래밍에서 명명된 상수의 그룹을 나타내는 데이터 유형입니다. 열거형은 특정한 값들 중 하나만을 가질 수 있으며, 그 값들은 열거형 내에서 사전에 정의되어 있습니다.
Rx 라이브러리 내의 enums는 특정한 상태나 옵션, 종류의 값들을 명확하게 표현하고, 관련 로직 내에서 사용하기 위해 정의됩니다.
예를 들어, 스트림의 상태나 오류 유형, 이벤트 유형 등을 열거형으로 표현할 수 있습니다.
간단한 예를 들면, Rx에서의 스트림 이벤트는 종종 onNext, onError, onCompleted로 나타내는데, 이러한 이벤트의 유형을 열거형으로 정의하여 처리할 수 있습니다.
열거형을 사용함으로써, 코드가 더 읽기 쉽고, 관련된 값들을 그룹화하여 안전하게 처리할 수 있게 됩니다.
OK!
rx library 안 enum으로는 Kind 하나만 있고
이것도 안에 보면 onData, onDone, onError 정도만 값으로 있으니
얘는 넘어가자.
라이브러리 내의 "Exceptions" 혹은 "Errors"는 일반적으로 예외 처리를 위한 부분입니다.
예외(Exception)는 프로그램 실행 중에 발생하는 예상치 못한 상황이나 오류를 의미합니다.
예를 들어, 파일을 열려고 했는데 해당 파일이 존재하지 않거나, 네트워크 연결 중에 연결이 끊기는 등의 상황에서 예외가 발생할 수 있습니다.
Rx(Reactive Extensions)와 같은 라이브러리에서는 스트림 처리 중에 발생할 수 있는 다양한 예외 상황들을 고려해야 합니다.
예를 들면:
스트림에서 예상치 못한 데이터가 발생했을 때
스트림 연산 중에 오류가 발생했을 때
스트림을 병합하거나 변환하는 연산 중에 문제가 발생했을 때
이러한 상황들을 대비하여 라이브러리는 특정한 예외나 오류 상황을 정의하고, 이를 통해 사용자에게 명확한 오류 메시지나 정보를 제공합니다. 이는 개발자가 오류 원인을 빠르게 파악하고 적절한 처리를 할 수 있도록 돕습니다.
따라서, "Exceptions"나 "Errors" 섹션은 라이브러리 사용 중에 발생할 수 있는 예외나 오류들에 대한 정의와 설명을 포함하고 있을 것입니다.
얘도 ValueStreamError 정도로 조촐하게 하나 있다.
안에 보면 ValueStreamError.hasNotError(), ValueStreamError.hasNoValue()
이런 식으로 쓰고 끝이다.
여기까지 봤으면 각 클래스와 확장 기능(extension)의 내부를 살펴 보지 않은 것을 제외하고는
볼 만한 건 다 봤다.
다음은 여기까지 공부한 내가 갖게 게 된 고민이다.
패키지 내 여러 라이브러리 중 하나만 봤을 뿐인데도
그 규모에 압도되어 이걸 어떻게 해야 잘 쓸 수 있을지 모르겠다.
이런 패키지와 라이브러리를 어떻게 다루어야 할까?
고민 끝에 내가 정리한 내용은 다음과 같다.
1. 라이브러리의 기본 개념만 알고 일단은 끝낸다.
2. 이 이상을 원하면 공식 문서 및 튜토리얼을 끝낸다.
3. 이 이상을 원하면 작은 프로젝트에 원하는 내용을 바로 도입한다.\
4. 해당 패키지가 사용된 오픈 소스 프로젝트를 분석한다.
5. 원하는 기능을 '습관적으로' 사용한다.
6. 라이브러리의 모든 기능을 아는 건 포기한다. 수준이 좀 더 높아지면 다른 방법을 찾는다.
So,
rx_streams, rx_subjects, rx_transformers, rx_utils를
이번에 깐 것처럼 까진 않을 것이다.
대신 매우 간단하게 보고 내 프로젝트 하러 갈 거다.
이번 포스팅은 여기서 끝!