선생님, 개발을 잘하고 싶어요.

[반응형 프로그래밍] RxJava 안쓰고 말하는 반응형 프로그래밍 철학 본문

개발/소프트웨어 개발

[반응형 프로그래밍] RxJava 안쓰고 말하는 반응형 프로그래밍 철학

알고싶은 승민 2020. 3. 15. 00:53

서론

RxJava, 정말 정말 안드로이드 공부를 하거나 콘퍼런스를 볼 때 귀에 딱지가 앉을 정도로 많이 듣던 기술입니다.

그리고 익히는 것도 엄청나게 고생한 것 같습니다. (아직도 한참 멀었지만🙇‍♂️)

 

공식 문서, 콘퍼런스, 블로그 포스팅, 책처럼 다양한 방법으로 공부를 시도했고 작은 프로젝트에 써볼 수 있는 상황에 억지로 쓰면서 익혔습니다. 그리고 이제는 RxJava가 가진 장점을 (부분적으로)이해하였고 실제 프로젝트에 열심히 적용하고 있습니다.

 

ReactiveX는 공식 문서 가이드가 Document 이상이 아닙니다. 라이브러리 공식 문서에 으레 있는 "실습으로 배우기"와 같은 내용이 아니에요. 실무 가이드가 아닙니다. Reactive의 개념이 무엇이고 어떤 연산자가 존재하는지 이론적으로 도형으로 그려서 설명해요.

 

물론 나중에 가서는 도형이 도움이 많이 되겠지만, 처음 시작하던 저에게는 와 닿지 않았어요.

 

그래서 저는 저만의 방법으로 RxJava에 설명해 보려고 합니다. 제가 느낀 Reactive 프로그래밍의 장점이 무엇인지, 왜 이런 패러다임으로 개발을 해야 하는지, RxJava에서 꼭 알아야 하는 개념들이 무엇인지, 연산자는 무엇인지 정리해 보고자 합니다.

 

오늘은 Reactive 프로그래밍 즉, 반응형 프로그래밍에 관해서 얘기해 볼 거예요. 오늘은 철학에 대한 포스팅이라 가볍게 이런 생각 하는 사람도 있다고 하며 봐주시면 좋을 것 같아요.


TL;DR

  • A 라는 사건이 발생할 때마다 동작하는 행위를 작성하는 것을 이벤트 기반 프로그래밍이라 한다
  • 변수 A 의 값이 변할 때 마다 A 값을 구독한 객체에게 변화한 값을 알려주는 것을 옵저버 패턴이라 한다
  • 옵저버 패턴을 사용하면 데이터의 변화이벤트가 같아진다
  • 이러한 데이터의 변화에 반응하는 행위를 정의하는 형태로 작성하는 것을 반응형 프로그래밍이라 한다

이벤트 기반 프로그래밍

윈도우 프로그램을 개발해야 한다고 생각해 봅시다.

 

텍스트와 버튼을 Drag and Drop으로 화면에 배치하고 시작을 하면 아까 배치한 대로 Window가 나타납니다.

 

그런데 말입니다. 그렇게 배치한 버튼은 눌러도 아무런 반응이 없습니다. 알고 보니, 버튼 클릭 이벤트를 추가해야 한다고 합니다.

 

무수한 이벤트들이...!

사용자 이벤트를 우리의 코드와 연결하는 방법은 다음과 같습니다.

 

  1. 윈도우 OS는 사용자가 A 버튼을 클릭할 때, A 버튼의 onClick 함수를 호출하기로 약속합니다.
  2. 프로그래머는 A 버튼이 눌릴 때 동작하는 코드를 작성하고 A 버튼의 onClick 함수로 연결합니다.

윈도우 OS는 이러한 이벤트들을 많이 만들어 놨습니다.

마우스 누를 때, 왼쪽 누를 때, 오른쪽 누를 때, 마우스를 땔 때, 사용자가 ~~ 할 때마다 어떤 주소에 있는 함수를 호출 할 것인지 약조해 놓은 것이죠.

 

프로그래머는 사용자가 ~~ 할 때마다 동작할 코드를 OS와 약조한 위치에 두는 것이죠. 이것을 이벤트 기반 프로그래밍 이라고 합니다.

 

사용자 행동이 언제 발생할 지 모르는 GUI프로그래밍 특성 상 항상 사용자 행동이 발생할 때(이벤트가 발생할 때)기반으로 프로그래밍 해야합니다.

정리하자면...

이벤트란 무엇인가

→ (어떤 원인에 의해 발생한)사건

 

이벤트 기반 프로그래밍이란 무엇인가

