RxJava 리엑티브 자바란 무엇인가
- RxJava 는 자바와 안드로이드를 위한 리엑티브 프로그래밍 구현체
- 함수형 프로그래밍의 영향을 받았기 때문에 함수 구성을 선호함 ( Ramda 형식 )
- 전역상태나 부수효과를 피하고 비동기나 이벤트 기반 프로그램을 작성할 때 Stream 방식 ( Ramda Stream ) 으로 생각한다.
- RxJava 는 생산자/소비자 콜백을 사용한 옵저버 패턴을 시작으로 구성과 변환, 스케줄링, 스로틀링, 오류 처리, 생명주기 관리를 할 수 있는 수많은 연산자를 제공함
RxJava 자바와 안드로이드 뿐만 아니라 서버까지 다루는 오픈소스 라이브러리이다.
리액티브 프로그래밍이란, 데이터나 이벤트 변화와 반응에 초점을 맞춘 프로그래밍을 뜻하는 일반적인 용어이다.
엄밀히 말하면 FRP( fucntional reative programming ) 은 RxJava와 다르다. FRP는 연속적인 시간의 흐름을 포함하고 RxJava는 시간에 대해 불연속적인 이벤트만 다룬다.
리엑티브 함수형 프로그래밍이란
동시성과 병렬성을 해결하는 프로그래밍으로 리액티브나 비동기 요구사항을 명령형 방식으로 만들었을 때 나타나는 콜백 지옥 문제를 해결하는 것이다.
즉 RxJava 를 이용한 리액티브 프로그래밍은 명령형 방식을 이용하지 않고 선언적 접근을 사용한다.
리액티브 프로그래밍이 필요한 순간
- 마우스 움직임이나 클릭, 키보드 타이핑, GPS 신호, 자이로스코프 신호, 터치 이벤트 처리
- 비동기성을 띠는 네트워크 등 지연 I/O 이벤트 응답
- 이벤트나 앞서 나온 사용자 이벤트, 애플리케이션에서 발생하는 이벤트나 데이터를 다룰때
RxJava는 어떻게 동작하는가
// 생산자가 소비자에게 밀어낸다 ?
// 생산자 Observable mouseEvent = ...;
// 소비자 mouseEvent.subscribe()
그렇다면 왜 observable을 사용하나?
반환해야 할 목록이 작으면 성능상 아무런 문제가 없다. 주관적인 선택일 뿐이지만 목록이 크거나 다양한 데이터 소스를 끌어와 목록 요소를 채워야 한다면 Observable 을 사용했을 때 성능이나 반응 시간 측면에서 이점이 있다.
또한 컬렉션 전체가 도착할 대까지 기다리지 않고 항목을 받는 대로 처리할 수 있기 때문이다. 이는 특히 상이한 네트워크 지연이 각 항목별로 영향을 미치는 경우에 그렇다.
Rx Observable이 다중 값 스트림을 다루기에는 좋지만 API를 설계하거나 사용할 때는 단일 값 표현이 단순해서 좋다.
다음 예제를 확인하자
public static void Single<String> getDataA() {
return Single.<String> create( o -> {
o.onSuccess("DataA");
}).subscribeOn(Schedulers.io());
}
public static Single<String> getDataB(){
return Single.jush("DataB").subscribeOn(Schedulers.io());
}
반환값이 필요없는 Completable //
Observable<Void> c = writeToDatabase("data");
static Completable writeToDatabase(Object data){
return Completable.create( s -> {
doAsyncWrite(data,
// 성공적인 완료 시 콜백
() -> s.onCompleted(),
// Throwable을 포함하는 실패 시 콜백
error -> s.onError(error));
});
}
하드웨어 측면에서 블로킹 I/O와 논블로킹 I/O
논블로킹 I/O와 이벤트 루프 방식이 요청별로 블로킹 I/O 스레드를 사용하는 방식보다 효율적인지의 비교해보면
결과적으로 지연시간 처리량의 개선과 인프라스트럭처 비용을 낮출 수 있다. 그리고 부하에 대한 탄력성이 더 좋다.
RxJava의 타입과 연산자는 명령형 콜백 위에 쌓아올린 추상화이다.
이 추상화로 코딩 스타일을 완전히 바꿔놓으며 비동기 혹은 논블로킹 프로그래밍을 위한 강력한 도구를 제공한다.
// 참고문헌 RxJava를 활용한 리액티브 프로그래밍 //
이글은 책의 내용을 정리와 참조용 으로 작성한 것입니다.
'개발 > java' 카테고리의 다른 글
자바 람다식이란? (0) | 2018.10.06 |
---|---|
자바 개발 쓰레드에 대한 정리와 제네릭 사용이유 (0) | 2018.09.29 |
steemit java commitor 되기 2 새로운 프로젝트 만들기 (0) | 2018.09.28 |
steemit java commitor 되기 1 core 살펴보기 (0) | 2018.09.27 |
RxJava Observerable (0) | 2018.09.21 |
댓글