본문 바로가기
프로그래밍/Angular

[RxJS / angular] 17. 데이터 스트림과 액션 스트림, Subject를 사용하는 이유

by 신나요 2022. 7. 28.

데이터 스트림과 액션 스트림이 무엇인지 알아보겠습니다. 그리고 액션 스트림에서 사용되는 Subject의 필요성에 대해 생각해 보도록 하겠습니다.


데이터 스트림(data stream)과 액션 스트림(action stream)

http get을 호출하면 옵저버블은 response라는 하나의 항목을 방출합니다.

예를 들어 response가 배열 데이터 [{a},{b}]를 방출하고 우리는 방출된 데이터를 이용해 화면에 적절히 표시하게 됩니다. 이러한 흐름을 데이터 스트림으로 생각할 수 있습니다. 그리고 방출이 끝나면 옵저버블이 complete이 되므로 더 이상 데이터를 방출하지 않는 죽은 스트림이 됩니다.

액션은 유저에 의해 발생되는 이벤트 입니다. 예를 들어 선택 박스를 클릭해서 선택을 하는 행위를 액션이라고 생각할 수 있습니다. 액션에 대한 옵저버블은 액션이 발생할 때마다 항목을 방출하는 옵저버블입니다. 예를 들어 선택 박스를 클릭해서 데이터를 필터링한다고 생각해 봅시다. 선택 박스를 클릭할 때마다 선택한 필터 값이 방출됩니다.

이러한 흐름을 액션 스트림으로 생각할 수 있습니다. 액션 스트림은 살아있습니다. 액션 스트림은 옵저버블이 중지될 때까지 새로운 값을 계속 내보냅니다.

 

데이터 스트림과 액션 스트림 결합

데이터 스트림과 액션 스트림을 결합하면 필터처리 같은 작업을 손쉽게 할 수 있습니다. 데이터 스트림과 액션 스트림을 combineLatest로 결합한다고 생각해 봅시다. 두 옵저버블을 결합하면 두 스트림에서 값이 방출된 됐다면 combineLatest에 의해 액션 스트림이 발생할 때마다 결합된 값을 방출하게 됩니다.

combineLatest에서 방출한 배열에는 데이터와 최신 액션 정보인 필터 선택 값이 포함되어 있습니다. 그리고 combineLatest가 방출할 때 다운스트림 파이프라인을 다시 시작합니다. 파이프라인 처리에 의해 필터 값을 이용해서 데이터를 골라낼 수 있습니다. 그리고 화면에 원하는 값만 표시할 수 있습니다. 이러한 처리 흐름이 리액티브 프로그래밍을 하는 키가 됩니다. 데이터 스트림을 액션 스트림과 결합함으로써 코드는 자동으로 유저 액션에 반응하고 그에 따라 화면 출력이 변합니다.


액션 스트림에서 Subject가 필요한 이유

액션 스트림을 만들기 위해 subject를 사용하면 편리합니다. Subject는 옵저버 인터페이스를 구현하고 있는 옵저버블입니다. 다시 말해 값도 방출하고 방출한 값을 처리할 수 있음을 뜻합니다. 왜 굳이 subject가 필요한지 한번 생각해 보겠습니다.

구독자(subscriber, observer)관점에서 옵저버블은 읽기 전용입니다. 구독자는 옵저버블의 알림을 구독하여 값을 처리할 수 있지만 반대로 값을 방출할 수는 없습니다. 옵저버블만이 값을 방출할 수 있습니다.

of 생성 함수를 사용하며 옵저버블을 생성하고 값을 방출할 수 있습니다. from 생성 함수도 마찬가지입니다. 하지만 from이나 of로 옵저버블이 만들어지고 나면 추가적으로 값을 방출할 수는 없습니다. 

http get의 경우를 살펴보겠습니다. http request를 발행하면 angular는 옵저버블을 생성하고 반환된 응답을 옵저버블에 내보냅니다. 하지만 위에서 한번 생성된 옵저버블을 통해서는 어떠한 값도 추가로 방출할 수는 없습니다.

 

옵저버는 옵저버블의 알림을 관찰하고 이에 응답합니다. 그리고 옵저버는 next, error, complete 메서드가 있는 인터페이스입니다. 이러한 메서드를 통해 옵저버는 옵저버블의 방출 값을 처리합니다.

 

값은 옵저버블만이 방출할 수 있습니다. 따라서 계속해서 발생하는 유저 액션에 대한 값을 방출하고 관찰하기 위해서는 옵저버 인터페이스도 구현하고 있는 옵저버블 객체가 필요하게 됩니다. RxJS에서는 이러한 기능을 Subject로 제공해 주고 있습니다. Subject는 옵저버블에 항목을 방출하는 next 메서드, 에러 알림을 방출하는 error, 완료하는 complete메소드를 가지고 있습니다. 다시 말해 Subject는 옵저버블이면서 옵저버입니다.


다음 포스트에서 subject와 BehaviroSubject에 대해 알아보도록 하겠습니다.

댓글