본문 바로가기
기타 개발 관련/안드로이드 개념 정리

Functional Reactive Programming - 개념 정리

by 번데기 개발자 2018. 8. 1.
반응형
Observable이란?



Observable 이란 데이터의 흐름을 관리하기 위한 패턴입니다.

Observable은 데이터의 흐름에 맞게 알림을 보내 구독자가 데이터 처리를 할 수 있도록 만드는 역활을 합니다.

보통 Observable은 3가지의 상태를 알려줍니다.

  • 데이터의 발행 (onNext)
  • 모든 데이터의 발행의 완료 (onComplete)
  • 에러 발생 (onError)



Subscriber란?



데이터의 흐름을 구독한다는 의미입니다.

위의 onNext, onError, onComplete에 대한 리스너를 설정하고 3개의 이벤트에 대한 로직을 만들고 수행합니다.



예제)

아이템을 소비하는 코드

*ex ) Hello World Observable로 구현하기

Observable<String> myObservable=Observable.create(
    new Observable.Onsubscribe<String>(){
        @Override
        public void call(Subscriber<? super String> sub){
            sub.onNext("Hello world!");
            sub.onCompleted();
        }
    }
}

ex2) Subscriber 소비자 구현하기

Subscriber<String> mySubscriber=new Subscriber<String>(){

    @Override
        public void onNext(String s) {System.out.println(s);}

    @Override
        public void onCompleted(){}

    @Override
        public void onError(Throwable e){}
};











비동기 데이터 흐름



즉, 비동기적 데이터 흐름을 처리하는 프로그래밍이라는 것입니다. 

이러한 관점에서 Reactive Programming Asynchronous Dataflow Programming이라고도 불리웁니다.

  Reactive Programming의 핵심은 모든 것을 비동기적인 데이터의 Stream으로 간주하고, Observer 디자인 패턴을 활용해서 이러한 비동기 이벤트를 처리하는 것에 있습니다.




  

실시간화


위는 Reactive Programming을 구현하는 개발자의 입장에서 본 정의에 가깝습니다. 

사용자 입장에서 보자면 Reactive Programming이란 실시간으로 반응을 하는 프로그래밍을 말합니다. 

예를 들면, 네이버 검색창에 단어를 하나씩 입력할 때마다 관련 검색어들이 자동완성으로 바로바로 제시되는 것이나, 페이스북 포스트에 '좋아요' 버튼을 누르면 해당 포스트를 보고 있는 다른 유저의 '좋아요' 카운트가 페이지 새로 고침이 없어도 실시간으로 올라가는 것을 말합니다.


이는 '명령형' 프로그래밍을 뜻하는 Imperative Programming과 대비되는 개념입니다. 

예를 들면, a = b + c라는 함수가 있을 때 명령형 프로그래밍에서는 a는 b + c 연산의 결과물이 되며, 차후 b와 c 값이 변하여도 재연산 명령이 새로 들어오지 않는 한 a 값은 첫번째 연산의 결과값으로 유지되게 됩니다. 

하지만 Reactive Programming에서는 b와 c 값이 변할 때마다 바로바로 재연산이 수행되어 a값이 변하게 됩니다.


이런 관점에서 본다면 Reactive Programming은 Data Binding을 통해 Model과 View, Input과 Output이 서로서로 업데이트 상황을 실시간으로 공유받고 업데이트하는 프로그래밍이라고 할 수 있겠습니다.




Functional Reactive Programming


    
Functional Reactive Programming(FRP)은 위에서 살펴본 Reactive Programming을 Functional Programming의 원리를 통해 구현하는 것을 말합니다.

쉽게 말하자면, 비동기적인 데이터 처리를 간단한 함수를 통해 수행하는 프로그래밍을 말합니다. FRP에 대해서 살펴보기 전에 먼저 Functional Programming에 대해 살펴보도록 하겠습니다.

Functional Programming이란 어떤 문제를 해결하는데 있어서 그 과정이나 공식에 매몰되기보다는 그냥 이미 만들어진 함수를 활용하는 방식을 말합니다.

다만, 무조건 활용하는 것이 아니라 함수 자체가 '숨겨진 input과 output'이 없도록 설계되어야 하는 것이 전제조건입니다.

일반적으로 함수는 input을 받아서 output을 산출합니다.

프로그래밍에서 input은 함수 parameter의 인자(argument)값으로 받아오고, output은 함수의 return 값이 되게 됩니다.

하지만 경우에 따라 parameter나 return에 명시되지 않은채, 함수 안에 숨어있는 input과 output이 있을 수 있습니다. 이렇게 숨겨져 있는 input과 output을 side-causes와 side-effects라고 부릅니다.

함수 안에 숨겨진 input과 output이 많을수록 해당 함수를 활용할 때 예상치 못한 일들이 일어날 수도 있고 디버깅도 힘들어집니다.


Swift에서 배열에 filter, map, reduce와 같은 메서드를 활용한 것이 대표적인 Functional Programming의 예입니다. 이들 메서드들은 자신을 호출하는 자가 의도하는 것을 정확히 구현할 수 있도록 투명하게 설계되어 있습니다.

예를 들면, 배열 [1, 2, 3, 4, 5]가 있다고 합시다. 이 배열 중 짝수만 필터링하거나, 각 값마다 5를 곱해주거나, 값들을 모두 합하여 새로운 배열을 만들고자 할 때, Swift Array가 제공하는 filter, map, reduce 메서드를 사용하지 않는다면 for loop을 사용해야 할 것이고 새로운 임시 배열도 만들어야 할 것입니다

하지만 아래처럼 filter, map, reduce를 사용하면 아주 간단하게 문제는 해결됩니다.

위의 내용을 토대로 정리하자면 FRP는 위 filter, map, reduce와 같은 함수와 메서드를 활용(Functional)해서 비동기 이벤트를 처리(Reactive)하는 것을 말합니다.


ReactiveX


Rx는 ReactiveX의 약자로서 FRP의 원리를 활용해서 비동기적인 이벤트를 손쉽게 처리하기 위해 만들어진 API입니다.

즉, Rx의 목적은 '비동기 이벤트 계의 map, filter, reduce가 되자'는 것입니다. 이러한 Rx의 핵심은 다음과 같습니다.

Rx에서는 모든 것이 Data Stream이다.


모든 것이 Stream이라는 핵심 개념을 잘 이해해야 Rx를 잘 활용할 수 있게 됩니다.

Rx는 사실 Stream을 Observable이라고 표현하며 실제 라이브러리에서도 Observable의 객체로 선언됩니다.

그리고 해당 Data Stream, 즉, Observable이 언제(When), 그리고 무엇을(What) 분출하는지 듣고 있기 위해 Subscribe를 하게 됩니다.  








반응형