투케이2K

294. (RxJava) [Subject] BehaviorSubject 사용해 구독 (subscribe) 이전에 발행 된 데이터 1개 및 구독 이후 발행 된 데이터 출력 본문

Java

294. (RxJava) [Subject] BehaviorSubject 사용해 구독 (subscribe) 이전에 발행 된 데이터 1개 및 구독 이후 발행 된 데이터 출력

투케이2K 2022. 12. 30. 19:27

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : RxJava

 

[설 명]

        /**
         * // -----------------------------------------
         * [요약 설명]
         * // -----------------------------------------
         * 1. 개발 환경 : 안드로이드 스튜디오
         * // -----------------------------------------
         * 2. Rx 관련 라이브러리 설치 (build.gradle) :
         *
         * implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
         * implementation 'io.reactivex.rxjava3:rxkotlin:3.0.1'
         * implementation 'io.reactivex.rxjava3:rxjava:3.0.7'
         *
         * // -----------------------------------------
         * 3. Rx 관련 설명 :
         *
         * ReactiveX 는 관찰가능한 절차를 통해 비동기, 이벤트 기반 프로그램을 구성하기 위한 라이브러리 입니다
         * ReactiveX 는 Observer Pattern 옵저버 패턴 을 확장하며, Sequence 를 조합할 수 있는 연산자를 지원 합니다
         * ReactiveX 는 low-level Thread, 동기화, Thread 안전성, non-blocking I/O에 관한 우려를 줄입니다
         * // -----------------------------------------
         * 4. Observable 구분 종류 설명 (Cold / Subject) :
         *
         * RxJava 의 Observable 에는 [Cold (차가운) : Observable] / [Hot (뜨거운) : Subject] 두 종류의 Obsevable 이 있습니다
         *
         * Observable / Subject 차이점 :
         *
         *   - [구독자 등록 기준] : [Observable] : 적어도 한 명의 관찰자가 있을 때 코드가 실행 (구독하기 전까지 데이터를 방출하지 않음)
         *
         *   - [구독자 수 기준] : [Observable] : 유니캐스트 (1:1 전송) 방식으로 옵저버 하나만을 구독 (subscribe) 할 수 있음
         *
         *   - [코드 실행 기준] : [Observable] : Observable 은 단지 하나의 함수이기 때문에 어떤 상태도 가지지 않으므로 모든 새로운 옵저버에 대해 관찰 가능한 create 코드를 반복해서 실행 (주요 버그와 비효율이 발생)
         *
         *   - [구독자 등록 기준] : [Subject] : 관찰자가 없더라도 코드가 실행되고 데이터가 발행 됨 (구독자의 존재 여부 관계없이 데이터 발행)
         *
         *   - [구독자 수 기준] : [Subject] : 멀티캐스트 (1:N 전송) 방식으로 여러개 옵저버를 구독 (subscribe) 할 수 있음
         *
         *   - [코드 실행 기준] : [Subject] : Subject 는 관찰자 세부 정보를 저장하고 코드를 한 번만 실행해 모든 관찰자에게 결과를 제공함
         * // -----------------------------------------
         * */
 

