[TIL] 리액티브 프로그래밍

muchan
muchan
∙∙조회 6

리액티브 프로그래밍이란?

게임 코드의 상당수는 "반응"이다. 이걸 코드로 만드는 두가지 방법

  • 폴링: 매 프레임 값을 검사
  • 이벤트: 바뀐 쪽이 알려줌

이벤트 방식이 깔끔하지만 규모가 커지면 구독 해제 누락, 이벤트 하나로 표현 못하는 단점이 있다.

토대: 옵저버 패턴

리액티브를 정의하려면 그 토대인 옵저버 패턴을 알아야함

  • 주체(Subject): 사건을 일으키는 쪽
  • 관찰자(Observer): 알림을 받아 반응하는 쪽(구독자)

리액티브 프로그래밍: 옵저버 패턴의 확장

데이터의 흐름과 변화의 전파를 중심으로 프로그램을 짜는 패러다임

핵심 구성 요소

이름역할옵저버 패턴 대응
Observable값/사건의 시퀀스를 발행하는 쪽. “관찰당할 수 있는 것”주체(Subject)
ObserverObservable을 구독(Subscribe) 해 값이 올 때 반응하는 쪽관찰자(Observer)
Subscription구독 그 자체. 손에 쥐고 있다가 Dispose하면 해제-=에 해당 (표준화)

옵저버 패턴 위에 더해지는 3가지

  1. 연산자 합성: 이벤트 스트림에 Where/Select/Merge를 직접 적용하여 조합
  2. 에러/완료 채널: 값(OnNext) 뿐 아니라 에러와 완료라는 두 시맨틱이 추가됨(이 스트림은 여기서 끝났다/실패했다)
  3. 표준화된 해제(IDisposable): 구독이 곧 IDisposable 객체라서 Dispose()가 구독해제

push vs pull - 무엇이 뒤집혔나

IEnumerable과 Observable은 데이터 전달 방향만 뒤집힌, 서로 대응되는 관계임.

구분IEnumerable<T> (pull)Observable<T> (push)
데이터 흐름소비자가 끌어옴 (MoveNext 호출)생산자가 밀어 넣음 (OnNext 호출)
주도권소비자 (“다음 값 줘”)생산자 (“값 나왔다, 받아라”)
시간무관 - 원할 때 꺼냄본질 - 값이 언제 오는지가 정보의 일부
대표 도구LINQ (Where, Select…)Rx 연산자 (Where, Select… 같은 이름!)