본문 바로가기

FrontEnd

Rxjs 시작하기

반응형

Rxjs를 배워봅시다.

원문 링크입니다 : https://www.thisdot.co/blog/getting-started-with-rxjs

프론트엔드 분야에서 일해 본 적이 있다면 RxJS를 듣거나 보거나 사용한 적이 있을 것입니다.
RxJS는 정확히 뭔가요?

간단하게 말하면 이벤트를 위한 lodash 입니다.

우리는 그 정의를 확장하여 다음과 같이 말할 수 있습니다.

"이것은 Observer Pattern을 따르는 Observable을 사용하는 반응형 프로그래밍을 위한 라이브러리입니다."

그러나 이것이 RxJS가 무엇이며 실제로 사용하는 방법을 이해하는 데 정말 도움이 될까요?
아마 그렇지 않을 것입니다.

 

"RxJS가 유용한가요?"라고 물을 수도 있습니다.
비동기 코드를 작성하고 유지 관리하고 추론하기가 더 쉬워집니다.
하지만 이것이 가장 도움이 되는 설명인지 의심스럽습니다.

 

이 기사는 RxJS가 무엇이며 RxjS를 어떻게 시작하는지에 대한 이해를 돕기 위한 시도이빈다.

그러나 RxJS는 많은 개발자가  어려움을 겪는 두 가지 프로그래밍 패러다임의 구현이라는 점에 유의해야 합니다.
따라서 RxJS로 작업할 때 길을 잃거나 혼란스럽다고 느끼더라도 초조해하지 마십시오.

우리 모두 한때 그랬습니다.

 

먼저, RxJS의 몇 가지 간단한 사용 사례를 설정하는 방법을 자세히 설명하기 전에
Reactive ProgrammingObserver Pattern에 대한 기본 개요를 다룰 것입니다.


Reactive Programming

반응형 프로그래밍은

마우스 클릭과 같은 이벤트 이미터 또는 데이터 소스에서 생성된 이벤트에 반응하도록 코드를 작성하는
프로그래밍 패러다임입니다.

JavaScript를 이용해 DOM을 작업한 적이 있다면 이벤트에 대해 들어본 적이 있을 것입니다.
일반적인 이벤트는 onClick 이벤트 핸들러로 처리할 클릭 이벤트입니다.

<div onClick="handleClick()"></div>
이벤트의 더 나은 정의는 사용자가 작업을 수행하거나 HTTP 호출이 응답을 수신할 때 비동기적으로 생성되는 액션입니다.
즉, 리액티브 프로그래밍은 전적으로
애플리케이션이 실행될 때 생성되는 이벤트를 처리하는 것에 관한 것입니다.
사용자가 응용 프로그램을 사용할 때 생성하는 이벤트에 반응할 수 있으므로
사용자 상호 작용이 많은 응용 프로그램을 처리하는 훌륭한 방법입니다.

이것은 프론트엔드 개발을 위한 이상적인 후보입니다.
그러나 이벤트에 응답하는 애플리케이션을 작성하고 관리하는 것은 적절한 패턴이 없으면 빠르게 번거로워질 수 있습니다.


Observer Pattern

옵저버 패턴은 이벤트 처리 시스템 또는 애플리케이션 수명 주기 전반에 걸쳐
이벤트에 반응해야 하는 시스템을 구현할 때 일반적으로 사용되는 패턴입니다.

 

가장 기본적인 형태로 subjects와 observers로 구성되며, publishers와 subscribers라고도 합니다.
subjects는 일련의 이벤트와 종속 항목 목록으로 구성된 개체입니다. 이러한 종속자(dependents)는 observers입니다.

subjects의 스트림이 새 이벤트를 수신하면 각 observers에게 새 이벤트를 수신했음을 알리고 이벤트 사본을 보냅니다.
그런 다음 observers는 자신이 적합하다고 생각하는 방식으로 이 이벤트를 처리합니다.
즉, 개발자가 설정한 방식으로 이벤트를 처리합니다.
이해를 명확히 하는 데 도움이 되는 간단한 예를 검토해 보겠습니다.

사용자가 클릭한 횟수를 기록하고, 사용자가 클릭할 때마다 경과한 시간을 기록하여
애플리케이션 내에서 사용자 참여를 추적하는 일부 기능을 구현해야 한다고 가정해 보겠습니다.

Observer 패턴을 사용하면

  • 이 작업을 매우 쉽게 수행할 수 있을 뿐만 아니라
  • 문제를 분리하여 테스트 및 유지 관리가 훨씬 쉬워지고
  • 사용자 클릭을 기반으로 메트릭을 기록하는 새로운 방법을 쉽게 추가하거나 제거할 수 있습니다.

사용자가 애플리케이션 내에서 클릭할 때마다 이벤트를 수신하는 subject가 있습니다.

그런 다음 두 개의 observers를 설정합니다.
 
  • 사용자가 애플리케이션 내에서 클릭한 횟수에 대한 기록을 업데이트하는 Observer와
  • 각 클릭 사이의 시간을 기록하는 Observer 입니다.
두 명의 다른 observers와 함께 이것을 처리하는 것은 지나친 것처럼 보일 수 있지만 애플리케이션 내에서 논리의 결합을 크게 줄입니다.

