RxJava 강의 2 - 반응형 프로그래밍 이란, RxJava란 - Reactive Programming이 무엇인가

Reactive Programming이 무엇인지, ReactiveX / RxJava는 무엇인지 대해서 설명합니다.

📚 TL;DR

📖 Reactive Programming 이란

  • 먼저, 특정 이벤트가 발생 했을 때 어떤 행동을 할 지 서술하는 방식을 이벤트 기반 프로그래밍이라 함
  • 옵저버 패턴은, 데이터의 변화가 감지되면 옵저버들에게 데이터가 변화했음을 알려 줌
  • 따라서, 옵저버 패턴을 사용하면 데이터의 변화를 하나의 이벤트, 데이터 흐름으로 다룰 수 있게 됨
  • 데이터가 변경 되는것을 하나의 이벤트로 보고, 이벤트가 발생 했을 때 ( == 데이터가 변경 되었을 때 ) 어떤 작업을 진행 할 지 서술 해놓는 방식으로 개발하는 것이 반응형 프로그래밍

📖 RactiveX, RxJava 란

  • ReactiveX는 Reactive Programming을 쉽게 할 수 있도록 도와주는 API를 제공하는 라이브러리
  • ReactiveX를 활용하면, 데이터 흐름들을 서로 엮거나, 변환하여 다른 이벤트 흐름을 쉽게 만들어 낼 수 있음
  • ReactiveX를 Java를 활용하여 구현한 라이브러리 → RxJava

📖 Reactive Programming 의 이점

  • 데이터의 변화에 대응하는 pipeline을 한눈에 볼 수 있다.
  • 콜백을 제거하고, 데이터 흐름으로 만들 수 있다.
  • 데이터의 변화들을 엮어서 하나의 데이터 흐름으로 통합 하기 쉽다.

📚 Reactive Programming 이란

📖 Event Driven Programming 이란

어떤 프로그램에서 유저가 로그인 버튼을 클릭 했을 때, 로그인 작업을 진행하는 서비스를 개발한다고 가정 해 봅시다.

이 서비스를 개발 하는 방법으로는 크게 두가지가 있습니다.

  1. 0.1초 ( 짧은 시간 )마다 유저가 버튼을 클릭 했는지 확인하는 작업을 진행하고, 클릭 했음이 확인 되면 로그인 작업을 시작합니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     while (true) {
     		if (checkButtonHasClicked()) {
     				startLoginTask();
     				break;
     		}
     }
    
     private fun checkButtonHasClicked() : Boolean {
     		// 버튼이 클릭 되면 True, 클릭된 적이 없으면 false를 리턴 
     }
    
  2. 유저가 버튼을 클릭 했다는 신호가 왔을 때, 로그인 작업을 시작합니다. ( 콜백 함수를 등록하는 것과 같습니다. )

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     // Button / ButtonClickListener는 Android에서 따온 것이며
     // 아래의 코드는 이미 안드로이드 SDK에 구현 되어 있어 가져다 사용하시면 됩니다. 
     // 아래에 적힌 코드들은 사실 Button의 상위 클래스인 View에 구현되어 있습니다. 
     class Button : View {
     		private val buttonClickListener: ButtonClickListener? = null
    
     		fun setOnClickListener(listener : ButtonClickListener) {
     				buttonClickListener = listener
     		}
    
     		fun performClick() {
     				buttonClickListener?.onClick()
     		}
     }
    
     interface ButtonClickListener {
     		fun onClick()
     }
    
     class LoginView {
     		private val loginButton : Button 
    
     		init {
     				// Button에 Click Listener 등록 ( CallBack 등록 ) 
     				loginButton.setOnClickListener {
     						startLoginTask()
     				}
     		}
     }
    

위 두가지 방법 중 첫번째 방법은, 프로그램이 지켜 보아야 할 컴포넌트가 많아 졌을 때 성능상의 이슈가 있을 수 있으며, 비효율적인 연산이 상당히 많을 수 있습니다.

따라서, 안드로이드 OS에서는 대부분의 UI 이벤트를 두번째 방식으로 처리합니다.

안드로이드 OS에는, 버튼 ( View ) 가 클릭 되었을 때, 위에 서술된 performClick 함수가 호출되도록 개발이 되어 있으며, performClick 함수 안에서는 등록된 ButtonClickListener 가 있다면 해당 listener 에게 버튼이 클릭되었다는 신호가 가도록 개발 되어 있습니다.

