오랜만에 인사드리는 킴스캐슬입니다
방학이 시작되었습니다! 물론 공부할건 여전히 많지만 이번 3개월동안에는 rxswift를 조금집중적으로 파볼생각입니다
rxswift, rxflow, reactorkit 등등 할게 많군요...다 할겁니다!
제가 combine을 공부할때 오픈소스 뜯어보면서 공부하다보니 필요이상으로 정말 많은시간이 소요되었었고 뭔가 정말 비효율적인 공부방법이라고 생각을 했었습니다 ㅎㅎ... 주변에서도 굳이 그렇게까지 하지 않아도된다고 이야기하기도 했지만 물론 시간대비 효율은 안나오는 공부방식이지만 저는 그렇게 코드를 뜯어보고나서 combine에 대한 자신감이 생기기도 했고 좋은 코드를 보면서 알게모르게 배웠던 것도 있었던거같아요
때로는 가장 힘든 길이 가장 빠른길이다-하이큐-
글을 적으면서 공부하는 저도 우연하게 흥미를 가지고 제 글을 보시는 개발자분들에게도 어렵고 힘든시간이 되겠지만 한번 시작해보시죠!
rxswift나 combine이나 reactive programing의 기초는 값을 보내는 녀석이 있고 값을 받는 녀석이 있다는 겁니다
combine에선 값을 보내는 녀석을 publisher라고 하고 rx에서는 observable이라고 합니다
값을 받는 녀석은 combine에서 subscriber, rx에서는 observer라고 하죠
사실 큰 그림으로는 이게 다일겁니다
근데 값을 주는 녀석은 그 자체만으로 누구한테줘야할지를 모릅니다 그렇기때문에 구독이라는 개념이 필요합니다. 즉, 정해진 녀석에게만 값을 준다인겁니다
근데 대체 어떻게 그걸 코드로 구현했을까가 궁금했습니다
가장 쉬운 코드를 하나 볼까요?
let testObservable = Observable<Int>.just(1)
testObservable
.subscribe(onNext: {
print($0)
})
.disposed(by: self.disposeBag)
자, 이코드를 보면 rxswift를 조금이라도 공부해보셨던 분이라면 누구나 1이라는 값이 print될거라는걸 알수있습니다. 근데 여기서 약간 찜찜한 부분은 없으셨나요...? 값을 보내는 녀석이 testObservable인건 알겠는데 대체 값을 받는 녀석은 누굴까요?
일반적인 생각으로는 이게 맞을겁니다

근데 코드를 보면 누가 값을 받는지 잘 모르겠습니다. 값을 받는녀석은 저 코드에서 대체 어디있는걸까요...?
그걸 알기 위해서는 우리가 subscribe()라는 메서드에 대해서 알아야합니다
우리가 자주쓰는 subscribe(onNext:{})가 아닙니다
rx에서 만약에 값을 방출하는 Observable이라면 모두 ObservableType이라는 protocol을 채택하고있습니다. 소스코드를 볼때도 이게 observer인지 observable인지 헷갈린다면 그 객체가 어떤 protocol을 채택하고 있는지를 보면됩니다

모든 Observable객체는 subscribe()메서드를 가지고 있습니다
그리고 해당 메서드의 인자로 Observer라는 프로토콜 타입을 채택한 객체를 넣어줘아합니다
결국 누가 누구에게 주는지를 명시해주고 결정해주는 메서드는 해당 메서드였던겁니다(subscribe(onNext:{})가 아니었던거죠)
근데 눈치 빠르신분들은 여기서 눈치채신게 있을겁니다. 대충보니 subscribe(onNext:{})내부에 subscribe()를 실행할것만 같은 느낌이 있죠
여기서 subscribe에 대한 공식문서를 잠깐 보고 넘어가겠습니다
https://reactivex.io/documentation/ko/operators/subscribe.html (subscribe에 대한 공식문서)
중요한 내용은 Subscribe가 Observable에 Observer를 연결해주는 역할을 해주는 연산자(Operator)라는겁니다. subscribe는 observable도 observer도 아닌 operator다알고가시면 좋을거같네요!

지금부터는 우리가 맨날쓰는 subscribe(onNext:_)에 대해 알아볼겁니다
분명 우리는 실질적으로 구독해주는 subscribe(_ observer: Observer)를 쓰지도 않았는데 누가 누구한테 값을 보내햐하는지 결정이 되었고 실제로 값도 잘 보내지게됩니다
그러면 subscribe(onNext:_)안에서 어떤 방식으로든 subscribe(_ observer: Observer)를 사용하고 있다는 뜻이겠죠
그리고 모든 observable에서 subscribe(onNext:_)를 쓸수있는걸로 보아 Observable이 채택하고있어야할 ObservableType의 protocol의 extension쪽을 찾아보면 해당 코드를 발견할수있습니다

해당 메서드에서 봐야할 부분이 두군데인데 우선 첫번째 포인트입니다
우리가 subscribe(onNext:_)라는 메서드가 실행되면 내부에서 observer를 만드는 코드가 있습니다
그리고 그 observer의 타입은 AnonymousObserver인데 익명의옵저버라고 하니까 뭔가 이름을 기똥차게 지은것같네요
그럼 AnonymousObserver가 뭔지 한번 보러 가보죠

특별한 기능은 없습니다 처음에는 EventHandler라는 클로저를 받네요 클로저는 Event를 받에서 void를 반환해주는 클로저입니다. initalize에서 해당 클로저를 받아 저장해놓고 실행을 스스로 하진 않네요. onCore라는 메서드를 실행시키면 그제서야 인자로들어온 Event를 클로저에 전달해 eventHandler를 실행시켜주는 구조입니다
우선 subscribe(onNext:_)를 실행시키면 AnonymousObserver를 생성시킨다는건 알았고 그게 어떤건지까지 알아봤습니다
다시subscribe(onNext:_)로 돌아가서 두번째 부분을 확인해봅시다

