🌳 리액티브 프로그래밍이 주목받는 배경
최근에 모바일, 사물인터넷, 클라우드 등 시스템에서 처리할 이벤트나 데이터가 극단적으로 증가하면서 대용량 데이터의 저장, 업데이트, 실시간 반영을 효율적으로 해결할 방법으로 리액티브 프로그래밍이 주목받고 있다.
🌳 리액티브 프로그래밍
데이터가 변경될 때마다 관련 프로그램이 반응해 데이터를 처리하는 프로그래밍 방식이다.
여기서 중요한 포인트는 반응형과 데이터 흐름이다.
🌳 반응형
옵저버 패턴(Observer Pattern)의 그 자체를 말한다. 옵저버 패턴은 간단하게 얘기하자면 어떤 상태 변화가 있을 때마다 그와 관련된 객체들에게 알림을 보내는 디자인 패턴이다.
참고로, Reactive Programming은 Observer Pattern의 확장한 프로그래밍 방식이다.
Observer Pattern 구현 시 사용되는 용어를 간단히 살펴보자.
Subscribe : 구독하다 Observable : 관측할 수 있는 Observer : 관측자 |
- Observer가 Observable을 관찰한다.
- Observer과 Observable을 이어주는 동작이 Subscribe이다.
- Observer가 Observable을 Subscribe하면 Observable이 무언가의 이벤트를 발생시킬 때 Observer가 알 수 있다.(예를 들어 유튜브 구독 알람 설정을 생각하면 된다. 좋아요 구독)
Observable을 Hot Observable과 Cold Observable로 두 가지로 나눌 수 있다. 두 종류의 차이에 대해 알아보자.
Hot Observable
: 구독자가 없을 때 이벤트가 발생하면 이벤트를 전달하려고 한다. 즉, 구독자가 없음에도 이벤트를 전달하기 위한 로직을 실행한다. (ex. 인스타 라이브, 페이스북 라이브)
Cold Observable
: 구독자가 없으면 이벤트를 전달하려 하지 않는다. 로직을 실행하지 않는다. (ex. 넷플릭스 같은 VOD 서비스)
🌳 데이터 흐름(Data Stream / Data Flow)
Reactive Programming은 데이터 흐름이다. 데이터 흐름만 들어서는 정확히 무엇인지 이해가 가지 않아 다른 개념은 컨트롤 흐름(Control Flow)에 대해서도 함께 알아보자.
🍀 Control Flow
if/else, switch/case, for/while 등으로 변수를 변화시켜 로직을 전개해나가는 방식이다. 컨트롤이 움직이면서 한 줄씩, 순차적으로 실행한다. 이는 명령형, 절차적, 순차적이다.
int y = f(x);
int z = g(y);
🍀 Data Flow
변수라는 상태가 없이 재귀함수 혹은 파이트와 같은 방식으로 로직을 전개해나가는 방식이다. 여러 개의 작은 블록 사이로 데이터가 흐르도록 구성해서 소프트웨어 전체에 데이터가 흐르게 한다. 이는 선언적, 동시적이다. 함수와 리턴 값을 체이닝을 통해 변화시켜 나간다.
그렇기에 g와 f의 블록을 묶어서 합성함수가 된다.
g * f
🌳 리액티브 프로그래밍 예시
위에서 개념과 중요한 단어에 대해 살펴보았다. 이해를 돕기 위해 예제와 함께 살펴보자.
부가가치세를 계산하는 경우를 예로 들어보자.
리액티브 프로그래밍이 아닐 때
- 상품가격이 부가가치세 금액을 바꾼다고 생각한다.
리액티브 프로그래밍일 때
- 상품가격 데이터를 전달만 한다.
- 부가가치세 항목이 새로운 데이터를 받아 부가가치세 값을 변경한다고 생각
즉, 리액티브 프로그래밍일 때는 데이터 변경을 감지하여 변경 시에는 로직이 동작하기에 상품가격이 변경될 때마다 세금계산 버튼을 누르지 않고도 부가가치세 결과값을 알 수 있다.
🌳 참고
- RxJava 리액티브 프로그래밍, 스다 토모유키, 길벗
- NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기 fromJong Wook Kim (https://mobicon.tistory.com/467)
- https://www.slideshare.net/sunhyouplee/vuejs-reactive-programming-vuetiful-korea-2nd
- https://4z7l.github.io/2020/12/01/rxjava-1.html
- https://4z7l.github.io/2020/12/01/rxjava-1.html
'Java' 카테고리의 다른 글
[Java] FTP로 전송할 때 파일 사이즈가 커지는 문제 발생 (2) | 2025.01.07 |
---|---|
3주차 - 연산자 (1) | 2021.12.29 |
2주차 - 자바 데이터 타입, 변수 그리고 배열 (0) | 2021.08.27 |
1주차 - JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가 (0) | 2021.08.22 |