Skip to content

Reactive programming

MishkaOwner edited this page Apr 22, 2016 · 7 revisions

Agera는 Reactive 프로그래밍 패러다임을 구현하기 위해 잘 알려진 옵저버(Observer) 패턴을 사용합니다. Observable은 Obeservable 인터페이스로 표시하며 등록 된 모든 Observer들에게 이벤트를 전달하는 역할을 합니다. Observer는 Updatable 인터페이스로 표시하며, Observable에 등록하거나 Observable 로부터 등록 취소를 할수있습니다. Updatable은 이름 그대로 Event 에 반응을 하며 스스로 갱신(Update) 합니다.

이 위키에서는 Observable 인터페이스와 Updatable 인터페이스를 구현하는 자바 객체에서 Observable 과 Updatable 을 각각 명사로 취급합니다.

#Event 날리기(Push), Data 긁어오기(Pull)

Agera Push Event/Pull Data 모델{Pub/Sub 모델 같은 이름 필요}을 사용합니다. 무슨 말인가 하면, 이벤트(Event) 그 자체는 어떤 데이터를 지니고 있지 않다는 것이며, Updatable 이 갱신 할때 필요한 데이터를 Data Source Dependency 에서 스스로 가져오는 역할이라는 것을 의미합니다.

이러한 방식은, 데이터를 제공하는 역할이 Observable 인터페이스로부터 사라지며 간단한 Event들(버튼 클릭, 리스트 갱신, GCM 메세지같은 신호들등)을 캡슐화 할수있도록 해줍니다.

하지만, 일반적으로 Observable 또한 데이터를 제공하는데, 데이터를 제공하고 Event를 통해 제공된 데이터의 변경을 정의하는 Observable 을 Repository 라고 합니다. 그렇다고 이것이 Push Event/Pull Data 모델{Pub/Sub 모델 같은 이름 필요}을 변경한다는 것은 아닙니다. Repository는 데이터가 변경되 었을때 등록된 Updatable들에게 갱신을 하라고 Evnet를 보내고, 각 Updatable은 그 이벤트에 반응하며 Repository 에서 데이터를 긁어 옵니다. 이 모델의 이점 중 하나는 Repository에서 지연(Lazy) 계산을 수행 할 수 있도록, 데이터 소비가 Event발송에서 분리되어 있다는 것입니다.

Push Event/Pull Data 모델{Pub/Sub 모델 같은 이름 필요}과 일반 다중 스레드 처리로 인해 Updatable이 Repository의 데이터 변경 기록 전체를 볼 수 없을수도 있습니다. 이것은 의도적으로 설계된 동작입니다: 대부분의 경우(특히 앱의 UI 업데이트의 경우) 최근에 나온 최신의 데이터가 중요합니다.

따라서, Agera 스타일의 반응형(Reactive) 클라이언트의 표준 구현은 다음과 같이 구성됩니다:

  • Updatable을 어울리는 관련의 Event 통지 Observable들에게 등록합니다.
  • 선택적으로 모든 클라이언트 상태를 초기화하거나 해결하기 위해 Updatable을 수동으로 호출합니다.
  • Updatable이 아무 Observable에 의해 호출되길 기다립니다. 호출 되었을 때, 필요에 따라 클라이언트의 상태를 Data Source 에서 긁어온 새로운 데이터로 갱신합니다.
  • 반응(Reaction)이 더 이상 필요하지 때 Updatable 을 동일한 Observable 세트로부터 등록을 취소합니다.

단어 모음:Observer, Observable, Updatable, Repository, Register, Deregister/Unregister, Event, Data, Data Source.