본문 바로가기

유니티 개발 정보/프로그래밍

Reactive Extenstion(Rx) - 2

언제 Rx를 사용해야하는가

Rx의 장점

전통적인 방법으로 데스크탑 혹은 웹 기반 프로그램을 작성할 때, 가끔씩은 비동기 프로그래밍을 해야하는 경우가 있다. 데스크탑 어플리케이션은 입출력 또는 다른 활동적인 쓰레드를 블럭시킬 수 있는 UI 쓰레드를 가지고 있다. 실버라이트는 그 어떤 블럭도 허용하지 않으며 오직 비동기 프로그래밍만 가능하다. 그러나 요즘의 비동기 프로그래밍 모델의 사용자들은 수동으로 예외와 이벤트들의 취소를 관리해야만 한다. 이벤트를 더하고 빼기 위해, 사용자는 해독하기 어렵고 유지보수하기 힘든 코드를 작성해야만 한다.

게다가, 어플리케이션이 여러 곳의 데이터들과 상호작용한다면, 전통적인 방법으로는 각 데이터 스트림마다 이벤트 핸들러를 구현해야한다. 예를 들어, 사용자가 문자를 입력하자마자, 키 눌림 이벤트는, 키 눌림 이벤트 핸들러에게 전달된다. 이벤트 핸들러 내부에는, 이 이벤트와 반응하는 코드 혹은, 다른 모든 데이트 스트림들과의 관계를 조절하고 사용가능한 형식으로 데이터를 처리하는 코드가 들어가 있어야 한다.

만약, 이벤트를 구독하고 싶다면, 첫번째로 이벤트 핸들러를 만들어야 하고, 다음과 같이 이벤트를 구독하면 된다.

1
2
3
4
5
6
/// Declare an event
public event EventHandler<MouseEventArgs> MouseMove;
/// Publish data
MouseMove(this, args);
///Subscribe to an event
MouseMove += (sender, args) => Display(args)
cs

Rx를 사용해서 여러개의 비동기 데이터 스트림(주식 시장, 트위터, 컴퓨터 이벤트, 웹 서비스 요청등) 을 나타낼수 있고, IObserver<T> 인터페이스를 사용해서 이벤트 스트림을 구독할 수 있다. IObservable<T> 인터페이스는 이와 관련된 IObserver<T> 인터페이스의 리스트를 가지면서, 그들에게 모든 상태의 변화를 자동으로 알려준다. 그리고 Observable 타입으로 구현된 표준 LINQ 쿼리 명령어를 사용하여, Observable sequences에대해 질의 할 수 있다. 다시 말하면, 다수의 이벤트들에게 정적인 LINQ 명령을 사용해서 손쉽게 데이터를 거르고, 합하고, 여러 데이터를 함께 구성하고, 시간-기반 연산을 수행할 수 있다. 취소와 예외 또한 Rx에서 제공되는 확장 메소드를 가지고 우아한 방법으로 처리할 수 있다.

다음의 예는 이벤트 스트림을 나타내는 ISubject 인스턴스(IObservable과 IObserver를 둘다 상속받는다)를 만들고 있다. 이는 하나의 오브젝트에서 이벤트(데이터)를 발행할 수도 있고, 이벤트(데이터)를 받을 수도 있다.

1
2
3
4
5
6
///Declare an observable
public ISubject<MouseEventArgs> MouseMove;
///Publish data
MouseMove.OnNext(args);
///Subscribe to an observable
MouseMove.Subscribe(args => Display(args));
cs

또, 언제 이벤트 구독을 시작하고, 언제 알림이 구독자에게 푸쉬되는지를 제어하기 위해서 스케쥴러를 사용할 수 있다. 스케쥴러에 대해서는 다음 포스팅에서 좀 더 알아볼 것이다.