본문 바로가기
Swift & iOS

Reactive Programming 소개

by rehtorb_s 2021. 12. 3.

1. Reactive Programming이란?
데이터의 흐름, 변화전파에 대한 선언적 프로그래밍 패러다임을 말합니다. oop는 모든 데이터를 object로 취급하여 객체들의 상호작용을 기반으로 프로그래밍하는 방법이라고 한다면
rp는 모든 것을 비동기적인 데이터 스트림으로 간주하고 처리하는 프로그래밍 방법이라고 할 수 있습니다. 쉽게 말하면 변수든 속성이든, 캐시, 데이터 구조, 이벤트 등등 모든 것을 스트림(Stream)으로 보고, 모든 데이터의 흐름을 시간 순서에 의해 전달되는 스트림으로 처리합니다.


각각의 스트림은 새로 만들어질 수도 있고, 여러 개의 스트림이 합쳐(merge) 질 수도, 필터링이 되거나 스트림이 다른 스트림의 input이 될 수도 있습니다. 이런 과정들은 map, scan 같은 고차함수를 이용하여 pipeline 형태로 immutable 하게 처리됩니다.


*pipeline : 함수를 연속적으로 나열하여 데이터의 흐름(stream)을 제어하고 함수형, 선언적 프로그래밍과 깊은 관련
*immutable(불변성) : 함수형 프로그래밍 특징중 하나로서 input 값을 내부적으로만 처리하여 외부의 변수나 객체의 상태 변경 없이 output을 반환하는 특성. 개발자가 작성하는 코드로 노출되지 않아 개발자가 오류 내는 부분을 방지, 멀티스레드의 동시접근 문제 방지

1-1. 선언형 프로그래밍
선언형(Declarative) 프로그래밍은 계산, 논리를 표현하고 프로그램의 흐름을 소스코드에 명시적으로 작성하는 명령형(Imperative) 프로그래밍과 대비됩니다.

[배열에서 짝수만 필터링하는 코드]
명령형 프로그래밍

선언형 프로그래밍

  명령형 선언형
  결과를 얻는 방법에 중점 - 짝수를 어떻게 얻을 것인지 수행하는 작업에 중점 - 짝수가 무엇인지
     
     

결론 : 정해진 input에 따라 output을 내기위해서 명령형 프로그래밍 방식은 순차적인 명령문의 나열로 과정에 중점을 두고 선언형 프로그래밍 방식은 미리 정의된 함수로 무엇을 하는지에 중점을 둔다고 볼 수 있습니다. 때문에 코드가 단순화되고 이는 선언형 프로그래밍이 캡슐화된 명령형 함수를 가져다 쓰기 때문 이라고도 볼 수 있습니다.

2. Reactive Programming 예시
2-1. 엑셀

예를 들어 엑셀시트를 본다면 A2~A10사이의 셀에 값을 변경하면 실시간으로 A1의 값이 바뀝니다. 이런 동작방식의 핵심은 비동기(Asynchronous) 이벤트와 옵저버 패턴으로써, Reactive Programming의 근간입니다. 동작과정을 단계별로 나누면 [관측 및 값 가져오기->계산하기(처리)->결과 보여주기]로 나눌 수 있는데 이는 Reactive Programming 관점에서

Observable : 데이터 스트림 자체를 나타내며 관찰될 수 있는, 관찰 대상이란 뜻을 가지고 데이터(이벤트든, 값이든 무엇이든)를 방출
Operator : 방출되는 데이터를 가공 및 처리
Observer: 스트림을 관찰하며(Subscribing) 가공되어 발행되는 결과를 활용

라는 용어로 치환됩니다.

2-2. 클릭이벤트
그림1의 클릭이벤트를 구체화 시켜보면

ㅍ
 다중클릭 이벤트를 가려내는 예시 다이어그램 

