• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

딜레이 예제 2에서 flatMap과의 차이는 무엇인가요?

21.03.21 11:46 작성 조회수 117

0

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()로 작성하고 설명을 했었더라면 좋았을 것을... 이라는 아쉬움이 남네요. ^^;

뒤늦게라도 설명을 드릴수 있도록 질문을 남겨주셔서 감사합니다. 질문에 대한 답변 내용은 다른 수강생들도 알 수 있도록 공지로 남기도록 하겠습니다.

다른 궁금한점이 있으시면 언제든지 질문으로 남겨주시면 감사드릴게요.

그럼 휴일 마무리 잘 하시고, 내일 한 주 잘 시작하시길 바라겠습니다.
감사합니다. 

myrtlepn님의 프로필

myrtlepn

질문자

2021.03.22

강의도 친절하시고 답변도 친절하시고

정말 감사드립니다 ㅋㅋ

이해에 많은 도움이 되었습니다

도움 되셨다니까 기쁘구요. 리액티브 프로그래밍은 Spring MVC나 안드로이드, React, Angular 등등 인기있는 기술들에 비해서 상대적으로 덜 알려져있는데 위에서 언급한 기술들에 알게모르게 다 포함이 되어 있을만큼 중요한 기술이라고 생각되네요. 잘 익히셔서 경쟁력 있는 개발자가 되시길 바래보겠습니다. ^^ 감사합니다!