본문 바로가기

gyub's 공부일기/RxJava

[RxJava] 리액티브 프로그래밍이란? Rxjava란?

안녕하세요 귭입니다!

 

안드로이드 개발을 하면서 요즘 대세인 Rx를 공부하기 시작했는데요,,,,,

저는 보통 공부를 할 때 블로그를 보며 공부하고 예제를 따라해본 후 책을 사서 공부를 하는 편인데요!

Rxjava도 제 공부법대로 공부를 했는데,,,, 모르겠어요😒😒

 

그래서 ..! 분홍책을 샀습니다 ㅋㄷㅋㄷ

그래서 ..! 책으로 공부하고 블로그에 정리하며 복습하려고 합니다

 

자! 이제 첫걸음을 떼보겠습니다

 

 

우선 Rxjava? 리액티브 프로그래밍?? 둘이 같은건가 다른건가? 뭐지 라는 생각을 했었습니다.(책 사기전에 ㅎ)

 

Rxjava란 ! 

: 리액티브 프로그래밍의 개념과 그것을 자바 언어로 구현한 라이브러리입니다 ( 밑으로 가며 구체적으로 설명할게유)

 

리액티브 프로그래밍이란!

: 데이터 흐름과 전달에 관한 프로그래밍이라고 보시면 됩니다

즉, 데이터 흐름을 먼저 정의하고 데이터가 변경되었을 때 연관되는 함수나 수식이 업뎃되는 방식입니다.

음.. 예를들면 엑셀을 생각하시면 됩니다.

엑셀(: 각 셀에 값을 넣거나 혹은 다른 셀을 조합해서 내가 원하는 값을 계산)

 

1월부터 12월의 매출액(연간 매출액)을 결산한다고 생각해봅시다

매출이 쭈루룩있다가 최종 매출액을 결산해보니 2월 매출이 900억에서 850억으로 줄고 8월 매출이 1200억에서 1300억으로 늘어났어요!! 이 때, 흔히 저희가 생각하는, 그리고 제가...생각한 것은 아 그럼 데이터를 갱신하고 모든 데이터를 가져와서 총합을 다시 구하면 되겠다겠죠?

하지만 리액티브 프로그래밍은 매월 매출액으로 지정해놓은 데이터 솟스에서 변경된 값을 전달하고, 2월과 8월의 개별 값이 미리 지정해둔 수식을 통해 계산되어 연말 매출액을 갱신합니다!!!!

즉 변경이 발생했다는 통지를 받아서 연말 매출액을 새로 계산하는 Pull하는 방식인 명령형 프로그래밍 방식과

다르게 리액티브 프로그래밍은 데이터 소스가 변경된 데이터를 Push하는 방식입니다. 일종의 옵저버 패턴이죠

 

 

그래서 RxJava가 뭔데?

리액티브 프로그래밍을 하려면 누군가 리액티브 프로그래밍을 할 수 있는 기반 시서을 제공해줘야 합니다.

즉, 데이터 소스를 정의할 수 있고 그것의 변경 사항을 받아서 내 프로그램에 알려줄 존재가 필요합니다.

그것을 JVM 위의 자바 언어로 구현해놓은 라이브러리가 바로 RxJava!!!입니다.

 

그냥 편하게 자바 언어로 리액티브 프로그래밍을 할 수 있게 만든거구나 라고 아시면 될 것 같아여✌

 

사용 이유

Rxjava는 2013년 2월 넷플릭스의 기술 블로그에서 처음 소개되었는데요.(갓넷플....) 그 당시 넷플릭스는 REST 기반의 서비스 API 호출 횟수와 서비스의 전반적인 성능을 개선하는 프로젝트를 진행했고, 그 결과 닷넷 환경의 리액티브 확장 라이브러리를 JVM에 포팅하여 만들었다고 합니다.

그래서 핵심 이유는!!!

1) 동시성을 적극적으로 끌어안을 필요가 있다.(Embrace Concurrency)

2) 자바 Future를 조합하기 어렵다는 점을 해결해야 한다. (Java Futures are Expensive to Compose)

3) 콜백 방식의 문제점을 개선해야 한다.(Callbacks Have Their Own Problems)

 

첫 번째 이유의 원인은 자바가 동시성 처리를 하는 데 번거로움이 있기 때문입니다.

이를 해결하려고 넷플은 클라이언트의 요청을 처리하는 서비스 계층에서 동시성을 적극적으로 끌어안았습니다. 클라이언트의 요청을 처리할 때 다수의 비동기 실행 흐름(스레드 등) 을 생성하고 그것의 결과를 취합하여 최종 리턴하는 방식으로 내부 로직을 변경했습니다.

 

여기서 잠깐!!!! 동시성이 뭔가여?

 

동시성 병렬성
동시에 실행되는 것 같이 보이는 것 실제로 동시에 여러 작업이 처리되는 것
싱글 코어에서 멀티 쓰레드(Multi thread)를 동작 시키는 방식 멀티 코어에서 멀티 쓰레드(Multi thread)를 동작시키는 방식
한번에 많은 것을 처리 한번에 많은 일을 처리
논리적인 개념 물리적인 개념

동시성은 한 프로그램 내에서 실행되는 여러 스레드가 객체를 공유하는 경우 입니다. 스프링에서는 요청 1개당 하나의 스레드를 사용하기 때문에, 여러 요청이 오는경우 스레드도 여러개가 생깁니다. 따라서 자바에서 동기화를 통해 동시성을 처리하지 않으면 검증 로직을 뚫고 DB로 데이터가 입력되어 중복이 발생할 수 있게되는 것입니다.(DB에서 Lock 혹은 Unique Key로 중복 처리 하지 않은 경우)

 

대략적으로 이러합니다

 

두 번째 이유의 원인은 2013년 당시 자바 8에서 제공하는 CompletableFuture 같은 클래스가 제공되지 않았기 때문입니다. 그래서 비동기 흐름을 조합할 방법이 거의 없었습니다. Rxjava에서는 이를 해결하려고 비동기 흐름을 조합할수 있는 방법을 제공합니다. RxJava에서는 조합하는 실행 단위를 리액티브 연산자라고 합니다.

 

세 번째 이유의 원인은 콜백이 콜백을 부르는 콜백 지옥 상황이 코드의 가독성을 떨어뜨리고 문제 발생 시 디버깅을 어렵게 만들기 때문입니다. 비동기 방식으로 동작하는 가장 대표적인 프로그래밍 패턴은 콜백입니다. 그래서 RxJava는 콜백을 사용하지 않는 방향으로 설계해 이를 해결했습니다. 

반응형