• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

Single과 관련해 여쭤보고 싶은 부분이 있습니다!

24.04.05 09:37 작성 조회수 64

0

안녕하세요 선생님! 틈틈이 강의 잘 듣고 있습니다.

강의 수강 도중, 궁금한 점이 있어 질문드립니다!

 

  1. Single은 전통적인 client - server 방식의 요청을 처리하는 데 사용한다고 말씀해주셨습니다.

실제로 회사에서 single.blocking() 이런 방식으로 처리하는 코드를 본 적이 있는데, single을 해당 의도처럼 사용할 경우, 동기처리 방식에 비해 얻는 이점이 있을까요??

제가 아직 생각하기로는 코드는 리액티브이지만 비동기 방식으로 처리하는 것이 아닌 거 같아서요!

 

  1. 또한 강의 영상 3분 정도에서 보여주신 SingleCreateExample 코드에서,
    발행자인 Single의 create 메소드의 파라미터인 SingleOnSubscribe<T>가 구현하고 있는 subscribe가

아래 구독자가 구독하는 subscribe() 와 같은 함수가 맞을까요?
코드적으로는 둘이 연관이 있어 보여서, SingleObserver<T>와 SingleEmitter<T> 사이의 같은 부모가 있는지 확인 해보았는데 그것두 아니더라구요 ㅠ...

둘이 아예 다른 메소드 인가요??

4. 코드를 살펴보다가 RxJavaHooks 라는 유틸성 클래스를 발견하게 되었는데, 함수형 인터페이스들이 막 정의되어 있는 것은 알겠는데 어떻게 해석해야 할 지가 감이 안 잡히더라구요 ㅠㅠ... 혹시 코드를 해석하는데 조언을 주실 수 잇으실까요?..

항상 깊게 답변 해주셔서 감사드립니다 :)

답변 2

·

답변을 작성해보세요.

0

안녕하세요. 아침에 질문을 확인했는데 일정이 바빠서 답변이 조금 늦어졌네요. ^^

1. Single은 전통적인 client - server 방식의 요청을 처리하는 데 사용한다고 말씀해주셨습니다.

실제로 회사에서 single.blocking() 이런 방식으로 처리하는 코드를 본 적이 있는데, single을 해당 의도처럼 사용할 경우, 동기처리 방식에 비해 얻는 이점이 있을까요??

제가 아직 생각하기로는 코드는 리액티브이지만 비동기 방식으로 처리하는 것이 아닌 거 같아서요!

--> Single을 전통적인 client - server 방식의 요청을 처리하는데 사용한다라는 의미는 우리가 일반적으로 사용하는 HTTP request와 response가 하나의 HTTP message로 이루어져 있기 때문에 이걸 처리하기 적합하다는 의미이구요.
single.blocking() 방식으로 코드를 본 적이 있다고 말씀해 주셨는데, 여러 개의 비동기 작업이 있어서 이 작업이 다 끝날 때 까지 동기적으로 기다려야 되는 상황이 아닌데 습관적으로 blocking()을 호출하는 방식이라면 바람직하지는 않다고 생각합니다. 즉, 비동기 방식을 습관적으로 동기 방식으로 전환한다면 RxJava 같은 리액티브 라이브러리를 사용하는 의미가 퇴색될 수 있는거라고 생각하시면 될 것 같아요.

  1. 또한 강의 영상 3분 정도에서 보여주신 SingleCreateExample 코드에서,
    발행자인 Single의 create 메소드의 파라미터인 SingleOnSubscribe<T>가 구현하고 있는 subscribe가

아래 구독자가 구독하는 subscribe() 와 같은 함수가 맞을까요?
코드적으로는 둘이 연관이 있어 보여서, SingleObserver<T>와 SingleEmitter<T> 사이의 같은 부모가 있는지 확인 해보았는데 그것두 아니더라구요 ㅠ...

둘이 아예 다른 메소드 인가요??
--> 일단 결론은 다른 메서드인데 서로 연관이 있습니다.
image: 캡쳐한 이미지의 코드를 보시면 SingleCreate은 Single의 하위 클래스인데요. Single.create()을 호출하면 리턴됩니다. (1)의 SingleOnSubscribe는 (4)에서 subscribe()를 호출하는데 이 때의 subscribe()는 구독자가 구독 즉, subscribe()를 호출하면 데이터를 구독자에게 통지하기 위한 emitter를 전달 받는 역할을 한다고 보시면 될 것 같구요. (2)의 SingleObserver를 포함하고 있는 parent 객체가 (3)과 (4)에 서로 연결이 되는걸 볼 수 있는데요. 이 말은 구독자가 구독하면 발행자가 이 구독을 인지하고 데이터를 구독자에게 전달한다라는 의미와 같다고 보시면 될 것 같습니다.

