Taehyeon-Kim/SeSAC

MVVM Input/Output Modeling and Use Single Traits

Taehyeon-Kim opened this issue · 1 comments

MVVM Input/Output에 대한 생각


개인적으로 화면에 대한 Output을 먼저 생각해놓고 생각을 하는게 편했다.

  1. 실질적인 내부 구현은 모두 ViewModel에서 처리가 되기 때문에 최종적으로 구독을 해서 UI에 바인딩해주는 부분만 신경을 쓰면 역할을 분리해내는 작업이 한결 편해졌다.
  2. 네트워크 통신을 해서 받아온 데이터의 처리를 어떻게 해야할지 고민을 했었다.
    • 네트워크 통신의 결과를 어떤 형태로 반환할지도 생각해 볼 포인트가 될 수 있다.
      • 데이터 원본을 받아와서 ViewModel 단에서 onNext 또는 accept의 형태로 Value를 직접 넣어줄지 아니면 네트워크 통신 결과도 Observable형태로 반환해서 ViewModel 단에서 직접 사용하거나, Subscribe를 해주어야 할지 생각해보게 되었다.
      • 개인적으로 후자가 더 맞는 것 같은 것이, 네트워크 요청 후에 스트림을 이어서 로직을 처리해주는 상황도 충분히 있을 수 있다고 생각한다. map, flatMap 등을 통해서 가공하고 그 다음 스트림으로 넘겨주는 상황을 생각해볼 수 있다.

Single Traits?


https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Traits.md

대부분의 블로그가 공식 문서의 예제를 그대로 적어놓거나 해서 결국에는 공식 문서를 보고 이해하는 것이 정답이 되어버렸다. (평소에 이것저것 열어놓고, 결국에 맨처음에 보던 글로 돌아가는 나… 자세를 좀 바꿔야 할 듯)

Single은 Observable의 variation이다. (베리에이션 생각보다 많이 듣는 것 같다..) 말 그대로 입맛에 맞게 변형을 준 것이다. 일련의 요소들을 방출하는 것이 아니라 항상 단일 요소 또는 에러의 방출을 보장하는 녀석이다. 좀 더 쉽게 말하자면 성공 또는 실패 방출하고 끝! 이라는 것이다.

image

공식문서에서도 일반적인 유즈케이스로 Response와 Error를 반환하는 HTTP 요청을 수행하는 상황을 이야기하고 있다. (+ DB 접근도 비슷하게 생각해볼 수 있다.) 그리고 Single은 단일 요소를 방출하는 경우에 사용되고, 무한 스트림에서는 사용되지 않는다.

위의 마지막 문장에 대한 의미가 뭐냐면, Single Observable은 성공 또는 실패의 결과를 방출하고 dispose 된다는 의미다. 실제로 테스트해보면 요소를 방출하고 구독이 종료된다. Next, Error 이벤트만 처리한다고 생각하면 되고, Completed 이벤트는 방출하지 않는다는 점이 특징이라고 할 수 있다.

이 녀석도 한 번 수행하고 종료되기 때문에, 주기적으로 통신을 해야하는 경우 다시 구독을 해주는 방법으로 해결할 수 있다.