• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

doOnComplete, doOnError 는 왜 필요한가요?

22.05.22 18:08 작성 조회수 508

0

질문이 있습니다.

doOncomplete, doOnError 메서드라는 게 있다는 건 알겠지만,  "이게 필요한가?"라는 의문점이 계속 생깁니다.

생산자의 doOnComplete 대신에 소비자의 onComplete 를 써도 될거 같고...

에러도 마찬가지로 생산자의 doOnError 대신에  소비자의 onError 를 쓰면 되는게 아닌가요??

답변 1

답변을 작성해보세요.

2

안녕하세요. doOnXXXX() 연산자에 대해서 질문 주셔서 감사합니다.

doOnXXXX() 연산자는 emit되는 데이터 자체를 변경하지 않고 오로지 부수 효과(side-effect)만을 위한 연산자인데 어떤 목적을 가지느냐에 따라서 다르겠지만 주로 디버깅 용도로 많이 사용하고 있습니다.

* 여기서 부수 효과란 어떤 동작을 실행하되 리턴 값이 없는 것을 의미합니다. 실제로 doOnXXXX() 연산자는 파라미터로 리턴 값이 없는 Runnable이나 Consumer 함수형 인터페이스를 가지는것을 볼 수 있습니다.

doOnXXXX() 연산자는 연산자 체인에 1개 이상 추가할 수 있기때문에 예를 들어서 데이터 emit 도중에 error가 발생하면 Subscriber에서 error 객체를 전달받을 수는 있지만 정확하게 어디서 에러가 발생했는지 구체적인 에러 발생 지점을 알기는 힘듭니다. 이 경우 doOnError() 연산자를 에러가 예상되는 연산자에 추가해서 error 발생 지점을 조금 더 구체적으로 찾아내는 용도로 사용할 수 있습니다.

물론 디버깅을 위한 다른 방법들이 존재하지만 doOnXXXX() 연산자도 에러를 디버깅하는 용도로도 사용할 수 있습니다.

그리고 Publisher에서 발생하는 모든 Signal 이벤트를 로그로 기록하는 것이 주목적이라면 doOnXXXX() 연산자를 사용해서 로그를 기록할 수 있을 것 같습니다.

 

궁금증이 조금은 해소가 되시길 바랄게요. 

감사합니다!

식빵님의 프로필

식빵

질문자

2022.05.22

doOnXXX 의 필요성에 대해서 이해했습니다. 감사합니다!

그런데 혹시 여기서 말씀하시는 부수효과를 설명해주실 "리턴 값이 없는 것을 의미한다"라고 하셨는데요, 이 리턴값이 없으므로서 어떤 특징이 있는건가요? 

"어떤 동작"을 하는 것까지는 이해가 되지만, "리턴 값이 없는 것을 의미합니다"는 조금 이해가 안되는 상태입니다.

클로저나 스칼라 같은 함수형 프로그래밍에서 일반적으로 순수 함수의 역할을 어떤 값을 계산해서 반드시 리턴하는 것으로 정의하는데, 리턴 값이 없을 경우 보통 순수 함수의 목적이 아닌 다른 목적으로 작업을 처리한다고 여기며 그때 이 함수를 부수 효과(side-effect)를 위한 함수라고 지칭합니다. 

side-effect라는 용어가 보통은 우리말로 부작용이라는 의미로 많이 사용을 하는데 함수형 프로그래밍에서는 side-effect를 보통 앞에서 설명한 의미로 사용을 합니다.

왜 저런 용어를 쓰는지는 마틴 오더스키 같은 함수형 프로그래밍을 만든 분들한테 여쭤봐야 될 것 같아요. ^^;;

식빵님의 프로필

식빵

질문자

2022.05.24

이런 정의가 있는 줄은 정말 몰랐습니다;;

덕분에 좋은 거 덤으로 알아갑니다. 감사합니다 :)