개요
리액티브 프로그래밍은 데이터 스트림을 함수로 조작하고 비동기적으로 작업하는 프로그래밍 패러다임이다. 데이터 소스에서 발생하는 데이터 이벤트 스트림을 옵저버가 구독하여 처리한다.
리액티브 프로그래밍은 함수형 프로그래밍 개념을 활용하여 데이터 스트림을 선언적으로 처리하는 패러다임이다. 복잡한 비동기 프로그래밍을 단순화할 수 있다. 1
함수형 프로그래밍 (Functional Programming)
프로그램을 순수 함수(Pure Function)의 조합으로 구현하는 프로그래밍 패러다임
순수 함수 (Pure Fucntion)
- Deterministic: 동일한 입력에 대해서 항상 동일한 출력을 반환하고
- Side Effect 없음: 함수를 실행하며 외부 상태를 변경하지 않는 함수
비동기 프로그래밍 (Asychronous Programming)
프로그램의 실행 흐름이 한 작업을 기다라지 않고 다른 작업을 수행할 수 있도록 하는 프로그래밍 방식
예제 코드
Observable<Double> temperatureStream = temperatureSensor.getDataStream();
temperatureStream.subscribe(
// 온도 센서에서 값이 업데이트 될 때마다 호출됨
// UI의 온도 값을 변경
value -> view.setTemp(value)
);
주요 개념
- 데이터 스트림: 데이터 소스에서 연속적으로 발생하는 데이터 이벤트 흐름이다.
- 이벤트가 일정한 시간 간격으로 발생하지 않을 수도 있다
- 함수형 프로그래밍: 데이터 스트림을 필터링, 변환, 그룹핑 등의 함수로 조작한다.
- 비동기 옵저버: 데이터 스트림 처리 결과를 비동기적으로 구독하고 소비한다.
- 선언적으로 작성된 Reactive 함수는 일종의 Wrapper이다. 라이브러리를 구현할 때는 복잡한 명령형 코드가 사용되었을 것이다.
활용 분야
리액티브 프로그래밍은 다음과 같은 분야에서 유용하다.
- 모바일 개발
- 데이터 처리
- 실시간 UI 렌더링
(생각) 가상화폐 거래소에서 가상화폐 가격이 특정 수치를 돌파했을 때 사용자에게 알림을 주는 기능을 만들 때 활용할 수 있을 것 같다.
- 가상화폐의 가격은 여러 사용자가 실시간으로 거래하는 데이터에서 가장 최근 거래 결과로 결정된다. 이는 Data Stream으로 표현할 수 있다.
- 끝이 없는 데이터이고, 데이터를 모아서 결과를 보여주는 것이 아니라 실시간으로 데이터의 변동과 파생되는 값의 변동을 보여줘야 하기 때문에 Data Stream으로 표현하기 적절한 데이터이다
- 가상화폐 가격이 동기적으로 계산되어서 DB에 거래 데이터를 저장한 후에 가격이 업데이트된다면 사용자에게 표시되는 가격에 시차가 크게 생긴다. 따라서 DB에 거래 데이터를 저장하는 로직은 비동기적으로 실행되어야 한다
- 사용자에게 알림을 주는 로직도 마찬가지로 비동기로 구현하여 가격 업데이트 등 다른 로직의 실행 시간에 영향을 주지 않는 것이 좋다.
.filter()
로 사용자가 지정한 가격 이상인 지 필터링한 다음.first()
로 사용자에게 1회 알림을 주면 될 것 같다
RxJava
Java에서 리액티브 프로그래밍을 구현할 수 있는 라이브러리인 RxJava를 통해 다양한 연산자를 사용할 수 있다.
.filter()
- 데이터 스트림에서 특정 조건을 만족(람다 함수 return 값이 true)하는 항목만 통과시킨다
- 사용하면 데이터 스트림의 항목 개수가 줄어든다
.map()
- 데이터 스트림의 각 항목을 새로운 항목(람다 함수의 return 결과)로 변환한다
- 항목이 1:1 mapping 되기 때문에 전체 항목의 개수는 변하지 않는다
.debounce()
- 연속된 키보드 입력이 끝날 때 자동완성 결과를 보여주는 것처럼 연속적으로 호출(emit)되면 실행하지 않다가 일정 시간 동안 호출되지 않을 때 실행한다
참고 자료
- 원하는 결과를 선언하며, 구체적인 실행 단계를 명시하지 않은 프로그래밍 방식. 명령형 코드를 wrap하여 구현한다. [본문으로]
'Computer Science' 카테고리의 다른 글
[DB] MySQL에서 WHERE IN, JOIN, EXISTS의 성능 비교 (0) | 2024.07.05 |
---|---|
[Network][스크랩] Bearer Authentication 헤더 규칙이 정해진 배경 (0) | 2024.06.24 |
[Network] HTTP response status code (0) | 2024.04.06 |
[Network] REST API - Naming Convention, Best Practice (0) | 2024.04.06 |
[Network] REST API (0) | 2024.04.06 |