[소스 코드]

    public static void main() {
        Log.i("---","---");
        Log.d("//===========//","================================================");
        Log.i("","\n"+"[A_Test >> main() :: 테스트 함수 동작 실시]");
        Log.d("//===========//","================================================");
        Log.i("---","---");


        // [로직 처리 실시]
        try {

            /**
             * // -----------------------------------------
             * [코드 설명]
             * // -----------------------------------------
             * 1. Subject 는 생성자와 관찰자 특징을 모두 가지고 있는 클래스 입니다
             * // -----------------------------------------
             * 2. Subject 는 멀티캐스트 (1:N 전송) 방식으로 여러개 옵저버를 구독 (subscribe) 할 수 있습니다
             * // -----------------------------------------
             * 3. BehaviorSubject : 구독 (subscribe) 이전 발생된 이벤트가 1개 라도 있으면 구독 시점에 해당 이벤트 (1개) 를 전달 받음
             * // -----------------------------------------
             * 4. subscribe() : 구독자 입니다 (Observable 데이터 발행 확인)
             * // -----------------------------------------
             * 5. 흐름 설명 :
             *
             * 1 번 구독자는 onNext 발행 된 모든 데이터 [안녕, 반가워, 잘가, 또 만나] 를 출력하지만,
             * 2 번 구독자는 이전에 발행 된 [안녕, 반가워] 에서 [반가워] 1개, 구독 시점 이후로 발행 된 [잘가, 또 만나] 총 3개 데이터를 출력
             * // -----------------------------------------
             * */


            // [BehaviorSubject 생성]
            BehaviorSubject<String> subject = BehaviorSubject.create();


            // [1 번 : 구독자 생성]
            subject.subscribe(
                    value -> {
                        Log.i("---","---");
                        Log.d("//===========//","================================================");
                        Log.i("","\n"+"[A_Test >> main() :: [1] 번 구독자 :: onNext()]");
                        Log.i("","\n"+"-----------------------------------------");
                        Log.i("","\n"+"[value :: "+ value +"]");
                        Log.d("//===========//","================================================");
                        Log.i("---","---");
                    },
                    error -> {
                        Log.i("---","---");
                        Log.e("//===========//","================================================");
                        Log.i("","\n"+"[A_Test >> main() :: [1] 번 구독자 :: onError()]");
                        Log.e("//===========//","================================================");
                        Log.i("---","---");
                    },
                    () -> {
                        Log.i("---","---");
                        Log.w("//===========//","================================================");
                        Log.i("","\n"+"[A_Test >> main() :: [1] 번 구독자 :: onComplete()]");
                        Log.w("//===========//","================================================");
                        Log.i("---","---");
                    });


            // [데이터 발생 실시]
            subject.onNext("안녕");
            subject.onNext("반가워");


            // [2 번 : 구독자 생성]
            subject.subscribe(
                    value -> {
                        Log.i("---","---");
                        Log.d("//===========//","================================================");
                        Log.i("","\n"+"[A_Test >> main() :: [2] 번 구독자 :: onNext()]");
                        Log.i("","\n"+"-----------------------------------------");
                        Log.i("","\n"+"[value :: "+ value +"]");
                        Log.d("//===========//","================================================");
                        Log.i("---","---");
                    },
                    error -> {
                        Log.i("---","---");
                        Log.e("//===========//","================================================");
                        Log.i("","\n"+"[A_Test >> main() :: [2] 번 구독자 :: onError()]");
                        Log.e("//===========//","================================================");
                        Log.i("---","---");
                    },
                    () -> {
                        Log.i("---","---");
                        Log.w("//===========//","================================================");
                        Log.i("","\n"+"[A_Test >> main() :: [2] 번 구독자 :: onComplete()]");
                        Log.w("//===========//","================================================");
                        Log.i("---","---");
                    });


            // [데이터 발생 실시]
            subject.onNext("잘가");
            subject.onNext("또 만나");


            // [onComplete 완료]
            subject.onComplete();

        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
 

[결과 출력]

 

D///===========//: ================================================
I/: [A_Test >> main() :: [1] 번 구독자 :: onNext()]
I/: -----------------------------------------
I/: [value :: 안녕]
D///===========//: ================================================

D///===========//: ================================================
I/: [A_Test >> main() :: [1] 번 구독자 :: onNext()]
I/: -----------------------------------------
I/: [value :: 반가워]
D///===========//: ================================================

D///===========//: ================================================
I/: [A_Test >> main() :: [2] 번 구독자 :: onNext()]
I/: -----------------------------------------
I/: [value :: 반가워]
D///===========//: ================================================

D///===========//: ================================================
I/: [A_Test >> main() :: [1] 번 구독자 :: onNext()]
I/: -----------------------------------------
I/: [value :: 잘가]
D///===========//: ================================================

D///===========//: ================================================
I/: [A_Test >> main() :: [2] 번 구독자 :: onNext()]
I/: -----------------------------------------
I/: [value :: 잘가]
D///===========//: ================================================

D///===========//: ================================================
I/: [A_Test >> main() :: [1] 번 구독자 :: onNext()]
I/: -----------------------------------------
I/: [value :: 또 만나]
D///===========//: ================================================

D///===========//: ================================================
I/: [A_Test >> main() :: [2] 번 구독자 :: onNext()]
I/: -----------------------------------------
I/: [value :: 또 만나]
D///===========//: ================================================

W///===========//: ================================================
I/: [A_Test >> main() :: [1] 번 구독자 :: onComplete()]
W///===========//: ================================================

W///===========//: ================================================
I/: [A_Test >> main() :: [2] 번 구독자 :: onComplete()]
W///===========//: ================================================

 

반응형
Comments