이벤트가 발생할 때마다, 동작하는 코드를 작성하는 것

→ 어떠한 이유로 사건이 발생할 때마다, 프로그래머가 지정한 행동을 수행하는 것

→ Ex) 사용자가 X 버튼을 누를 때마다, 화면이 꺼진다


데이터 변화에 반응하는 법 (Observer Pattern)

이벤트 기반 프로그래밍이랑 아무 상관 없이, Observer Pattern에 대해서 들어보신 경험이 있을 겁니다.

 

데이터(Subject)가 변경될 때 변경을 알람 받는(Observer) 디자인 패턴이죠. 자세한 내용은 다른 블로그 포스팅에 적어 놓았으니 자세한 내용이 궁금하신 분은 참조해주세요.

 

[프로젝트 삽질기] Observer Pattern, 뭐하는 녀석인데?

서론 지금으로부터 1-2년 전, 간단한 이미지 편집, 뷰어 윈도우 프로그램을 만들어야 하는 일이 생겼다. 오늘 포스팅할 내용은 이때의 삽질 경험이다. 오늘의 프로그램 대략적인 프로그램 구조부터 보고 들어가면..

greedy0110.tistory.com

정리하자면...

Subject(변경 되는 값)

→ 본질 데이터

→ Observer 에게 데이터 변경을 알린다 (단순히 Observer 들 마다 update 함수를 호출 하는 것으로 달성할 수 있다)

a.k.a 데이터 스트림

 

 

Observer(데이터가 변경될 때 그 값에 따라 적절하게 응답하는 녀석)

데이터가 변경 될 때, 변경된 값을 알림 받는다

→ 변경된 값을 기반으로 행동을 정의한다


반응형 프로그래밍

  • 이벤트 기반 프로그래밍
  • Observer Pattern

우리는 이 두 가지를 조합하면 재밌는 사실을 추론해 낼 수 있는데 그것은 바로

데이터의 변화를 이벤트로 생각할 수 있다.

는 것입니다. 그렇습니다 이벤트는 사용자 입력에 의해서만 발생하는 개념이 아닙니다.

"데이터가 변경되는 사건"또한 이벤트이고 Observer Pattern을 사용하면 그 "데이터가 변경되는 사건이 발생할 때 마다"동작을 정의할 수 있는 거죠.

 

그러면 우리는 본질 데이터와 데이터가 변경될 때 동작만으로 프로그램을 정의할 수 있지 않을까? 라는 재밌는 생각을 할 수 있습니다.

 

사용자의 클릭 이벤트에 행동을 정의 했듯이

차량 리스트 값이 변경 될 때 마다 차량 리스트를 다시 그려줄 수 있다는 것이죠.


조금 머리 아픈 이야기를 해봅시다.

 

사실 "데이터가 변경되는 사건"을 기반으로 작업을 한다는 것은, 데이터를 코드가 입력되는 그 순간의 고정적인 값으로 보는 것이 아닙니다. 데이터가 변경될 때, 그 변경된 데이터 값에 따른 행동을 정의하는 것입니다.

 

여기서 데이터의 변화를 방출하는 객체를 "데이터 스트림"이라고 부릅니다. 데이터라는 물이 파이프를 타고 흐른다고 생각하면 편합니다.

 

"데이터 스트림"이 방출하는 변경된 데이터를 가지고 작업을 수행 하는 것을 "데이터 스트림을 구독한다"라고 합니다. 파이프의 구멍을 통해 물을 받는 것을 생각해보세요.

 

 

끝없이 흐르는 데이터 스트림

 


결론

자, RxJava를 공부하기 전에 반응형 프로그래밍에 대해서 정리해 봅시다.

 

데이터 스트림을 구독해서, 데이터가 변경될 때마다 행동을 정의하는 프로그래밍 방법

데이터 스트림이라는 개념이 가장 중요합니다. 기존에 듣지도 보지도 못하던 개념이에요.

스트림은 기본적으로 "변화하는 값"을 프로그램 변수로 취급할 수 있는 녀석입니다.

이 스트림 개념을 활용하면

 

프로그래밍의 방식이

  1. 프로그램에 흐르는 본질 데이터를 찾아낸다.
  2. 데이터 스트림을 선언한다.
  3. 프로그램을 만들 때 데이터가 필요한 위치에서 스트림을 구독해서 데이터 처리한다.

로 바뀌게 됩니다.

 

명령형 프로그래밍에선 흔하지 않은 이 개념이 어떤 형태로 구현될까요?

RxJava를 통해서 확인 해 볼 수 있습니다. 함께 ReactiveX 공부하러 가보실까요?

Comments