brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Jul 17. 2017

Reactive Programming

Reactive Programming

Reactive Programming?

Functional Reactive Programming?

Reactive Extensions?


Rx를 공부하며 여기저기 찾아보니 위 용어들을 혼용하거나 동일시 보는 내용들이 있어 이해하기 더 힘들었습니다. 사실 세 용어들이 명확히 다른 개념이지만 어떤 면에서는 공통점이나 유사한 면이 있을 수밖에 없습니다.


이번 글에서는 세 용어에 대해서 알아보겠습니다.




Reactive Programming


Reactive programming is programming
with asynchronous data streams.


Reactive Programming은 비동기 데이터 스트림을 이용한 프로그래밍입니다.


정의만 보면 이해가 안 가지만 사실 많이 쓰이는 개념입니다.


#01 Button Click event stream


아래 코드는 일반적인 버튼 클릭 이벤트입니다. 클릭 이벤트는 실제로 비동기 이벤트 스트림으로, 이벤트 발생을 관찰(Observer)하고 이에 따른 동작을 수행할 수 있습니다.

여기서 말하는 스트림(Stream)이란 시간에 따라 정렬된 진행 중인 이벤트 흐름입니다.
button.OnClickListener mClickListener = new View.OnClickListener() {
    public void onClick(View v) {
            // Click event
        }
    }
};




RP에서는 클릭 이벤트뿐만 아니라 모든 것(변수, 속성, 캐시, 데이터 구조 등)을 비동기 데이터 스트림으로 바꿀 수 있습니다.


#02 Asynchronous data stream


검색을 예로 들어 보겠습니다. 일반적인 검색 로직은 아래와 같습니다.

1. 검색 버튼 클릭
2. 검색어를 기반으로 Remote API에 검색 결과 요청
3. 받아온 raw 검색 결과를 List 형태로 변환
4. 검색 완료


"1. 검색 버튼 클릭", "2. 검색어를 기반으로 Remote API에 검색 결과 요청" 이 두 이벤트는 흔히 이용하는 비동기식 이벤트입니다. 보통 Callback을 통해 비동기 이벤트들을 처리하는데, RP에서는 Search Stream이라는 하나의 비동기 데이터 스트림으로 처리할 수 있습니다.


이처럼 RP에서는 비동기 데이터 스트림에서 일어나는 변화를 지속적으로 관찰(Observer)하고 이에 따른 동작을 수행해야 합니다.

얕게 보면 버튼 클릭 이벤트 스트림과 유사한데, 이벤트뿐만 아니라 모든 것을 데이터 스트림 형태로 변환하고 이 스트림을 이용해 여러 동작을 수행하는 프로그래밍으로 이해하시면 될 거 같습니다.


https://gist.github.com/staltz/868e7e9bc2a7b8c1f754

https://en.wikipedia.org/wiki/Reactive_programming




Functional Reactive Programming


Functional reactive programming is a programming paradigm for reactive programming 
using the building blocks of functional programming


Functional reactive programming은 reactive prograaming에 functional programming을 이용한 프로그래밍입니다.


개념은 간단합니다 RP에 함수형 프로그래밍에서 제공하는 함수를 활용하는 겁니다.

함수형 프로그래밍이란 어떤 문제를 해결하기 위한 과정이나 공식에 치중하기보다는 이미 만들어진 함수를 활용하는 방식입니다.


다시 검색을 예로 들어 보겠습니다. 일반적인 검색 로직에 "4. 검색 결과 중 "kakao" 단어를 포함하는 결과 찾기"를 추가했습니다.


#03 Asynchronous data stream
1. 검색 버튼 클릭
2. 검색어를 기반으로 Remote API에 검색 결과 요청
3. 받아온 raw 검색 결과를 List 형태로 변환
4. 검색 결과 중 "kakao" 단어를 포함하는 결과 찾기
5. 검색 완료


일반적으로 List <String> searchResults에서 "kakao" 단어를 포함하는 결과를 찾기 위해서는 아래와 같이 처리합니다.

List <String> kakaoSearchResults = new ArrayList <>();
for (String str : searchResults){
    if (str.contains("kakao")) {
        kakaoSearchResults. add(str);
    }
}


FRP로 처리한다면 아래와 같습니다. "filter"라는 함수를 이용해 "kakao"라는 단어가 포함된 결과만 찾을 수 있습니다.

List <String> kakaoSearchResults =
    searchResults.stream(). filter(el -> el.contain("kakao")). collect(Collectors.toList());


정해진 input과 output을 내기 위해 코드를 직접 작성해도 되지만 개발자라면 그 과정에서 일어날 수 있는 side를 많이 겪었을 겁니다. 하지만 Functional Programming을 이용하면 이미 정의된 함수만을 이용하기 때문에 side를 줄이는 것뿐만 아니라 함수명만으로도 무슨 동작을 수행하는지 쉽게 파악할 수 있습니다.


물론 그 함수들을 이해하고 알아가기 위한 러닝 커브는 있지만 더 나은 코드를 위해선 공부해야 합니다.





Reactive Extensions


An API for asynchronous programming with observable streams


Reactive Extensions은 관측 가능한(Observable) 스트림을 이용한 비동기 프로그래밍 용 API입니다.


Rx는 앞서 설명한 RP나 FRP와 다르게 프로그래밍 기법이 아닌 API입니다.

따라서 "Rx == RP or FRP"는 성립할 수 없습니다. 하지만 Rx는 FRP를 할 수 있게 도와주는 API들을 제공하고 있기에 FRP의 장단점이 곧 Rx의 장단점이 될 수도 있습니다.


#04 Observable


Rx에서는 RP의 비동기 데이터 스트림을 Observable이라는 용어로 표현합니다.

Observerble은 변화를 지속적으로 관찰(Observer)하고 이에 따른 동작을 수행하는 거에 그치지 않고 여러 함수(Operators)를 이용할 수 있습니다.


이 외에도 Rx에서 이용하는 여러 개념들이 있는데 다음에 기재하겠습니다.







제 나름대로 아래처럼 정의했습니다. 주위에 잘 아는 사람이 없으니 물어볼 곳이 없네요ㅠ 혹시 틀렸으면 답글 달아주세요 ㅎㅎ


RP = 비동기 데이터 스트림을 이용한 프로그래밍

FRP = RP + Functional Programming

Rx = RP를 할 수 있게 도와주는 API + 기타


Rx가 비동기 처리를 하다 보면 많이 쓰이는 개념인데 이를 현대적으로 표현하다 보니 생소하고 어렵게 느껴지는 부분도 있습니다. 이뿐만 아니라 수많은 함수들을 적재적소에 이용해야 좋기 때문에 함수들을 이해하고 알아가기 위핸 노력도 많이 필요합니다. 공부합시다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari