TIL(사전캠프)

리액티브. (2024-06-27)

note994 2024. 6. 27. 19:33

1. 리액티브 스트림즈 관련 용어 정의

리액티브 스트림즈에 대한 이야기를 진행하면서 Publisher, Subscriber, Subscription, Processor, 데이터 통지, 구독 해지 등 리액티브 스트림즈에서 사용하는 다양한 용어들을 언급했다. 이 외에도 자주 사용하는 중요한 용어들이 더 있다. 이 용어들에 대해 간단히 살펴보자

 

Signal

Signal은 우리말로 '신호'라는 의미인데, 리액티브 스트림즈에서 Signal은 Publisher와 Subscriber간에 주고받는 상호작용을 신호, 즉 Signal이라고 표현한다.

 

리액티브 스트림즈의 인터페이스 코드에서 볼 수 있는 onSubscribe, onNext, onComplete, onError, request 또는 cancel 메서드를 리액티브 스트림즈에서는 Signal이라고 표현한다.

 

onSubscribe, onNext, onComplete, onError 메서드는 Subscriber 인터페이스에 정의되지만 이 메서드들을 실제 호출해서 사용하는 주체는 Publisher이기 때문에 Publisher가 Subscriber에게 보내는 Signal이라고 볼 수 있다.

 

request와 cancel 메서드는 Subscription 인터페이스 코드에 정의되지만 이 메서드들을 실제로 사용하는 주체는 Subscriber이므로 Subscriber가 Publisher에게 보내는 Signal이라고 볼 수 있다.


Demand

 Demand는 '수요, 요구'를 의미하는데, 리액티브 스트림즈에서도 비슷하다.

 

Demand는 Subscriber가 Publisher에게 요청하는 데이터를 의미한다. 더 구체적으로 얘기하면 Publisher가 아직 Subscriber에게 전달하지 않은 Subscriber가 요청한 데이터를 말한다.


Emit

Publisher와 Subscriber의 동작 과정을 설명하면서 Publisher가 Subscriber에게 데이터를 전달하는 것을 얼컬을 때 데이터를 '통지(발행, 게시, 방출)한다' 라는 용어를 사용했다. '통지', '발행', '게시', '방출'이란 용어들의 공통점은 입력으로 들어오는 데이터를 제공하는 의미이다. 하지만 리액티브 프로그래밍 관련 영문 문서에서 가장 많이 볼 수 있는 용어는 Emit이다. 우리말로 '방출하다'의 의미를 가진다. 데이터를 내보내다 정도로 이해하면 된다. 이 시점 이후로는 우리말로 해석하지 않고 emit이라는 단어를 사용하도록 한다. 


Upstream/Downstream

리액티브 스트림즈의 공식 문서에는 나와 있지 않지만  리액티브 프로그래밍과 관련된 문서를 읽다보면 Upstream과 Downstream이라는 용어를 굉장히 자주 접하게 된다.

 

각각 '위로 흐르다', '아래로 흐르다' 정도로 이해할 수 있다. 그렇다면 무엇이 위아래로 흐르는 것일까?

코드 2-5 Upstream/Downstream을 이해하기 위한 샘플코드

Reactor의 구체적인 문법은 아직 설명하지 않는다.

 

먼저 4번라인의 just 메서드를 사용해서 데이터를 생성한 후 emit하게 된다

 

just 메서드는 리액티브 스트림즈의 컴포넌트 중에서 Publisher의 역할을 한다.

 

just 메서드를 호출한 다음 연이어서 filter 메서드를 호출하고 또 이어서 map 메서드를 호출하는 것을 볼 수 있다.

 

이런 방식으로 메서드가 하나로 연결된 것처럼 보이는 것을 메서드 체인이라고 한다.

 

이렇게 메서드 체인 방식으로 호출할 수 있는 이유는 호출하는 각각의 메서드들이 모두 같은 타입의 객체를 반환하기 때문이다. 코드 2-5에서는 각각의 메서드들이 반환하는 (subscribe 메서드 제외) 반환값이 모두 Fulx 타입의 객체이기 때문에 이런 식의 메서드 호출이 가능해지는 것이다.

 

4번라인의 just 메서드 호출을 통해 반환된 Flux 입장에서는 5번 라인의 filter 메서드 호출을 통해 반환된 Flux가 자신보다 더 하위에 있기 때문에 Downstream이 된다.

 

반면에 filter 메서드 호출을 통해 반환된 Flux 입장에서는 just 메서드 호출을 통해 반환된 Flux가 자신보다 더 상위에 있기 때문에 Upstream이 된다.


Sequence

Sequence라는 용어 역시 리액티브 스트림즈 공식 문서에서는 정확한 의미를 찾을 수 없다. 하지만 앞으로 학습하게 될 Reactor의 레퍼런스 문서를 참고하다 보면 Sequence라는 용어를 굉장히 자주 접하기 때문에 Sequence가 어떤 의미인지 알아 둘 필요가 있다.

 

Sequence는 Publisher가 emit하는 데이터의 연속적인 흐름을 정의해 놓은 것 자체를 의미한다. 

 

이 Sequence는 Operator 체인 형태로 정의된다. 코드2-5와 같이 Flux를 통해서 데이터를 생성, emit하고 filter 메서드를 통해서 필터링한 후, map 메서드를 통해 변환하는 과정 자체를 Sequence라고 부른다.

 

만약 리액티브 프로그래밍 관련 레퍼런스 문서에서 Sequence라는 용어를 접하게 된다면 코드 2-5처럼 다양한 Operator로 데이터의 연속적인 흐름을 정의한 것이라고 생각하면 된다.


Operator

Sequence 용어를 설명하면서 Operator라는 용어가 사용됐는데 이에 대한 추가 설명이다.

 

Operator는 우리말로 연산자 정도로 해석할 수 있다. 코드 2-5에서 사용한 just, filter, map 같은 메서드들을 리액티브 프로그래밍에서는 연산자라고 부른다.

 

리액티브 프로그래밍은 Operrator로 시작해서 Operator로 끝난다고 해도 과언이 아닐만큼 Operator가 리액티브 프로그래밍의 핵심이라고 볼 수 있다.


Source

리액티브 스트림즈 또는 리액티브 프로그래밍 관련 문서에서 Source라는 용어를 매우 흔하게 볼 수 있다.

 

대표적으로 Data Source, Source Publisher, Source Flux 등을 들 수 있는데, 대부분 '최초의'라는 의미로 사용된다. 비슷한 의미로 종종 Original이라는 용어도 사용된다. '최초에 가장 먼저 생성된 무언가' 라고 기억하면 되겠다.