우선 Dispoable.create라는 메서드의 결과값을 return해주는데 이건 우선 넘어갑시다 하지만 중요한 부분이있습니다. self.asObservable().subscribe(observer)부분입니다. 여기서 우리가 그토록 찾던 subscribe(_ observer: Observer)를 쓰고 인자로 만들어뒀던 AnonymousObserver를 넣어주네요!
그러면 여기서 우리가 처음본건 self.asObservable()뿐이니까 이부분을 알아내면 되겠네요
self는 뭘까요? 다시 코드를 보면 쉽게 알수있습니다
let testObservable = Observable<Int>.just(1)
testObservable
.subscribe(onNext: {
print($0)
})
.disposed(by: self.disposeBag)
self는 subscribe(onNext:_)를 호출한 주체니까 
이친구가 되겠네요 당연히 asObservable을 해당 객체가 가지고 있겠죠?

그런데 객체에 asObservable이라는 메서드가 없네요?
rx의 코드를 뜯어보니까 내부 코드에 바로 해당 메서드가 있기보다는 상속된 메서드를 사용하는 경우가 많더라고요...그래서 혹시나 여러분들도 rx코드를 뜯어보려고 cmd+클릭 하다가 메서드가 없으면 상속받은 클래스를 들어가보시면 됩니다
Producer가 뭔지는 모르겠으나 상속받은 클래스니까 들어가보면 사실 여기도 없습니다...그리고 Producer는 또 Observable이라는 클래스를 상속받고있기때문에 Observable로 들어가봐야합니다 그러면 드디어

asObservable을 찾을수는 있는데 좀 허무하죠... 자기자신을 return시키면됩니다
그러니까 그냥 Just가 반환되는거죠
그러면 정리해보면 self.asObservable().subscribe(observer)는 그냥 Just객체.subscribe(observer)가 되는거죠
그럼 Just에있는 subscribe메서드를 실행시키고 인자로 AnonymousObserver를 넣어주면 되겠네요

그러면 AnonymousObserver의 on이라는 메서드에 .next(self.element)를 인자로 넣어주고 실행시키고 .on이라는 메서드에 .completed를 인자로 넣어서 실행시켜주면 됩니다
AnonymousObserver의 on메서드를 보죠
짜잔! 하지만 없습니다... 계속 어디서 많이 봤던 상황이죠 ㅎㅎ
ObserverBase로 가봅시다

여기있네요 ㅎㅎ 그러면 우리 .next(self.element)가 전달되었을때를 보죠
event중에서 .next가 전달되었을테니까 if문에 들어간다면(이게 무슨 분기처리인지는 모르겠으나) self의 onCore라는 이벤트에 그대로 event를 전달해줍니다(.next(self.element))
onCore혹시 기억나시나요???
AnonymousObserver에대해서 알아볼때 우리가 클로저를 받았던 부분에 이런 설명을 드렸습니다
특별한 기능은 없습니다 처음에는 EventHandler라는 클로저를 받네요 클로저는 Event를 받에서 void를 반환해주는 클로저입니다. initalize에서 해당 클로저를 받아 저장해놓고 실행을 스스로 하진 않네요. "onCore"라는 메서드를 실행시키면 그제서야 인자로들어온 Event를 클로저에 전달해 eventHandler를 실행시켜주는 구조입니다
여기서 self는 AnonymousObserver이고 onCore를 실행하게됩니다. onCore를 실행하면 AnonymousObserver를 선언할때 initalize로 넣어줬던 클로저에 event를 전달하고 실행해줍니다
그리고 .next를 통해 전달된 연관값을 onNext(여기서는 print($0)라는 클로저겠네요)라는 클로저에 넣어줍니다 1이라는 값이 들어왔고 그 값을 출력하라는 클로저였으니 비로소 1이라는 값이 출력되게될겁니다
그리고나서 .completed도 호출되게 될겁니다 onComplete라는 클로저가 nil이 아니었다면 실행될겁니다
지금까지 Just라는 값을 단순히 방출하고 complete를 방출하는 가장 간단한 Observable의 구독에 대해서 알아봤습니다. 사실 메인 주제는 subscribe(onNext:_)였습니다
어쨋든 Observable의 경우엔 subscribe(onNext:_)를 사용하면 메서드 내부에서 AnonymousObserver를 만들고 값이 들어올때 그 값을 어떻게할지를 클로저로 받아놓고 onCore가 불리기를 기다립니다
그리고 나서 Just의 경우엔 Just와 AnonymousObserver를 subscribe해주면 Just가 특정 값을 AnonymousObserver의 on이라는 메서드를 통해 전달해주고 on이라는 메서드를 실행하면 onCore메서드를 실행시켜줍니다 그리고 불리기를 기다리던 onCore가 그 값을 가지고 특정 action(여기서는 print문으로 출력)을 하게됩니다
제가 여기서 Just경우엔 이라고 한이유는 onCore가 불리기까지의 과정이 모든 Observable이 Just랑 동일하지는 않습니다. 그래서 다음 포스팅에서는 Just가 아닌(사실 우리가 Just를 자주쓰지는 않잖아요ㅎㅎ..) 자주쓰는 Observable인 create를 subscribe할때 어떤 방식으로 동작하는지를 알아볼예정입니다. subject도 하고싶은데 너무 하나의 주제만 하는건 좀 그래서 고민중입니다 ㅎㅎ
우선! 다음 포스팅에서는 create로 만든 observable은 어떻게 subscribe되는지 이야기해보도록하겠습니다!!
그럼 20000!