[서버/웹] Reactive(반응형) 프로그래밍이란 무엇일까?
Reactive 프로그래밍은 함수형 프로그래밍와 더불어 요즘 아주 핫한 것 같습니다.
우리가 사용하는 언어를 패러다임에 의해 분류하면 대략 아래와 같습니다. 아래에 표기하지 않은 다른 방식도 있겠지만 간단하게 아래만 보겠습니다.
┌명령형(Impterative) ┌ 절차형
│ └ 객체지향형
└선언형(Declarative) ┌ 함수형
└ Reactive
과거에는 절차형 프로그래밍이 유행했습니다. 우리가 생각할 수 있는 가장 간단한 프로그래밍 방식입니다. 단순히 한 줄 한 줄 실행되는 c언어를 생각하면 될 것 같습니다.
그러다가 객체지향이 인기를 끌면서 한동안은 Java와 같은 객체지향 프로그래밍이 대세였습니다. 장단점이 있겠지만 객체지향 프로그래밍은 말 그대로.. 객체 개념을 이용해서 표현을 하는데 상속, 다형성, 오버라이딩 등.. 여러 관련 무기를 사용할 수 있습니다.
그리고 최근은 함수형 프로그래밍과 Reactive 프로그래밍이 대세가 된 것 같습니다. 함수형 프로그래밍에 대해서는 아래의 글에서 간단하게 이야기했습니다.
그렇다면 Reactive 프로그래밍이란 무엇일까요?
사전에서 Reactive의 뜻을 찾아보면 '반응을 하는' 이라는 뜻을 가지고 있습니다. 한글로 번역하면 반응을 하는 프로그래밍 정도 되겠네요.
Reactive 프로그래밍과 반대되는 절차형 프로그래밍과 비교해서 보겠습니다.
int x=3;
int y=4;
int z=x+y; //z == 7
위와 같은 상황에서.. 위의 코드가 실행된 이후 x나 y의 값이 바뀌어도 z의 값은 변경되지 않습니다.
이와 달리 Reactive 프로그래밍 방식은 엑셀을 예로 들 수 있습니다.
위와 같이 간단하게 작성된 값이 있을 때 x의 값이 바뀌면 어떻게 될까요?
바로 자동으로 반응을 해서 z의 값이 바뀝니다. 말 그대로 Reactive 프로그래밍이죠.
Reactive 프로그래밍은 관찰 가능한 Component를 만들고, 이것의 변화를 감지(listen, observe)하여 변화가 일어날 때마다 처리(consume)할 수 있게 합니다.
이를 간단하게 Reactive 프로그래밍(RX Java)로 표현하면 아래와 같이 표현할 수 있습니다.
int y=4;
Observable.just(3, 30)
.subscribe(x -> System.out.println("z = " + (x+y)));
Reactive 프로그래밍에선 데이터의 변화를 데이터의 흐름(Stream)으로 생각하고 처리합니다. 저는 간단하게 x값의 변화를 Stream처럼 생각하고 3, 30의 값 변화를 가지도록 줬습니다. 이 값이 변할 떄마다 subscribe에 등록한 것이 호출됩니다. 람다식을 사용하여 좀 더 간결하게 표현이 되는데 값이 바뀔 때마다 x+y 결과를 간단하게 로그로 보여주게 만들었습니다.
그렇다면 RxJava나 RxAndroid를 왜 사용하는 것일까요?
영어긴 하지만.. 아래의 포스팅에 잘 정리되어 있습니다. ㅎㅎ
한 번 보시길 추천드립니다.
와.. 공식 홈페이지의 튜토리얼도 좋으니 참고하세요.
www.vogella.com/tutorials/RxJava/article.html
아래의 글도 좋아요!
taes-k.github.io/2019/05/21/about-spring-reactive/
아래에 발췌 내용이 있으나 전체 내용을 보시길 권장드립니다.
Reactive 프로그래밍의 목적 그렇다면 리액티브 프로그래밍은 어떤 목적에서 생겨났을까요? 서버에서의 리액티브 프로그래밍의 탄생은 리소스의 효율적 사용을 위함에 있었습니다. 리액트 이전에는 멀티쓰레드로써 병렬처리를 했지만, 쓰레드의 확장만으로는 CPU와 메모리의 제한이 있기에 비동기와 논블로킹의 새로운 프로그래밍 모델이 제안되었습니다. 논블로킹은 일반적인 쓰레드를 통한 비동기 작업과는 다르게, 쓰레드를 점유하지 않고 작업을 수행하여 하나의 쓰레드 내에서 동시에 많은 작업을 수행 할 수 있습니다. 이와 같이 작업을 하는데 있어서 너무 많은 트래픽이 몰릴경우 문제가 발생 하거나 성능이 제대로 나오지 않을수 있기에 Back-pressure (배압, 역압)을 통해 요청의 갯수를 제한하여 ‘고가용성’을 보장해 줍니다. 좋은 성능을 보인다기 보다는 ‘고가용성’의 단어를 쓴 이유는 non-blocking을 통해 애플리케이션의 실행속도의 퍼포먼스가 좋아진다는 아니기 때문입니다. 오히려 속도적인 성능은 더 나빠질 수도 있습니다. 다만, 작은 고정된 수의 스레드와 적은 메모리로 최대한의 효율을 내면서 확장 할수 있다는 의미입니다. |
*콜백과 reactive 차이
stackoverflow.com/questions/25098066/what-is-callback-hell-and-how-and-why-does-rx-solve-it
참고
www.raywenderlich.com/2071847-reactive-programming-with-rxandroid-in-kotlin-an-introduction
12bme.tistory.com/571?category=682904
github.com/ReactiveX/RxJava/wiki/Creating-Observables
댓글 영역