오르카의 아틀리에


"아 이런 것이 있구나"하고 접했던 것은 오래되었지만 최근 들어 천천히 공부를 시작한 것이 UniRx이다. 일본인이 만든 Unity용 Reactive 프로그래밍 라이브러리 같은데 Unity는 .NET 버전도 낮고, .NET용 Rx는 무거운 감이 있어서 Unity에서 사용할 수 있게끔 만들었다고 한다. (일본에서 만들어서인지 검색하면 절반은 일본어 자료라 일본어를 읽지 못하는 입장에서는 대략 난감....)


Reactive Programming(Rx)이란?

이쪽 분야 프로그래밍은 많이 접해본 것이 아니지만, 초심자의 눈으로 보기에는 객체지향(OOP)이 모든 것을 "객체"로 보고 객체를 만들고 이용해서 프로그래밍했다면, Rx는 모든 것을 "스트림"으로 보고 스트림을 만들고 구독해서 데이터가 어떻게 변하고 어떤 이밴트가 발생했는지 캐치하여 프로그래밍하는 느낌이다. 또한, 이 프로그래밍 방식은 모든 것이 옵저버 패턴처럼(?!) 구현되어있다. (옵저버 패턴을 이용해 스트림을 구독(Subscribe)하여 이루어진다.)


UniRx의 기본적인 사용법


이 포스팅에서 다루어 볼 것은 어디까지 기초적인 사용법이다. 아직 공부하고 있는 프로그래밍 방법이고, 생소하다보니 학습이 조금 걸리는 편... 어느정도 이해가되면 Github에 예제들을 정리해서 올릴 예정이다. 


초심자로서 Rx가 모든 것을 스트림으로 보고 프로그래밍하는 느낌이라고 설명했는데 그럼 


이 "스트림"이라는 친구를 어떻게 만들고 사용할까? 

라는 생각이 든다. 여러 예제를 훑어 본 결과 UniRx에서는 크게 2가지 방법을 사용한 것 같다 (넓게 봤을 때는 그냥 한가지 인 것 같지만...)


첫번째 방법

UniRx에서 기본으로 제공하고 있는 "ReactiveProperty" 템플릿을 이용하는 방법이다. 이 변수를 선언해두고 Subscribe를 하면 이 변수의 값이 변할 때마다 스트림을 통해 통보받을 수 있다. 그럼 이 변수가 변화되었다는 것을 가지고 UI를 업데이트한다든가 특정한 상황인지 필터링해보고 맞다면 어떠 어떠한 처리를 한다고 프로그래밍할 수 있을 것이다. 코드를 보자, 간단한 타이머 예제이다.



주석에 대략적으로 적어났으니 어떻게 사용하면 되는지 약간 감이 올거라고 생각한다. 이 방법은 결국 뒤에서 설명할 것을 UniRx에서 잘 다듬어 놓은 것으로 생각하는데 int나 다른 기본 변수들의 변화를 감지하는 쪽이라면 이쪽이 훨씬 더 편리할 것이다.


다음 방법

Subject를 만들고 AsObservable 메소드를 통해 구독할 수 있게 만든 뒤 OnNext, OnError, OnCompleted를 이용하여 원하는 타이밍에 스트림으로 메시지를 보내는 방식이다. 코드를 살짝 보자.



코드를 보면 StreamTest에서 Subject를 만들고, 구독할 수 있게 AsObservable() 메소드를 통해 IObservable을 반환하고있다.


정리해서 그림으로 나타내면 이정도 일것같다.


물론 좀 더 활용하기 위해서 구독시 스트림에 여러 가지 필터링을 걸거나 스킵, 변환, 딜레이등을 이용하여 사용하지만, 기초 지식은 이 정도 인 것 같다. OOP나 절차 지향적인 프로그래밍 방법들'만' 다루어본 사람이 갑자기 이런 방식을 다루기 시작하면 사용방법이 익숙치 않아 조금 고생하는 편이다.


UniRx의 장점

UniRx의 장점이라면 여러 가지가 있을 수 있지만, 현재 초심자의 눈에는 Update문에 의존하지 않아도 된다는 점이다. 예제 코드를 보면 알 수 있듯 스트림 구독은 보통 한 번만 진행해두면 되므로 Start 안에서 이루어지고 있다. 이게 바로 Rx의 장점 중 하나겠지만 UniRx를 사용한다면 어떤 상황인지 판별하고 어떤 특수한 행동을 하는 여러 루틴을 객체 내부의 Update에서 판단하고 처리하는 것이 아니라 


원하는 상황을 알 수 있을 만한 스트림을 구독하고 필터링해서 한 덩어리 안에서 처리할 수 있다는 점이다.


그 외에도 여러가지 장점과 활용법이 박민근님의 PPT에 잘 녹아있다. 약 200 페이지 정도의 분량이지만, 한장 한장이 큼직하게 이루어져 있어서 읽어보기에 무리가 없을 것 같다. (나도 이걸 참고해서 공부 중)


관련글

  1. UniRx - Where과 Select 오퍼레이터 활용하기
  2. UniRx - A와 B 사이의 일 처리하기
  3. UniRx - 변수의 변화를 관찰하자