반응형 프로그래밍 & Rx 인트로

박형석·2021년 11월 29일
0

CS

목록 보기
7/10
post-thumbnail

Rx가 제일 좋아

시리즈를 시작할 때도 이야기했지만, 프로그래밍 패러다임을 정리하려는 계기는 Rx 때문이었다. Rx를 프로젝트에 적용하고 나름 열심히 공부하며 사용했지만, 이게 왜 함수형 프로그래밍인지, 반응형 프로그래밍은 뭔지, 선언형은 뭔지, 선언형과 명령형은 차이가 뭔지, 그럼 내가 알고 있는 객체 지향은 진짜 객체 지향인지 등... 질문이 꼬리의 꼬리를 물었기 때문이다. 아무튼 반응형 프로그래밍으로 이 시리즈는 마치고 RxSwift에 대한 글을 이어가겠다.

패러다임으로써의 이해

객체 지향 프로그래밍은 외부 세계를 추상화해서 객체와 객체들 간의 상호작용의 관점으로 프로그램을 보는 것, 선언형과 함수형 프로그래밍은 프로그램 실행 자체를 새롭게 이해해서 순수 함수의 합성과 조합, 변형으로 프로그램밍하는 것, 프로토콜 지향 프로그래밍은 객체들이 가진 기능 공유를 새롭게 이해해서 상속이 아닌 확장의 개념으로 보는 것이다. 이전에도 살펴보았듯 프로그래밍 패러다임은 새로운 관점 혹은 관점의 확장으로 우리의 코드를 들여다보게 한다. 그럼 반응형 프로그래밍은 우리에게 어떤 새로운 관점을 가져다 주었을까?

반응형 프로그래밍은 새로운 개념보다 확장에 가깝다. 이미 앱이 우리의 Input에 반응한걸 본적이 있지 않은가? 버튼을 눌렀을 때 슬라이드를 했을 때 앱은 우리에게 반응하고 그에 따른 결과를 보여준다. 비동기적으로 이벤트가 발생되면, 그것을 관찰하고, 그에 따른 반응으로 사이드 이팩트를 실행하는 경험을 이미 해보았다. 하지만 반응형 프로그래밍 '패러다임'은 버튼 하나를 만드는데 멈추지 않는다. '패러다임'의 이름에 걸맞게 개념을 더 확장한다.

반응형 프로그래밍?

반응형 프로그래밍에 대한 정의가 너무 다양하고 많다. 하지만 그 정의대로 구현하려고 보면 차별점이 느껴지지 않는다. 그래서 코드 없이 반응형 프로그래밍을 설명하는건 말이 안된다고 했는지 모르겠다. 아무튼 프로그래밍 관점에서 정의를 내려보자.

반응형 프로그래밍은 모든 이벤트에 대한 '데이터 스트림'을 만들어 프로그래밍하는 것이다. 여기서 모든 이벤트란 언제든 발생할 수 있는 비동기적 이벤트를 의미하며 관찰 가능한 이벤트를 의미한다. 그리고 데이터 스트림이란 데이터의 흐름을 말하는데, 데이터는 사용자 입력, 속성, 캐시, 데이터 구조 등 어떤 것이든 될 수 있다. 이렇게 이벤트에 의해서 발현된 데이터 스트림은 관찰자에 의해 관찰되어 사이드 이팩트를 실행하며 프로그램을 진행한다.

반응형 프로그래밍은 위와 같이 이제까지 우리가 가지고 있었던 'data'를 'data-flow'로 추상화하는게 차별점이다. data가 흐름을 가지게 되었다는 것은 시간과 그에 따른 결과에 대한 상태 모두를 가지고 있다는 의미다. 실제로 일련의 데이터 스트림은 비동기적이라 시간에 자유롭고, 데이터, 에러, 완료 등 데이터 전달 과정에서 일어나는 사이드 이팩트도 모두 관리할 수 있다.

앞으로 사용하게 될 RxSwift에서도 String은 Observable< String >으로 추상화 되면서 데이터 스트림으로 거듭하게 되고, 비동기 작업 뿐만 아니라 데이터 작업시 일어나는 여러 상황(데이터 변동, 에러, 완료, 필터, 제거 등)을 관리할 수 있게 된다.

좀 더 깊은 차원, 수학적 차원의 반응형 프로그래밍의 이해는 더 고수가 되면 해보자. 지금은 이벤트와 데이터 흐름을 고려해서 프로그래밍하는데 집중해보자.

RxSwift는

RxSwift는 이런 반응형 프로그래밍을 구현한 라이브러리다. 홈페이지의 정의는

ReactiveX는 Observable Sequence를 사용하여 비동기 및 이벤트 기반 프로그램을 구성하기 위한 라이브러리입니다..

여기서 비동기, 이벤트 기반은 간략하게 다루었다. 그럼 Observable Sequence는 무엇일까? Observable은 좀 더 깊은 이야기(Future 대신에 Observable을 쓰는 이유)가 있는 것 같지만 Sequence는 우리가 위에서 이해한 데이터 스트림과 일맥상통한다.

RxSwift의 또 다른 특징은 함수형 프로그래밍을 적용했다는 점이다. 스트림을 관리하는 연산자는 모두 함수로 구현되어 있다. 이 함수의 합성과 조합으로 스트림을 관리할 수 있다. 이 함수들은 모든 Observable Sequence에 적용이 가능하다.

나름의 반응성을 구현하기 위해서 completionBlock, Notification, Property Observer, Delegate Pattern 등 다양한 기술을 사용하지만 스트림을 관리할 수 있다는 점에서 단순히 반응하는 앞의 코드들과는 전적으로 차이가 있다. 거기에 스레드를 관리할 수 있으니 금상첨화다.

다음 RxSwift 시리즈를 하나하나 다뤄가면서 그 진가를 공부해가보자.

profile
IOS Developer

0개의 댓글