본문 바로가기

RxSwift

[RxSwift] Subject - ObserverType Encapsulation

반응형

Subject는 RxSwift에서 빼놓을 수 없는 타입으로, 다양한 부분에서 활용이 가능합니다.

 

Subject에 대한 개념적인 내용이 필요하시다면, 이전 포스팅 참고하시면 됩니다.

[RxSwift] - [RxSwift] Subject에 대한 개념 

 

[RxSwift] Subject에 대한 개념

Subject는 RxSwift를 사용하여 프로젝트를 진행할 경우 많이 접하게 될 항목들입니다. 여기에서는 Subject 자체에 대한 설명만 하려 합니다. Subject는 PublishSubject, BehaviorSubject, ReplaySubject세 가지..

ntomios.tistory.com

 

많이 사용하면서 개인적으로 필요하다고 느꼈던 부분은, ObserverType으로써의 기능을 숨기는 것입니다.

 

위 메서드를 사용하여, 구독 중인 Observer들에게 이벤트가 발생했음을 알릴 수 있습니다.

public으로 외부에서 호출이 가능하며, 이 메서드 자체가 Setter의 역할을 한다는 느낌을 받았습니다.

외부에서의 on 메서드를 막고 싶지만, Subject를 Observable로써 구독하기 위해서는 접근 제한자를 열어둘 수밖에 없습니다.

어떻게 해결할 수 있을까 고민하다가 Property Wrapper를 사용하여 해결하고자 했습니다.

 

먼저 Subject에서 on 메서드를 막으며 구독만을 하기 위해서는, Observable의 역할로만 접근이 열려있으면 된다 생각했습니다.

Property Wrapper의 경우, property wrapper 프로퍼티를 소유하고 있는 객체 외부적으로는 wrappedValue, projectedValue

에만 접근이 가능합니다.

반면, property wrapper 프로퍼티를 소유하고 있는 객체 내부적으로는 wrappedValue 외에도 접근 제한자에 따라 다른 프로퍼티들에도 접근이 가능합니다.

 

다음은 이를 활용하여 PublishSubject를 적용한 모습입니다.

 

다음은 간략한 사용 예시입니다.

외부에서는 wrappedValue에만 접근할 수 있다는 것을 알 수 있습니다.

이렇게 함으로써, ViewModel 내에서는 Subject로, 그 외(ViewController)에서는 Observable만으로 사용할 수 있습니다.

 

다음으로 BehaviorSubject에 적용해보겠습니다.

 

PublishSubject와 달리 초기값이 필요하기에, 초기화 단계에서 초기값을 받습니다.

또한, 값을 받을 수 있는 특징을 projectedValue를 통해 적용합니다.

 

마찬가지로 사용 예시를 살펴보겠습니다.

 

 

HideablePublishSubject도 마찬가지로, 외부에서는 wrappedValue 그리고 projectedValue에 까지 접근할 수 있습니다.

또한 마찬가지로, 외부에서는 Observable로 그리고, 최근 값을 사용할 수 있습니다.

 

+ Subject 뿐만 아니라, Relay도 흡사한 방식을 사용하여 만들 수 있습니다.

 

이처럼 Property Wrapper를 사용하여, Subject의 ObserverType으로의 기능을 외부에서 막음으로써, 캡슐화하는 방법에 대해 알아봤습니다.

 

반응형