예제 링크: https://github.com/seyoungcho2/RxJavaExample
경로 : example/example1
명령형 프로그래밍과 반응형 프로그래밍
명령형 프로그래밍
명령형 프로그래밍은 컴퓨터에게 무엇을 하라고 명령하는 것이다.
예를 들어 1, 2, 3을 출력하는 명령형 프로그램을 만든다고 해보자. 그럴 경우 우리는 다음과 같이 컴퓨터에 명령을 내린다.
println("count : 1")
println("count : 2")
println("count : 3")
명령을 받은 컴퓨터는 명령을 받아 순서대로 출력값을 내어놓는다.
반응형 프로그래밍
그렇다면 이것을 반응형 프로그래밍으로 만들어보면 어떻게 될까?
먼저 다음과 같은 PublishSubject을 이용한 데이터 발행자(Publisher)를 만든다. 아직은 PublishSubject에 대해 깊게 이해할 필요 없으며 PublishSubject가 자신을 구독하는 구독자에게 변수를 발행(Publish)한다는 것만 알면된다.
val publisher: PublishSubject<String> = PublishSubject.create()
publisher라 명명된 변수는 자신을 구독하는 구독자에게 값을 발행하며 구독자는 값이 발행될 경우 발행된 데이터를 처리한다. 구독자는 subscribe 메서드를 통해 붙일 수 있다. 예를 들어 위의 publisher에 다음과 같은 구독자가 붙었다고 해보자.
publisher.subscribe { it ->
println(it)
}
이제 publisher에서 다음과 같은 값을 발행하도록 한다.
publisher.onNext("count : 1")
publisher.onNext("count : 2")
publisher.onNext("count : 3")
구독자는 값이 발행될 경우 값에 반응하여 값을 print 하는 동작을 수행한다. 따라서 다음과 같은 <그림1>과 똑같은 결과가 나온다.
즉, 데이터가 발행되는 발행자에 구독자를 붙여놓으면 해당 발행자에 새로운 데이터가 발행되었을 경우 구독자가 해당 데이터를 처리한다.
전체 코드는 다음과 같다.
fun main() {
val publisher: PublishSubject<String> = PublishSubject.create()
publisher.subscribe { it ->
println(it)
}
publisher.onNext("count : 1")
publisher.onNext("count : 2")
publisher.onNext("count : 3")
}
반응형 프로그래밍의 의의
반응형 프로그램은 UI가 있는 프로그램에서 진가를 발휘한다. 기존 명령형 프로그래밍을 이용할 경우 사용자의 동작에 대해 일일히 컴퓨터가 어떤 동작을 해야 하는지 알려주어야 했다. 예를 들어 같은 역할을 하는 사용자 동작이 여러 곳에서 발생할 수 있을 경우 각각에 listener을 붙이고 listener마다 동작에 대한 처리를 해주어야 했다.
button1.setOnClickListener {
doSomething()
}
button2.setOnClickListener {
doSomething()
}
button3.setOnClickListener {
doSomething()
}
button이 클릭될 때마다 doSomething() 동작이 일어나야 할 때 위와 같이 처리해야 한다.
하지만, 반응형 프로그래밍에서는 사용자의 동작 이벤트에 대해 발행자로 데이터를 발행하도록 시키면, 해당 발행자에 대한 구독자의 동작만 신경쓰면 되기 때문에 관리 포인트가 줄어들게 된다.
button1.setOnClickListener {
publisher.onNext(BUTTON_CLICK_EVENT)
}
button2.setOnClickListener {
publisher.onNext(BUTTON_CLICK_EVENT)
}
button3.setOnClickListener {
publisher.onNext(BUTTON_CLICK_EVENT)
}
publisher.subscribe{
if(it == BUTTON_CLICK_EVENT)
doSomething()
}
publisher은 클릭 이벤트에 대한 발행자이고 해당 발행자에게 이벤트가 일어났을 때 어떤 동작을 할지만 설정해놓으면 데이터가 발행되는대로 해당 동작이 수행되게 된다.