본문 바로가기

Android/RX

4. 리액티브 프로그래밍이란 ?

리액티브 프로그래밍(Reactive Programming)이란?

: In computing, reactive programming is a declarative programming paradigm concerned with data streams and the propagation of change.

(변화의 전파데이터 흐름과 관련된 선언적 프로그래밍 패러다임이다.)

 

-변화의 전파와 데이터 흐름 : 데이터가 변경 될 때 마다 이벤트를 발생시켜서 데이터를 계속적으로 전달한다.

-선언적 프로그래밍 : 실행할 동작을 구체적으로 명시하는 명령형 프로그래밍과 달리 선언형 프로그래밍은 단순히 목표를 선언한다.

 

 

리액티브의 개념이 적용된 예

1. Push 방식 : 데이터의 변화가 발생했을 때 변경이 발생한 곳에서 데이터를 보내주는 방식

 

 RTC(Real Time Communication)

 소켓 프로그래밍

 DB Trigger

 SpringApplicationEvent

 Angular의 데이터 바인딩

 스마트폰의 Push 메시지

 

 

2. Pull 방식 : 변경된 데이터가 있는지 요청을 보내 질의하고 변경된 데이터를 가져오는 방식

 

 클라이언트 요청 & 서버 응답 방식의 애플리케이션

 Java와 같은 절차형 프로그래밍 언어

 

 

리액티브 프로그래밍을 위해 알아야 될 것들

 

Observable : 데이터 소스

리액티브 연산자(Operators) : 데이터 소스를 처리하는 함수

스케쥴러(Scheduler) : 스레드 관리자

Subscriber : Observable이 발행하는 데이터를 구독하는 구독자

함수형 프로그래밍 : RxJava에서 제공하는 연산자(Operator) 함수를 사용

 

 

 

 

선언(함수)형 프로그램, 명령(순차)형 프로그램

import io.reactivex.Observable;
import io.reactivex.Scheduler;
import io.reactivex.internal.operators.observable.ObservableJust;
import io.reactivex.schedulers.Schedulers;

import java.util.Arrays;
import java.util.List;

public class ToDoSample {

    public static void main(String[] args) {

        List<Integer> numbers = Arrays.asList(1,4,5,6,7);

        // 명령형 프로그램 사용
        int sum = 0;
        for (int number: numbers) {
            if(number > 6 && (number % 2 != 0)) {
                sum += number;
            }
        }


        // 선언형 프로그램 사용
        sum = numbers.stream()
                .filter(number-> number > 6 && (number % 2 != 0))
                .mapToInt(number-> number)
                .sum();

    }
}

 

 

리액티브 프로그래밍 간단 소스 

import io.reactivex.Observable;
import io.reactivex.Scheduler;
import io.reactivex.internal.operators.observable.ObservableJust;
import io.reactivex.schedulers.Schedulers;

import java.util.Arrays;
import java.util.List;

public class ToDoSample {

    public static void main(String[] args) {


        Observable.just(100, 200, 300, 400, 500)
                .doOnNext(data -> System.out.println(Thread.currentThread().getName() + ":" + data))
                .subscribeOn(Schedulers.io())       
                .observeOn(Schedulers.computation())
                .filter(number -> number > 300)      
                .subscribe(num-> System.out.println(Thread.currentThread().getName()));



    }
}

1. Observable.just(100, 200, 300, 400, 500) 대상 

2. .doOnNext(data -> System.out.println(Thread.currentThread().getName() + ":" + data)) 

   Schedulers.io로 사용 순차적으로 실행 100 -> 200 -> 300 -> 400 -> 500 

3. .subscribeOn(Schedulers.io()) 데이터의 흐름을 결정

4. .observeOn(Schedulers.computation()) 발행된 데이터를 가공하고 구독데이터 처리

5. .filter(number -> number > 300) 조건

6. .subscribe(num-> System.out.println(Thread.currentThread().getName()));

    구독된 데이터만 처리, Schedulers.computation()로 사용

 

 

 

마블 다이어그램이란?

: 리액티브 프로그래밍을 통해 발생하는 비동기적인 데이터의 흐름을 시간의 흐름에

따라 시각적으로 표시한 다이어그램

 

 마블 다이어그램을 알아야하는 이유

1. 문장으로 적혀 있는 리액티브 연산자(Operators)의 기능을 이해하기 어려움

2. 리액티브 연산자의 기능이 시각화 되어 있어서 이해하기 쉬움

3. 리액티브 프로그래밍의 핵심인 연산자(Operators)를 사용하기 위한 핵심 도구

 

 

 

 

마블 다이어그램 보는 법

 

 

샘플 1

 

import io.reactivex.Observable;
import io.reactivex.Scheduler;
import io.reactivex.internal.operators.observable.ObservableJust;
import io.reactivex.schedulers.Schedulers;

import java.util.Arrays;
import java.util.List;

public class ToDoSample {

    public static void main(String[] args) {

        Observable.just(1,25,9,15,7,30)
                .filter(x -> x > 10)
                .subscribe(x-> System.out.println(x));
    }
}

 

 

 

샘플 2

import io.reactivex.Observable;
import io.reactivex.Scheduler;
import io.reactivex.internal.operators.observable.ObservableJust;
import io.reactivex.schedulers.Schedulers;

import java.util.Arrays;
import java.util.List;

public class ToDoSample {

    public static void main(String[] args) {

        Observable.just(2, 25, 30, 15, 6)
                .subscribe(num-> System.out.println(num));
    }
}

'Android > RX' 카테고리의 다른 글

4. 공통 소스 (참고용)  (0) 2021.01.14
4. Simple, Maybe, Completable  (0) 2021.01.14
4. Observable, Flowable  (0) 2021.01.14
4. Reactive Streams  (0) 2021.01.14