관찰자 구독의 시대 Observable

뚱이 일상생활에서도 정기적으로 구독을 하고 편리한 삶을 살아갑니다.
대표적으로 구독이라는 말은 유튜브에서 매우 친숙한 친구입니다.
일상생활에서도 세탁구독, 수건구독등 상상외의 구독이 존재하죠
일상생활에서의 구독도 비동기처럼 살아 갈 수 있도록 도움을 줍니다. (멀티쓰레드는 아니지만요.)

관찰과 구독

기본적인 동작 구조
1. 관찰자가 해당 코드를 구독하여 관찰합니다.
2. 상태가 바뀔때 관찰자가 알려줍니다.
3. 관찰자가 알려준 응답으로 처리를 합니다.

Reactive Programming

Reactive Programming is programming with asynchronous data streams.

Reactive 프로그래밍은 비동기적 데이터 흐름을 처리하는 프로그래밍입니다.

비동기적인 데이터를 Stream으로 간주하고, Observer 디자인 패턴을 활용하여 비동기 이벤트 처리를 하는 것에 있습니다.

이러한 패턴을 사용하면 흔히 CallBack지옥이라고 불리는 곳을 탈출 할 수 있습니다.

콜백

코드도 구독하는 트랜드

셀메이트는 앱이 로딩시 유료정보서비스와, 사용자 정보를 함께 가져와서 저장하고 둘중 하나라도 실패하면 다음으로 진행이 안되어야 하는 구조였습니다.

그렇기에 Merge를 하여 error 상황과 complete 상황을 제어하여 관리하도록 작성하였습니다. (서로서로 콜백제어을 안해도 되는 상황이죠)

머지

  • 예시 구현
  • 각 API에서 Observable를 리턴하여 다음과 같이 merge후 동시에 Request를 보낼수도 있습니다.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
private fun settingInfo(domain: String) { 
        Observable.merge(userObserveApi(domain), feeObserveApi(domain)).subscribe({
            when (it.code()) {
                200 -> {
                    val res = it.body()
                    when (res) {
                        is u1 -> {
                            // 유저정보 저장
                        }
                        is f1 -> {
                            // 유료서비스정보 저장
                        }
                    }
                }
            }
        }, {
           // 오류 핸들링
        }, {
           // 성공 핸들링
        })
}

위와같이 구현을 할 수있었고, userObserveApi, feeObserveApi 두개의 관찰자가 Subscribe를 하여 응답을 받을 수 있도록 구현하였습니다.

관찰을 하고 있다가 응답이 오면, 각 응답의 타입에 따라 저장로직을 시행 할 겁니다.

두개 모두 완료가 되면 성공 핸들링을 하게 되어 모두 완료되었을때 다음 진행을 할 수 있고, 오류도 역시 따로 핸들링을 할 수 있습니다.

구독을 하고 그동안 다른 프로세스를 처리하고 있고, 상황에 따라서 유연적으로 처리 할 수 있다는 장점 있습니다. 성능적인 이점은 덤이죠.

옵져빙

RIP AsyncTask Use Reactive!

AsyncTask의 Deprecated

AsyncTask was intended to enable proper and easy use of the UI thread. However, the most common use case was for integrating into UI, and that would cause Context leaks, missed callbacks, or crashes on configuration changes. It also has inconsistent behavior on different versions of the platform, swallows exceptions from doInBackground, and does not provide much utility over using Executors directly.

AsyncTask는 2019년 11월 8일에 공식적으로 Deprecate가 되었습니다.

비석

  • 단점 및 이유
    • 일회성 코드 (재사용이 불가능)
    • 종료를 명시해야 종료가됨, 즉 메모리 누수가 발생
    • 항상 UI쓰레드 위에서 불러야함.
    • 순차적 실행으로 속도저하
    • 취소만 가능하고 예외처리 핸들러가 없음

결국 위와같은 단점투성이라는 이유로 Deprecate가되었습니다.

Reactive Reactive Reactive

리액티브 프로그래밍 자체는 진입장벽이 높다고 개인적으로 생각합니다.

리액티브 프로그래밍은 이미 뜬 트랜드이고, 근래에는 필수적으로 요구하는 사양이라고 생각합니다.

글로 좀더 자세하게 풀어내고 싶었지만 다양하게 좀더 사용해보고 실제로 사용하지 않으면 알수가 없을정도로 장벽이 좀 있는편이라서 직접 사용해보는것을 추천드립니다. (저 역시 아직도 모르겠어요)

https://reactivex.io/documentation/observable.html 를 참조하셔서 좀더 리액티브를 좀더 참조하시면 좋을거 같습니다.