투케이2K

12. (TWOK/STUDY) [투케이 학습] : Rx - Reactive Programming 반응형 프로그래밍 학습 정리 본문

투케이2K 학습정리

12. (TWOK/STUDY) [투케이 학습] : Rx - Reactive Programming 반응형 프로그래밍 학습 정리

투케이2K 2023. 8. 22. 21:27
반응형

[제 목]

[투케이 학습] : Rx - Reactive Programming 반응형 프로그래밍 학습 정리

 

[설 명]

[1] : 반응형 프로그래밍 (Reactive Programming) / Rx 설명

  • 반응형 프로그래밍 (Reactive Programming) :
    • 반응형 프로그래밍 이란 데이터 흐름과 전달에 관한 프로그래밍 패러다임 입니다 (Observer Pattern 옵저버 패턴에 기반)
    • 반응형 프로그래밍 은 데이터의 흐름을 먼저 정의하고, 데이터가 변경되었을 때 [연관된 작업] 을 수행합니다
    • 반응형 프로그래밍 은 프로그램이 주도하는 것이 아니라 환경이 변하면 이벤트를 받아 동작하도록 만드는 프로그래밍 기법 입니다
  • Rx (ReactiveX) :
    • ReactiveX 는 관찰가능한 절차를 통해 비동기, 이벤트 기반 프로그램을 구성하기 위한 라이브러리 입니다
    • ReactiveX 는 Observer Pattern 옵저버 패턴 을 확장하며, Sequence 를 조합할 수 있는 연산자를 지원 합니다
    • ReactiveX 는 low-level Thread, 동기화, Thread 안전성, non-blocking I/O에 관한 우려를 줄입니다
  • RxJava (Reactive java) :
    • Reactive Programming 패러다임을 자바에서 구현한 프로그래밍 라이브러리 입니다
    • RxJava 는 함수형 프로그래밍 방식을 도입했으며, Side Effect 가 없는 순수 함수를 지향하기 때문에 Thread-Safe 합니다
  • RxAndroid (Reactive Android) :
    • RxJava에 안드로이드용 스케줄러 등 몇 가지 클래스를 추가해 안드로이드 개발을 쉽게 해주는 라이브러리 입니다

 

[2] : Rx 작성을 위한 Build Gradle 기본 환경 구성 방법

  • 툴 : AndroidStudio
  • build.gradle 파일 dependencies :
    • implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
    • implementation 'io.reactivex.rxjava3:rxjava:3.0.7'
    • implementation 'io.reactivex.rxjava3:rxkotlin:3.0.1'


[3] : 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 는 관찰자 세부 정보를 저장하고 코드를 한 번만 실행해 모든 관찰자에게 결과를 제공함


[4] : Observable 기본 개념

  • Observable (생성자 / 관찰할 수 있는 객체) : Observable 이 데이터를 발행 하고 알림 (Event) 을 보내면 Observer 옵저버 는 Observable 생성자 를 구독 (Subscribe) 해 데이터를 소비 (Consume) 한다
  • Observable 의 데이터 발행 :
    • onNext() : 데이터의 발행을 알림
    • onError() : 오류가 발생했음을 알림 (이후에 onNext와 onComplete가 발생하지 않음)
    • onComplete() : 모든 데이터의 발행이 완료되었음을 알림 (딱 한 번만 발생하며 이후에 onNext가 발생하면 안됨)
  • Observable 의 Subscribe :
    • 구독 (Subscribe) 이란 수신 받은 데이터를 가지고 할 행동을 정의하는 것 입니다
    • onComplete() 이벤트가 발생하면 Observable 이 더 이상 데이터를 발행하지 않도록 구독을 해지합니다
  • Observable 의 종류 :
    • Observable : 가장 기본적인 형태, 0개~N개의 데이터 발행 (BackPressure 없음)
    • Single : 단 1개의 데이터, 혹은 오류 발행
    • Completable : 성공 혹은 실패 결과만 발행
    • Maybe : 0개 또는 1개 완료
    • Flowable : 0개~N개의 데이터 발행 (BackPressure 존재)
  • Observable 의 생성 종류 (자주 사용 기준) :
    • just() : 가장 간단한 생성 방식으로 함수에 인자로 넣은 데이터를 그대로 차례대로 발행 (인자로 10개 까지 전달), 자동으로 onNext, onComplete 혹은 onError가 호출 됨
    • create() : 프로그래머가 직접 onNext, onComplete, onError를 호출해야함 (just 와의 차이점)
    • from() : 여러 형태의 데이터를 다루어야 하는 경우 사용


[5] : Subject 기본 개념

  • Subject 는 생성자와 관찰자 특징을 모두 가지고 있는 클래스 입니다
  • Subject 는 멀티캐스트 (1:N 전송) 방식으로 여러개 옵저버를 구독 (subscribe) 할 수 있습니다
  • Subject 클래스 종류 :
    • PublishSubject : 구독 (subscribe) 한 시점으로부터 Observable 주체에서 발생 되는 이벤트 (onNext, onError, onCompleted) 를 전달 받음
    • BehaviorSubject : 구독 (subscribe) 이전 발생된 이벤트가 1개 라도 있으면 구독 시점에 해당 이벤트 (1개) 를 전달 받음
    • ReplaySubject : 구독 (subscribe) 하는 시점에 관계없이 Observable 주체에서 방출된 모든 항목을 전달 받음
    • AsyncSubject : Observable 주체에서 방출된 마지막 값을 전달 받음 (onComplete 완료 기준으로 onNext 마지막 값)


[6] : Scheduler (스케줄러) 기본 개념

  • Scheduler 는 반응형 프로그래밍에서 동시성을 관리하며, 스레드 관리를 제어하기 위한 subscribeOn , observeOn 메소드 가 있습니다
  • Scheduler 관련 용어 설명 :
    • AndroidSchedulers.mainThread() : 안드로이드의 UI 스레드에서 동작
    • Schedulers.io() : 비동기 처리를 위해 사용하는 스케줄러 (API 호출 등 네트워크를 사용한 호출)
    • Schedulers.computation() : 이벤트 그룹에서 간단한 연산이나 콜백 처리를 위해 사용 (스레드 풀이 순환하면서 실행됨)
    • Schedulers.from(executor) : 특정 executor를 스케줄러로 사용
    • Schedulers.newThread() : 새로운 스레드를 만드는 스케줄러
    • Schedulers.trampoline() : 큐에 있는 일이 끝나면 이어서 현재 스레드에서 수행
    • HandlerScheduler.from(handler) : 특정 핸들러 handler 에 의존하여 동작
    • 예시 : subscribeOn(Schedulers.io()) // Observable (생성자) 을 IO 스레드에서 실행
    • 예시 : observeOn(AndroidSchedulers.mainThread()) // Observer (관찰자) 메인 스레드에서 실행


 

반응형
Comments