RxJava2에서, 관찰 대상에 관찰자를 등록하는 행위인 subscribe와, 이를 편하게 구현하기 위한 Consumer / Action 인터페이스에 대해서 알아봅니다.
📚 TL; DR
Subscribe
- 관찰 객체에 관찰자를 등록하는 행위
- 즉, Stream에 Observer / Subscriber를 등록하여 이벤트 발행 시 각 이벤트별로 어떤 행동을 할 것인지 등록하는 행위
- Stream의 구현체 별로 관찰자의 형태가 다름에 유의
Consumer / Action Interface
- 관찰자를 개발자가 직접 생성하지 않도록 도와주는 Interface
- Consumer / Action의 구현체를 넘기면, subscribe 내부 동작에서 Stream에 맞는 관찰자를 생성 해 주고 있음
📚 Subscribe
📖 Subscribe
Stream에서 발행하는 이벤트를 전달받아 그에 이벤트에 따라 행동을 하기 위해선, 구독자를 관찰 대상에 등록 해야 합니다.
이를 위해 RxJava에선 subscribe
라는 operator가 있으며, 이를 operator를 통해 관찰 대상과 관찰자를 연결 할 수 있습니다. ( docs )
앞서 살펴본 Observer Pattern 포스팅에서는, Custom UI에 Observer interface를 구현하는 방식으로 Observer 구현 객체를 만들었습니다.
1 |
|
1 |
|
이렇게 Observer를 직접 만들어도 되지만, 앞선 포스팅 ( Stream 구현체의 종류 ( Observable / Flowable / Single … ) )에서는, Stream의 구현체 마다 발행하는 이벤트가 달라 관찰자에 필요한 함수가 다를 수 있음을 살펴 보았습니다.
따라서, RxJava2에서는 각 Stream의 관찰자 객체를 개발자가 직접 개발하지 않기 위해, 각 이벤트 마다 할 행동을 정의하여 subscribe operator의 인자로 넘겨 주면, subscribe 함수의 내부적으로 Observer를 생성 해 주고 있습니다.
각 이벤트마다 할 행동을 인자로 받기 위해, RxJava2에서 사용하고 있는 Consumer / Action Interface를 알아 본 뒤, Observable 클래스의 subscribe 함수를 다시 살펴 보도록 하겠습니다.
💡 Consumer
1 |
|
- 제네릭 타입의 변수를 인자로 받는 accept 함수가 존재 하며, 이 함수는 Exception을 던질 수 있음을 확인 할 수 있습니다.
- accept 함수의 구현을 통해 제네릭 타입의 변수를 인자로 받았을 때, 어떤 행동을 할 지 서술 할 수 있습니다.
💡 Action
1 |
|
- Consumer와 다르게 제네릭 타입의 변수를 받지 않으며, Exception을 던질 수 있음을 확인 할 수 있습니다.
- run 함수의 구현을 통해 어떤 행동을 할 지 서술 할 수 있습니다.
💡 Subscribe in Observable
Observable 클래스의 subscribe operator의 구현을 확인해보면 아래와 같습니다.
1 |
|
위에서 부터 4번째 함수 까지는 subscribe를 위해 각 이벤트별로 할 행동을 받는 부분이고, 맨 아래에 있는 함수는 각 이벤트별로 할 행동을 받은 뒤, 옵저버를 생성 해 주는 것을 확인 할 수 있습니다.
즉, 실제로 Observable ( 관찰 대상 )에 Observer ( 관찰자 )를 등록 시킬 때, Observer ( 관찰자 )를 직접 생성 하지 않고도 이벤트 별로 어떤 행동을 할 지 서술하는 것 만으로도 구독을 시작 할 수 있음을 의미합니다.
따라서, 실제로 Observable을 구독 할 때 아래의 형태로 많이 사용합니다.
1 |
|
위와 같이, Observable과 다른 이벤트를 방출하는 Single / Completable 등의 Stream도 각 이벤트별 할 행동을 정의하여 subscribe를 진행 할 수 있으니 꼭 한번 확인 해보시길 추천드립니다.