그러면, 유저가 버튼을 클릭 했을 때, 어떤 행동을 할 지 서술 해 놓고 등록 해 놓는다면 ( setOnClickListener 를 통하여 ) 유저가 버튼을 클릭 헀을 때, 등록된 행동을 진행하게 됩니다.

이와 같이, 특정 이벤트가 발생 했을 때 어떤 행동을 할지 서술하는 프로그래밍 기법을 이벤트 기반 프로그래밍 이라고 합니다.

📖 Observer Pattern 이란

Observer Pattern이 어떤 것인지는, 지난 포스팅에서 자세히 서술 해 두었으므로 지난 포스팅을 참조 해 주세요

위 포스팅의 내용을 살펴보면, Observer Pattern은 관찰 대상 ( value in Subject )이 변경 되었을 때, 관찰 대상을 구독하고 있는 관찰자 ( Observer ) 들에게 값이 변경되었음을 알려준다고 나와 있습니다.

따라서, Observer Pattern을 활용하면, 데이터의 변화가 이벤트를 발생 시키는 것을 확인 할 수 있으며, 이는 데이터를 변경하는 것이 이벤트로 전환될 수 있음과 같은 이야기 입니다.

또, Observer Pattern에서 관찰자 ( Observer )에는 값이 변경 되었을 때 어떤 행동을 할지 서술 해 놓으므로 값 변경에 대한 이벤트 기반 프로그래밍으로 볼 수 있습니다.

📖 Reactive Programming 이란

위에서 설명한 것과 같이, Observer Pattern을 활용하면 데이터가 변경 되었을 때 이를 하나의 이벤트로 변경 할 수 있습니다.

반응형 프로그래밍이란, Observer Pattern과 Event Programming을 엮어, 데이터가 변경 되었을 때 어떤 작업을 할 지 미리 선언해놓는 개발 방식입니다.

다시 말하면, 데이터가 변경 될 때 어떤 동작을 할 지 선언 해놓는 방식으로 개발하는 형식이 반응형 프로그래밍 인 것입니다.

반응형 프로그래밍에서는 Observer Pattern에서 Subject와 같이, 데이터의 변화를 방출하는 객체를 Data Stream 이라고 칭합니다.

반응형 프로그래밍에서는 데이터 스트림을 관찰자 ( Observer )가 구독 ( Subscribe )하고, 데이터 변경 시 관찰자가 어떤 행동을 할 지 서술 해 놓는 방식으로 개발을 진행하게 됩니다.

반응형 프로그래밍은 데이터 스트림과 변화에 대한 선언적 프로그래밍 패러다임 - WIKI

위키 백과에 보면, Reactive Programming이 위와 같이 정의 되어 있습니다.

위에 적힌 말을 다시 해석 해 본다면,

데이터 스트림 ( 데이터의 변화를 방출하는 객체 )를 통해 값이 변할 때 어떤 행동을 할지 미리 서술 해 놓는 프로그래밍 패러다임 - Rams

으로 해석 할 수 있습니다.

📚 ReactiveX, RxJava 란

📖 ReactiveX 란

ReactiveX는, Reactive Programming을 좀 더 편하게 구현하기 위해 만들어진 라이브러리 입니다. ( Docs : link )

이 라이브러리를 활용하면, 데이터 스트림 생성 / 데이터 스트림 구독 / 데이터 스트림 구독 취소 / 데이터 스트림 구독 중에 에러가 발생 했을 시 할 행동 정의 / 데이터 스트림 병합 / 데이터 스트림 발행을 어떤 쓰레드에서 할 지, 데이터 스트림 구독을 어떤 쓰레드에서 할 지 지정 등 데이터 스트림에 대한 작업들을 편리하고 쉽게 다룰 수 있습니다.

📖 RxJava 란

ReactiveX 라이브러리를 Java 기반으로 구현 한 것입니다.

ReactiveX 는 RxJava 뿐 아니라, RxSwift / RxPY / RxJS / RxScala 등 다른 언어로도 구현 되어 있습니다.

또 ReactiveX를 구현 할 때, 데이터 스트림을 다루는 메소드의 이름 / 데이터 스트림을 다루는 방식이 동일한 부분이 많아 RxJava를 익혀 놓는다면 크게 어려움 없이 다른 ReactiveX 라이브러리의 코드를 읽을 수 있습니다.