일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 안드로이드 Espresso
- 안드로이드 테스트코드
- 안드로이드 앱 아키텍처 가이드라인 예시
- RxJava
- 안드로이드 hilt
- 안드로이드 앱 아키텍처 가이드라인 사용법
- 안드로이드 JUnit
- sharedFlow
- 안드로이드 앱 아키텍처 가이드라인 설명
- 스타트업 코딩테스트
- 안드로이드 아키텍처 컴포넌트
- 안드로이드 Mockito
- android DI
- 코루틴
- Android App Architecture Guideline
- MVVM
- 안드로이드 의존성주입
- Hilt
- 리싸이클러뷰 최적화
- android memory leak
- 안드로이드 mvvm
- Koin
- 안드로이드 앱 아키텍처 가이드라인
- 안드로이드 최적화
- 안드로이드 mvvm예제
- 안드로이드 리싸이클러뷰
- coroutine
- Android MVVM
- android clean architecture
- 안드로이드 클린 아키텍처
- Today
- Total
안드로이드 연구소
[Flow vs RxJava] RxJava(ReactiveX에 대하여) 본문
지난 예제에서 Flow라이브러리에 대해서 알아보았습니다.
Flow는 데이터 스트림속에서 변경 사항을 감지한 후
다양한 연산자(map, filter, take)와 같은 연산자들을 이용하여
원하는 조건에 맞게 데이터를 가져오기 위해 사용하였습니다.
이를 반응형 프로그래밍(Reactive Programming)이라고 합니다.
Flow(코루틴)가 등장하기 이전에는 RxJava라는 것을 이용하여 반응형 프로그래밍 작업을 하였다고 합니다.
그렇다면 RxJava에 대해서 한번 자세히 알아보도록 하겠습니다.
Q1. ChatGPT, RxJava는 언제 만들어졌는가?
2012년에 Microsoft에서 ReactiveX 프로젝트가 시작했습니다.
그리고 RxJava는 2013년 Netflix에서 ReactiveX(Reactive Extensions) 프로그래밍 모델로 처음 개발되었습니다.
RxJava는 복잡한 비동기 시나리오의 처리를 단순화하고
확장 가능하고 응답성이 뛰어난 애플리케이션을 작성할 수 있도록 하는 것을 목표로 했습니다.
출시 이후 RxJava는 비동기 작업 및 이벤트 기반 프로그래밍 처리의 효율성으로 인해
특히 Android 커뮤니티에서 상당한 인기를 얻었습니다.
RxJava는 지금으로부터 10년전쯤 넷플릭스에서 만들어졌네요.
그런데 ReactiveX프로젝트는 무엇이고 RxJava라는 무슨 관계일까요?
Q2. ReactiveX프로젝트가 무엇이니?
Reactive Extensions 또는 Rx라고도 하는 ReactiveX 프로젝트는
2012년 Microsoft에서 시작된
여러 플랫폼과 프로그래밍 언어에서 비동기 및 이벤트 기반 프로그래밍을 처리하기 위한
통합 프로그래밍 모델을 제공하는 것을 목표로 하는 오픈 소스 프로젝트입니다.
Rx이전에서 비동기 작업을 할 때 많은 문제들이 발생하였습니다.
1. 콜백 및 스레드와 같은 비동기 작업을 처리하는 기존 접근 방식은 종종 복잡하고 오류가 발생하기 쉬운 코드로 이어집니다.
2. 네트워크 요청 또는 I/O 작업과 같은 비동기 작업은 이해하고 유지하기 어려운 콜백 지옥 또는 중첩된 콜백 구조를 초래할 수 있습니다.
ReactiveX 개념과 동일 원칙으로 다양한 언어로 비동기 프로그래밍으로 작업하기 위해서
Rx .NET, Rx JavaScript, RxJava, RxSwift를 비롯한 다양한 언어가 구현되었습니다.
ReactiveX 프로젝트는 기존의 언어들에서 비동기 작업에서 생겼던 문제들을
동일한 원칙으로 해결한 해결책 같은 것이네요.
그 중 하나가 RxJava이라고 합니다.
그렇다면 어떤 언어든 ReactiveX 핵심 원칙이 키 포인트가 되겠네요!
* 만약 ReactiveX 프로젝트에 대해서 더 자세히 알아보고 싶다면 아래 선배님의 블로그를 추천합니다.
https://huns.me/development/2051
MS는 ReactiveX를 왜 만들었을까? (feat. RxJS)
김코딩 님이 잘하고 싶어서 만든 블로그
huns.me
Q3. ReactiveX 핵심 원칙에 대해서 알려줘
1. Observables(관찰하는 대상)
: 관찰 가능 항목은 시간이 지남에 따라 관찰할 수 있는 데이터 또는 이벤트의 시퀀스를 나타냅니다.
항목이나 신호를 방출하고 관찰자가 구독할 수 있습니다.
2. Observers(관찰자)
: 관찰자는 방출된 데이터 또는 이벤트를 수신하고 반응하기 위해 Observable을 구독합니다.
항목, 오류 및 완료 신호를 처리하는 메서드를 정의합니다.
3. Operators(연산자)
: ReactiveX는 내보낸 데이터 스트림을 변환, 필터링, 결합 또는 조작할 수 있는 풍부한 연산자 세트를 제공합니다.
이 외에도 여러가지 요소들이 있지만 가장 핵심적인 3가지는 위에 내용이라 생각합니다.
Flow에서 사용했던 개념들과 크게 다르지 않는 것으로 보입니다.
그렇다면 RxJava 어떻게 사용하는 것인지 코드로 확인해볼까요?
Q4. RxJava에 대한 예시를 보여줘
import io.reactivex.Observable
import io.reactivex.Observer
import io.reactivex.disposables.Disposable
fun main() {
// (1)Create an Observable from a list of numbers
val numbersObservable: Observable<Int> = Observable.just(1, 2, 3, 4, 5)
// (2)Create an Observer to subscribe to the Observable
val numbersObserver: Observer<Int> = object : Observer<Int> {
// (3)Called when the Observer is subscribed to the Observable
override fun onSubscribe(d: Disposable) {
println("Subscribed to Observable")
}
// (4)Called when the Observable emits a new item
override fun onNext(number: Int) {
println("Received number: $number")
}
// (5)Called when an error occurs in the Observable
override fun onError(e: Throwable) {
System.err.println("Error: ${e.message}")
}
// (6)Called when the Observable has finished emitting all items
override fun onComplete() {
println("Observable completed")
}
}
// (7)Apply the map operator to transform each emitted number
val mappedObservable = numbersObservable.map { number -> number * 10 }
// (8)Subscribe the Observer to the transformed Observable
mappedObservable.subscribe(numbersObserver)
}
RxJava는 이름처럼 자바에서 밖에 쓰지 못하면 어떡하지라는 걱정을 했지만
코틀린에서도 사용이 가능하고 오히려 null 허용 유형, 람다 표현식, 확장 함수 및 기타 코틀린의 기능을 활용하면
더 좋은 RxJava 코드를 사용할 수 있다고합니다.
위 코드에 대해서 우선 자세히 알아보면
(1) observable 관찰 대상인 데이터를 생성합니다. 1부터 5까지 담긴 데이터 리스트가 해당되겠네요.
(2) observable를 관찰하는 observer를 생성합니다.
그리고 (3)~(6)에서 각 이벤트일 때 결과값을 받도록 한다.
(7) map 연산자를 이용하여 전송할 데이터를 변환한다.
(8) Observer가 새로 변환한 Obeservable을 구독하게한다.
뭔가 RxJava는 LiveData에 Flow의 기능이 합쳐진 느낌을 주긴하네요.
그렇다면 우린 앞으로 RxJava와 Flow중 어떤걸 써야할까요?
Q5. RxJava와 Flow중 어떤게 더 좋니?
RxJava와 Flow 모두 개발 환경에 따라 달라집니다.
RxJava의 장점으로는 아래와 같습니다.
1. 애플리케이션에서 다양한 프로그래밍 언어와 플랫폼을 유연하게 선택할 경우 유연하게 사용할 수 있습니다.
2. 오랫동안 개발자들에게 사용되어 광범위한 연산자, 라이브러리 및 커뮤니티 지원을 갖춘 성숙한 생태계를 갖추고 있습니다.
3. 데이터 스트림을 변환, 필터링, 결합 및 조작하기 위한 포괄적인 연산자 세트를 제공합니다.
Flow의 장점으로는 아래와 같습니다.
1. Flow는 Kotlin 코루틴의 기능 중 하나로 코루틴과 사용하기 최적화 되어 있습니다.
2. RxJava에 비해 연산자 수가 적지만 가장 일반적으로 사용되는 연산자를 다룹니다. 이러한 단순성은 더 읽기 쉽고 간결한 코드로 이어질 수 있습니다.
RxJava는 Rx개념이 있는 개발자에게 사용하기 유리하고
Flow는 코루틴 환경에 익숙한 개발자들에게 좋아보입니다.
아마 그렇다면 안드로이드 개발을 깊게 공부하게 된다면
RxJava보다는 Flow가 더 각광받게 되지 않을까 조심스럽게 생각합니다.
그렇다면 RxJava와 Flow에 대한 내용을 마쳐보겠습니다.
감사합니다.
'안드로이드 연구소 > 의존성주입' 카테고리의 다른 글
[여기가 DI 설명 제일 잘함] Koin vs Hilt (1) | 2023.05.17 |
---|---|
[여기가 DI 설명 제일 잘함] Dagger1, Dagger2 그리고 Hilt (0) | 2023.05.17 |
[여기가 DI 설명 제일 잘함] 의존성 주입 하는 법 & DI 라이브러리들 (0) | 2023.05.16 |