study record

Reactive Programming이란? 본문

iOS/RxSwift

Reactive Programming이란?

asong 2022. 7. 17. 21:39

Reactive Programming 등장 배경

  • 빅데이터: 빅데이터는 보통 PB(페타바이트) 단위로 구성되고, 거기에 매일 증가해버린다.
  • 다양한 환경: 비슷비슷한 디바이스가 아니라 작은 모바일 디바이스부터 수천 개의 멀티 코어 프로세서로 실행되는 클라우드 클러스터까지 너무도 다양한 환경에 애플리케이션이 배포됨.
  • 사용 패턴: 사용자는 1년 내내 항상 서비스를 사용할 수 있고, ms 단위의 응답시간을 기대한다.

리액티브 프로그래밍에서는 다양한 소스에서 들어오는 데이터의 흐름(스트림)을 비동기적으로 합쳐서 이런 문제를 해결한다.

 

Reactive Programming이란?

리액티브 프로그래밍은 비동기적 데이터의 흐름과 변화의 전달에 관한 프로그래밍 패러다임이다.

 

리액티브 프로그램은 주변의 환경과 끊임없이 상호작용하며 프로그램이 실질적으로 주도하는 것이 아닌 환경이 변화되면 이벤트가 흐름을 주도하는 방식이다.

 

예를 들어 데이터 A의 변화에 따라 데이터 B의 값이 변화하는 방식이 리액티브 프로그래밍.

데이터가 변경 될 때 마다 이벤트를 발생시켜서 데이터를 계속적으로 전달한다.

 

이러한 Reactive Programming의 핵심은 모든 것을 비동기적 데이터의 Stream으로 간주하고, 다양한 방법으로 비동기 이벤트를 처리한다.

프로그래머가 직접 절차를 명시하여 처리하는 명령형 프로그래밍이 아니라 데이터의 흐름을 정의하는 것이 프로그래밍의 핵심이 된다. 시스템 이벤트가 발생했을 때 이를 알아서 처리할 수 있도록 세팅하는 것이다.

 

 

기존의 명령형 프로그래밍 (Pull 방식)

→ 컴퓨터 하드웨어를 대상으로 프로그래머가 작성한 코드가 정해진 절차에 따라 순서대로 실행된다.

  • 클라이언트 요청 & 서버 응답 방식의 애플리케이션
  • Java와 같은 절차형 프로그래밍 언어

리액티브 프로그래밍 (Push 방식)

→ 데이터의 흐름을 미리 정의하고 데이터의 값이 변경되었을 때 관련 함수나 수식이 업데이트된다.

  • RTC(Real Time Communication)
  • 소켓 프로그래밍
  • DB Trigger
  • 스마트폰의 Push 메시지

선언적 프로그래밍

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

프로그램이 어떤 방법으로 해야하는지를 나타내기보다는 무엇과 같은지를 설명하는 경우. 함수형 프로그래밍은 선언적 프로그래밍이라는 더 넓은 프로그래밍 패러다임의 한 가지이다. 선언적 프로그래밍은 달성하는 과정을 하나하나 기술하기보다는 필요한 것이 어떤 것인지 기술하는데에 초점을 두고 애플리케이션의 구조를 세워 나가는 프로그래밍 구조이다.

 

명령형(절차적) 프로그래밍은 어떤 일을 어떻게 할 것인가에 관한 것이고, 선언적 프로그래밍은 무엇을 할 것인가에 관한 것이다.

 

 

Reactive Manifesto (선언)

리액티브 메니페스토는 리액티브 애플리케이션과 시스템 개발의 원칙을 공식적으로 정의하고 있다.

  • 반응성(responsive) : 리액티브 시스템은 빠를 뿐 아니라 + 일정하고 예상가능한 반응 시간을 제공한다.
  • 회복성(resilient) : 장애가 발생해도 시스템은 반응해야한다. 여러 컴포넌트의 시간과 공간 분리 (즉, 컴포넌트가 각각 독립적인 생명주기를 갖고 다른 프로세스에서 실행), 작업 위임시 비동기적으로 위임하는 등의 기법이 있다.
  • 탄력성(elastic) : 애플리케이션의 생명주기 동안 다양한 부하를 받는데 이때 리액티브 시스템에서는 자동으로 관련 컴포넌트에 할당된 자원 수를 늘린다.
  • 메시지 주도(message-driven) : 회복성과 탄력성을 지원하려면 약한 결합, 고립, 위치 투명성 등을 지원하도록 경계를 명확히 정의한다. 또한 비동기 메시지를 전달해 컴포넌트 간 통신이 이뤄진다.

 

Reactive Programming의 특징

함수형 프로그래밍 방식을 통해 콜백과 같은 방식에서 사이드 이펙트가 없으므로 스레드에 안전하다.

(외부 상태를 변화시키지 않아 side effect가 없다.)

 

특징으로 리액티브 프로그래밍을 기반으로 작성된 프로그램의 특징은 실시간성을 가진다는 것이다. 프로그래머가 작성한 순서대로 돌아가는 방식과는 다르게 사용자의 액션에 상호작용하며 화면이 그에 따라 실시간으로 변하는 것이다. 유튜브의 좋아요 버튼을 누르면 카운트가 바로 올라가게 된다.

 

이를 실현하기 위해서는 프로그램이 지속적으로 특정 값에 대해 관찰을 해야 한다. 값을 관찰하다가 해당 값에 변화가 일어나면 특정 연산이 이루어져야 하는 것이다. 리액티브 프로그래밍은 변화를 파악하고 화면 혹은 다른 곳에서 적절한 처리를 한다.

 

스위프트에서는 Callback(closure), delegate, notification 등의 방법으로 비동기 처리를 Reactive하게 처리 할 수 있는 수단을 제공하고 있다. 여러 방법들이 있지만 비동기 작업이 연속될 경우 콜백 지옥을 발생시켜 구조를 복잡하게 만들 가능성이 발생한다. 따라서 관찰 방식을 사용하는 것이 더 효율적일 수 있다.

 

 

ReactiveX

Observable 스트림으로 비동기 프로그래밍을 할 수 있다.

 

 

참고

https://juneyr.dev/reactive-programming

'iOS > RxSwift' 카테고리의 다른 글

[RxSwift] Scheduler란?  (0) 2022.08.07
[RxSwift] Observable이란?  (0) 2022.08.06
[RxSwift] Driver란?  (0) 2022.03.29
[RxSwift] Subject와 Relay  (0) 2022.03.14
[RxSwift] Subject의 종류  (0) 2022.03.11