# RxJS 반응형 프로그래밍
# 용어 정리
- 제어의 역전이란 코드의 특정 부분이 런타임 시스템에서 제어의 흐름을 되돌려받는 방식을 일컫습니다. 즉, 콜백 함수가 데이터를 처리할 준비가 되면 런타임이 함수 처리기를 통해 애플리케이션을 다시 호출하거나 제어권을 돌려줍니다.
# 필요성
함수형과 반응형 패러다임이 혼합된 라이브러리는 동적 UI 또는 서비스 조율과 같이 중간 정도의 복잡성을 가진 상태 시스템을 구현할 때 빛을 내기 시작합니다.
Promise의 단점
- 마우스 움직임이나 파일 스트림의 바이이트 시퀀스처럼 둘 이상의 값을 생성하는 데이터 소스를 처리할 수 없다.
- Promise는 불변이라 취소할 수 없다. 예를 들어 Promise로 원격 HTTP 호출 값을 래핑할 때 해당 작업을 취소할 수 있는 메커니즘이 없다.
RxJS는 FP와 RP의 패러다임을 결합함으로써 다음과 같은 문제를 해결하는 데 도움을 줄 수 있습니다.
- 비동기 함수가 있는 친숙한 제어 흐름 구조 (for또는 while과 같은 반복문)들은 비동기를 인식하지 못하므로 제대로 동작하지 않습니다. 즉, 이들 구조는 반복 사이의 지연 시간 또는 대기 시간을 인식하지 못합니다.
- 각 콜백 내에서 try/catch 블록이 중첩된다면 에러 처리 전략이 금방 복잡해집니다.
- 비즈니스 로직은 지원해야 하는 중첩된 콜백 구조 안에서 밀접하게 결합될 수 있습니다. 코드가 중첩될수록 추론하기가 어려운 것은 자명합니다. 깊게 중첩된 함수는 가독성과 복잡성 측면에서 문제가 되는 다른 변수들과 함수들과 얽히게 됩니다. 따라서 독립적으로 유지 보수와 단위 테스트를 할 수 있는, 느슨하게 결합된 비즈니스 로직을 얻으려면 재사용 가능한 모듈형 컴포넌트를 생성하는 것이 좋습니다.
- 클로저를 과하게 사용하고 싶진 않겠지만, 자바스크립트에서 함수들은 클로저를 선언된 곳 주변에 만듭니다. 이런 함수들이 중첩된다는 것은 인수로서 전달된 변수의 상태뿐만 아니라 각 함수 선언을 둘러싼 모든 외부 변수의 상태도 고려해야된다는 것을 의미하며, 이로 인해 부가 작용(side effect)도 발생하게 됩니다. 부가 작용은 애플리케이션의 인지 부하를 높여 프로그램 상태 추적을 사실상 불가능하게 합니다. 이런 상황에서 if-else와 같은 조건물을 혼합하여 구성한다면 기능에 영향을 주는 버그가 발생하게 됩니다.
- 이벤트 또는 장기 실행 작업이 멋대로 작동하거나 취소해야 할 상황임을 감지하기는 어렵습니다. 처리하는 데 시간이 너무 오래 걸리는 원격 HTTP 요청을 생각해보면, 미리 정한 시간이 지나면 이벤트를 깨끗히 취소할 수 있는 메커니즘을 두는 것이 좋습니다. 하지만 자체 취소 메커니즘을 구현하는 작업은 서드 파티 라이브러리의 도움을 받아도 매우 어려울 수 있으며 에러가 발생하기 쉽습니다.
- 제대로 만든 반응형 디자인은 항상 사용자와 UI 컴포넌트의 상호 작용을 적절히 조절하여 시스템이 불필요하게 과부화되지 않습니다. 스로틀링, 바운싱 사용법 숙지.