Creating and Using an Event Stream with RxJS

이제 RxJS를 사용하여 위의 사용 사례를 구현하는 방법을 살펴보겠습니다.
RxJS에는 이벤트 스트림을 만드는 두 가지 방법이 있습니다 :  SubjectsCreation Operators 입니다.

Subjects 

  • Subjects는 모든 Observer와 단일 실행 경로를 공유합니다.
  • 일반적으로 수동으로 설정하고 API를 사용하여 모든 Observer에게 메시지로 보낼 값을 지정합니다.
  • 이것은 다음 아티클에서 더 자세히 다룰 것입니다!

Creation Operators

  • 생성 연산자 이들은 거의 모든 것을 이벤트 스트림으로 변환하는 데 도움이 되는 특수 기능으로, 이를 비동기 방식으로 처리할 수 있습니다.
사용자 클릭을 기반으로 로직을 수행하는 사용 사례를 구현하기 위해
우리 애플리케이션 내에는 스트림을 생성하고 사용자가 내에서 클릭할 때마다 스트림의 Observer에게 새 메시지를 보내는
fromEvent라는 훌륭한 Creation Operator가 있습니다. 
 
 
이벤트 스트림을 설정하여 시작하겠습니다.
const userClick$ = fromEvent(document, 'click');
주목해야 할 것은 $ 접미사(suffix)입니다.
비동기 코드를 작성할 때 이 속성이 Observable임을 강조하기 위한 규칙입니다.
기본적으로 subscribed 될 수 있음을 의미합니다.
Observable에 대해서는 다음 기사에서 더 자세히 다룰 예정이니 계속 지켜봐 주세요!
이제 이 Event Stream을 사용하여 사용자가 애플리케이션 내에서 클릭한 횟수를 추적하는 방법을 살펴보겠습니다.
let numberOfClicks = 0;
const trackNumberClicksSubscription = userClick$.subscribe((event) => {
  numberOfClicks++;
  console.log(`User has clicked ${numberOfClicks} times!`);
});
사용자가 앱을 클릭할 때마다 numberOfClicks가 1씩 증가하고 total 값이 콘솔 출력에 기록됩니다.
User has clicked 1 times! 
User has clicked 2 times! 
User has clicked 3 times!
.subscribe()는 Subscription을 반환합니다.
이 구독은 필요한 경우 이벤트 스트림에서 unsubscribe할 수 있는 기능을 제공합니다.
예를 들어 애플리케이션이 사용자의 처음 10번의 클릭에만 관심이 있는 경우
numberOfClicks === 10일 때 이벤트 스트림에서 구독을 취소(unsubscribe)하는 논리를 추가할 수 있습니다.
이렇게 하면 필요하지 않을 때 로직이 실행되는 것을 방지하므로 성능에 도움이 됩니다. .
Subscriptions은 향후 기사에서 더 자세히 다룰 것입니다!
let numberOfClicks = 0;
const trackNumberClicksSubscription = userClick$.subscribe((event) => {
  numberOfClicks++;
  console.log(`User has clicked ${numberOfClicks} times!`);

  if(numberOfClicks === 10) {
  	// 반환된 구독을 취소함
    trackNumberClicksSubscription.unsubscribe();
    console.log(`No longer tracking number of user clicks!`);
  }
});
User has clicked 9 times! 
User has clicked 10 times!
No longer tracking number of user clicks!

이제 각 사용자 클릭 사이의 시간을 추적하는 다른 사용 사례는 어떻습니까?
userClick$ 이벤트 스트림에 대한 새 Subscription을 설정해 보겠습니다.

let lastClickTime = -1;
const trackTimeBetweenClicksSubscription = userClick$.subscribe((event) => {
  // Wait until the first click has been received before we start tracking
  // the time between each click
  if (lastClickTime === -1) {
    lastClickTime = Date.now();
    return;
  }

  const difference = (Date.now() - lastClickTime) / 1000;
  console.log(`Time between user clicks: ${difference}s`);

  lastClickTime = Date.now();
});

사용자가 마지막으로 클릭한 시간을 기록하고 그 시간과 새로운 클릭 이벤트를 수신한 시간의 차이를 확인하기만 하면 됩니다.

Date.now()는 epoch(클릭간 간격)을 밀리초 단위로 반환하므로

초 단위로 결과를 얻으려면 1000으로 나누어야 합니다.

이제 별도의 논리를 처리하는 두 개의 Subscriptions이 있으므로 쉽게 유지하고 테스트할 수 있습니다!

여기서 직접 동작하는 예시를 확인하세요! here

 

getting-started-with-rxjs - CodeSandbox

getting-started-with-rxjs by Coly010 using rxjs

codesandbox.io

결론

RxJS의 맛만 봤지만 비동기 이벤트 기반 코드를 작성하고 유지하는 데 RxJS가 제공하는 기능을 확인하셨길 바랍니다.
RxJS의 진정한 힘은 기능과 사용 사례를 더욱 확장할 수 있는 많은 Operators에서 나옵니다.
다른 기사에서 다룰 예정이니 계속 지켜봐 주세요!

 

 

반응형