[1] 클릭이벤트에 대한 스트림(Observable)을 생성
[2] Operator를 조합하여 클릭이벤트 스트림을 가공할 파이프라인 나열
- buffer : 클릭 이벤트가 발생한 만큼 버퍼에 모아 250ms 내에 클릭이벤트가 발생하지 않는다면 배열로 방출
- map : 방출된 배열을 길이로 변환 후 반환
- filter : 클릭횟수 필터링 후 반환
[3] 1에서 생성한 스트림 관찰 후 최종 반환되는 값을 활용해서 화면에 표시(Observer)
[4] 두개의 스트림을 머지시켜 관찰할 때 1000ms 동안 입력이 발생하지 않으면 화면 초기화
해당 예제는 http://jsfiddle.net/staltz/4gGgs/27/ 에서 테스트 해볼 수 있습니다.

또 다른 예로는 실제 사용환경에서 검색의 자동완성, SNS의 좋아요 등 실시간으로 사용자에게 전달이 되는 기능을 생각해볼 수 있습니다.


3. Reactive Programming의 장점
- 다수의 UI 이벤트와 상호 작용성이 높은 웹 앱 및 모바일 앱에서는 실시간 렌더링을 필요로하는 요소가 많기 때문에 이에 대응할 수 있는 해결책이 될 수 있다
- 콜백지옥에서 벗어날 수 있다
- 위에서 적용한 예는 간단한 사례이지만 복잡한 로직이 있다면 쉽게 풀어낼 수도 있다
- 검증된 코드의 재사용을 통해 Low-level에서 발생하는 실수를 방지할 수 있다

4. Reactive Programming 단점
- operator의 종류가 많아서 외워야 하는 양이 많다
- 코드추적 및 디버깅이 어렵다
- 여전히 DeadLock 발생할 여지가 있다
- 사용자 친화적인 성격이 강해서 프로그램 전체적인 관점에서 성능상 이슈가 발생할 수 있다

5. Reactive X
RxJava, RxSwift 등 Rx 시리즈는 Reactive Programming을 가능하게 하는 third-party 라이브러리입니다. 웬만한 메이저 언어들을 지원하고 언어마다 다른 부분이 있지만 Observable, Observer 같은 기본적인 개념은 동일합니다. 튜토리얼도 자세하게 나와있어서 배우기 수월하다고 생각합니다.

6. 마무리
reactive programming을 알아보며 데이터의 전처리 과정이 생각났습니다. 학창 시절 빅데이터 과제를 했었는데 데이터에 문자나 #$%같은 특수문자가 있다면 지우고 나온 결과에서, 공백이 있다면 붙여주고, 거기서 나온 결과에서 사칙연산자가 있다면 계산해주는 식이었기 때문에 여러 operator의 연쇄작용이 떠올랐기 때문입니다. 만약 업무라면 Rx를 어떻게 응용할 수 있을까? 라는 생각을 해봤지만 아직은 크게 떠오르지 않습니다. 하지만 일관성 있는 input과 처리되는 프로세스가 명확한 작업 혹은 비동기 작업이 동시다발로 진행되어야 하는 부분을 파악해가며 시스템의 효율을 높일 수 있는 여지가 있다면 해보고 싶습니다.






참고사이트
The introduction to Reactive Programming you've been missing · GitHub

The introduction to Reactive Programming you've been missing

The introduction to Reactive Programming you've been missing - introrx.md

gist.github.com

[WebFlux] 1. Reactive Programming 개요 (tistory.com)

[WebFlux] 1. Reactive Programming 개요

이 글에서는 예제를 통해서 Spring Boot에서의 Reactive Programming에 대해 알아보기 이전에, Reactive Programming에 대한 전반적인 개요를 다루도록 하겠습니다. 1. Reactive Programming? "programming with a..

kellis.tistory.com

RxJava - 예제를 통해 Reactive Programming 이해하기 (tistory.com)

RxJava - 예제를 통해 Reactive Programming 이해하기

목표 간단한 예제를 통해서 리액티브 프로그래밍이 무엇인지 알아보고 이것을 사용하기 위해서 무엇을 알아야하는지도 알아보도록 합니다. 과거의 어플리케이션은 클라이언트와 서버의 작업

irontech.tistory.com

댓글