좀 어렵죠? 코드 내부를 다 이해하실 필요는 없고 리액티브 프로그래밍의 Pub/Sub 모델은 서로 독립적인 관계가 아니라 서로 밀접하게 관계를 맺고 있다라는 사실만 일단 기억하시면 좋을 것 같아요.


4. 코드를 살펴보다가 RxJavaHooks 라는 유틸성 클래스를 발견하게 되었는데, 함수형 인터페이스들이 막 정의되어 있는 것은 알겠는데 어떻게 해석해야 할 지가 감이 안 잡히더라구요 ㅠㅠ... 혹시 코드를 해석하는데 조언을 주실 수 잇으실까요?..
--> Hook이라는 의미는 프로그래밍에서 종종 사용하는 용어인데요. 코드 상의 흐름 중간에 끼어 들어서 추가적인 작업을 한다는 의미입니다. RxJavaHooks를 이용해서 Observable이 생성될 때 로깅, 예외 처리, 디버깅 등의 추가적인 작업을 할 수 있도록 해줍니다.

학습하시는데 도움이 되셨길 바랍니다~

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.04.05

안녕하세요, 인프런 AI 인턴입니다.

qpal1zm23님의 질문은 RxJava에서 Single 사용과 그에 관련된 subscribe 메서드의 이해도를 높이는 데 초점을 맞추고 있습니다. 여러분이 질문하신 내용에 대하여 RxJava의 Single 사용법, 그것을 동기적으로 처리할 때의 이점, 그리고 subscribe 메서드의 관계에 대해 알아보겠습니다.

  1. Single의 동기처리 방식과 비동기 방식의 차이점: Single은 단 한 번만 데이터를 발행하는 RxJava의 Observable의 한 종류입니다. 동기 방식에서 Single.blockingGet() 같은 방식으로 처리할 경우, 메인 스레드를 블로킹(막는)하여 해당 작업이 완료될 때까지 다른 작업을 수행할 수 없습니다. 반면, 비동기 방식에서는 subscribeOn()observeOn() 메서드를 이용하여 데이터 발행과 데이터 처리를 서로 다른 스레드에서 실행할 수 있어, 병렬적, 비동기적 처리가 가능해집니다. 이로 인해 I/O 작업 또는 시간이 많이걸리는 작업을 할 때 메인 스레드를 블로킹하지 않아 앱의 반응성을 향상시킬 수 있는 이점이 있습니다.

  2. Single의 create 메소드와 subscribe 메소드의 관계: 실제로 Single의 create 메소드는 SingleOnSubscribe<T> 인터페이스를 파라미터로 받아, 이 인터페이스의 subscribe 메소드를 통해 구현된 로직이 실행됩니다. SingleObserver<T>subscribe 메소드를 호출할 때, SingleOnSubscribe<T>subscribe 메소드 내부 로직이 실행되는 것입니다. 여기서 중요한 포인트는 리액티브 프로그래밍에서 ‘구독(subscribe)‘이라는 행위는 데이터를 발행하는 대상에 대한 관찰을 시작한다는 것을 뜻합니다. Single은 이벤트(데이터) 발생 원리와 구독자가 이벤트를 처리하는 방식을 설계하는 데 사용됩니다.

  3. RxJavaHooks: 이는 RxJava 내부에서 사용하는 다양한 훅(Hooks)을 설정할 수 있게 해주는 유틸리티 클래스입니다. 이 클래스를 이용해 RxJava의 내부 작동 방식에 개입할 수 있으며, 예를 들어 오류 처리나 실행 전/후에 특정 로직을 실행할 수 있게 해줍니다. 하지만 일반적인 RxJava 사용을 위해 깊게 이해할 필요는 없으며, 내부 동작 메커니즘을 변경하거나 커스터마이징 할 때 고급 기능으로 사용됩니다.

관련하여 구체적인 코드 예시, 설명이 필요하다면 첫번째 강의 부터 이번강의까지 수강하면서 궁금한점 질문드립니다. 라는 게시글에서 비슷한 주제로 답변된 내용을 참고하시길 바랍니다. 이 외에도 구독 관련하여 다른 분이 질문한 cold/hot publisher 예제 코드와 관련해 질문 드립니다.도 있습니다. 질문하신 subscribe 메소드의 이해에 도움이 될 수 있을 것 같습니다.

질문 내용에 대한 답변이 명확하지 않거나 추가적인 의문이 있으시면, 좀 더 구체적인 코드 예시를 포함하여 질문해 주시면 감사하겠습니다. 리액티브 프로그래밍은 처음에는 다소 난해할 수 있지만, 익숙해지면 매우 강력한 도구가 됩니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.