[TIL] 리액티브 프로그래밍
리액티브 프로그래밍이란?
게임 코드의 상당수는 "반응"이다. 이걸 코드로 만드는 두가지 방법
- 폴링: 매 프레임 값을 검사
- 이벤트: 바뀐 쪽이 알려줌
이벤트 방식이 깔끔하지만 규모가 커지면 구독 해제 누락, 이벤트 하나로 표현 못하는 단점이 있다.
토대: 옵저버 패턴
리액티브를 정의하려면 그 토대인 옵저버 패턴을 알아야함
- 주체(Subject): 사건을 일으키는 쪽
- 관찰자(Observer): 알림을 받아 반응하는 쪽(구독자)
리액티브 프로그래밍: 옵저버 패턴의 확장
데이터의 흐름과 변화의 전파를 중심으로 프로그램을 짜는 패러다임
핵심 구성 요소
| 이름 | 역할 | 옵저버 패턴 대응 |
|---|---|---|
| Observable | 값/사건의 시퀀스를 발행하는 쪽. “관찰당할 수 있는 것” | 주체(Subject) |
| Observer | Observable을 구독(Subscribe) 해 값이 올 때 반응하는 쪽 | 관찰자(Observer) |
| Subscription | 구독 그 자체. 손에 쥐고 있다가 Dispose하면 해제 | -=에 해당 (표준화) |
옵저버 패턴 위에 더해지는 3가지
- 연산자 합성: 이벤트 스트림에 Where/Select/Merge를 직접 적용하여 조합
- 에러/완료 채널: 값(OnNext) 뿐 아니라 에러와 완료라는 두 시맨틱이 추가됨(이 스트림은 여기서 끝났다/실패했다)
- 표준화된 해제(IDisposable): 구독이 곧 IDisposable 객체라서 Dispose()가 구독해제
push vs pull - 무엇이 뒤집혔나
IEnumerable과 Observable은 데이터 전달 방향만 뒤집힌, 서로 대응되는 관계임.
| 구분 | IEnumerable<T> (pull) | Observable<T> (push) |
|---|---|---|
| 데이터 흐름 | 소비자가 끌어옴 (MoveNext 호출) | 생산자가 밀어 넣음 (OnNext 호출) |
| 주도권 | 소비자 (“다음 값 줘”) | 생산자 (“값 나왔다, 받아라”) |
| 시간 | 무관 - 원할 때 꺼냄 | 본질 - 값이 언제 오는지가 정보의 일부 |
| 대표 도구 | LINQ (Where, Select…) | Rx 연산자 (Where, Select… 같은 이름!) |



![[Unity]ShaderGraph로 2D 흙타일 표현하기](https://data.develog.develrocket.com/upload/develog/ghks5658/1786458222815-ld97jd/_____2026-08-11_222113.png)


