딜레이 예제 2에서 flatMap과의 차이는 무엇인가요?
214
작성한 질문수 2
delay함수 내에 sleep을 넣지 않으면
구동하는 내용 자체는 flatMap과 같은데
혹시 그 둘의 차이점에 대해 알 수 있을까요?
실제로 예제에서도 flatMap으로 수정해봐도
동일하게 구동하는것을 알 수 있었습니다.
답변 1
1
myrtlepn 님, 안녕하세요?
질문 등록해주신건 바로 확인했는데, 답변이 좀 늦었네요. 주말에는 하루종일 아기를 돌봐야해서 밤에 재우고 난후에 답변 드리는점 양해 부탁드리겠습니다.
참 좋은 질문을 해주셨는데요. 일반적으로 delay 함수는 원본 데이터소스의 첫번째 데이터의 통지 즉, 데이터 통지 시작을 지연시키는데 많이 사용하는데 통지 되는 각각의 데이터를 일정 시간만큼 지연 시키는 기능은 상대적으로 많이들 사용하지 않아서 제 설명이 부족했나봅니다.
아래 소스로 차이점을 설명 드리겠습니다.
public static void main(String[] args) {
Observable
.just(1,3,5,7)
.delay(item -> {
Logger.log("# item : " + item);
TimeUtil.sleep(1000L);
/**
* 새로운 Observable의 통지 시점에,
* 원본 데이터를 통지한다.
*/
return Observable.empty();
}).subscribe(data ->
Logger.log(LogType.ON_NEXT, data));
}
제가 작성한 ObservableDelayExample02 예제 코드는 delay 함수의 return 값으로 Observable.just(item)을 반환을 하는데, 위 코드에서는 Observable.empty()로 통지되는 데이터 자체가 없는 비어있는 Observable을 반환을 합니다.
그럼에도 불구하고 위 코드를 실행해보시면 1, 3, 5, 7이 소비자 쪽에 최종적으로 전달이 될 수 있는걸 볼수가 있습니다.
결론적으로 delay 함수에서 반환하는 Observable의 역할은 이 Observble이 데이터를 통지하는 시점까지 원본 데이터소스의 데이터 통지를 지연시키는것만이 목적이고 이 Observable에서 통지되는 데이터가 소비자 쪽에 전달이 되지는 않습니다. 그렇기때문에 원본 데이터가 아닌 다른 데이터를 통지하더라도 소비자 쪽에 최종적으로 전달이 되는 데이터는 delay 함수를 호출하기전의 원본 데이터소스에서 통지된 데이터가 되겠습니다.
delay 함수에서 return되는 Observable에서 통지되는 데이터들은 그냥 버려진다고 생각하시면 될거 같아요.
반면에 flatMap 함수는 faltMap 함수에서 return 되는 Observable에서 통지한 데이터들이 최종적으로 소비자쪽에 전달이 되겠죠? 위 코드에서 delay 함수를 flatMap 함수로 바꾸어 실행을 하게 되면 소비자 쪽에는 1, 3, 5, 7이 전달되는 것이 아니라 원본 데이터소스의 데이터를 통지하지 않고, 완료 통지만 소비자 쪽에 전달을 합니다.
차이점이 이해가 되셨죠? 그냥 제가 예제코드에서 delay 함수의 return 값을 Observable.just(item)가 아니라 Observable.empty()로 작성하고 설명을 했었더라면 좋았을 것을... 이라는 아쉬움이 남네요. ^^;
뒤늦게라도 설명을 드릴수 있도록 질문을 남겨주셔서 감사합니다. 질문에 대한 답변 내용은 다른 수강생들도 알 수 있도록 공지로 남기도록 하겠습니다.
다른 궁금한점이 있으시면 언제든지 질문으로 남겨주시면 감사드릴게요.
그럼 휴일 마무리 잘 하시고, 내일 한 주 잘 시작하시길 바라겠습니다.
감사합니다.
0
도움 되셨다니까 기쁘구요. 리액티브 프로그래밍은 Spring MVC나 안드로이드, React, Angular 등등 인기있는 기술들에 비해서 상대적으로 덜 알려져있는데 위에서 언급한 기술들에 알게모르게 다 포함이 되어 있을만큼 중요한 기술이라고 생각되네요. 잘 익히셔서 경쟁력 있는 개발자가 되시길 바래보겠습니다. ^^ 감사합니다!
Single과 관련해 여쭤보고 싶은 부분이 있습니다!
0
264
2
cold/hot publisher 예제 코드와 관련해 질문 드립니다.
0
363
1
CompletableObserver 클래스의 람다식 표현관련
0
296
1
1강에 예시로 보여주신 ToDoSample 코드에 관해 질문 드립니다!
0
356
1
데이터 결합 연산자 / merge 관련 질문
0
445
1
DROP 배압 전략에 관한 궁금증
0
300
2
map에서의 TimeUtil.sleep에 관한 궁금점
0
215
1
강의 내용을 정리해서 개인 블로그에 올려도 될까요?
0
562
2
TimeUtil.sleep 관련 질문
0
286
1
배압 전략 중에서 DROP 전략과 관련해서 질문 있습니다.
0
334
1
Error 발생 시에도 계속 처리 방법
0
689
2
선언형 프로그래밍과 명령형 프로그래밍
1
784
2
첫번째 강의 부터 이번강의까지 수강하면서 궁금한점 질문드립니다.
0
325
1
안녕하세요. 질문이 있습니다.
1
354
1
logger 가 없는데 util 폴더도 같이 갖다놔야 하나요?
0
327
1
amb 연산자
0
233
1
질문 드립니다.
0
218
1
concatEager( ) 연산자에 관하여
0
318
1
Reactive Streams의 구성요소들과 RxJava의 구성요소들의 관계?
1
397
2
ObservableSequenceEqualExample.java 예제의 delay( ) 연산자 질문있습니다
0
309
3
defer( ), fromFuture( )도 just( )처럼 여러 인자 값을 받을 수 있는지 궁금합니다.
0
264
3
flatMapSingle() 메소드에 대하여
0
620
6
fromFuture() vs fromCallable() 생성 연산자에 대해
0
573
2
함수형 인터페이스 Comparator에 대해
0
397
2





