무엇인가 발생하면 대응하는 방식의 프로그램, 코드
해당 글에서는 Observer 패턴에 대해서는 깊게 다루지 않습니다.
Observer 패턴은 Observable과 Observer를 이용해 Push 방식을 구현하지만 아래 기술할 단점과 더불어 용어가 헤깔릴 수 있으므로 확장된 Observable인 리액티브 스트림(Pub, Sub) 으로 예제를 들겠습니다.
Pull 방식은 미리 정해진 데이터를 끌어다 쓰지만 Push 방식은 소스에서 데이터를 만들어 온다면 해당 소스를 관심있어 하는 모든 Observer에다가 broadcast할 수 있다.
Iterable <----> Publisher Pull <----> Push "줘" "가져가"
- Pull : 소스를 쓰는 쪽에서 "값을 줘" 라며 끌어오는 방식
if(Iterator.hasNext()) { Iterator.next(); } //Pull방식 : 소스를 쓰는 쪽에서 데이터를 요청한다.
- Push : 값이나 이벤트를 가지고 있는 소스에서 "가져가" 라며 밀어넣는 방식
... subscriber.onNext(Iterator.next()); ... publisher.subscribe(subscriber); //Push방식 : 소스에서 데이터가 발생하면 등록된 구독자(subscriber)에게 전달한다.
Duality : 같은 기능이지만 반대 방향(메서드)로 표현된다.
Data method(void) <--> void method(Data) // Pull <--> Push //Pull 방식 : 선언한 타입으로 리턴을 받고 파라미터에 데이터를 받는 쪽 넘겨주진 않는다. //Push 방식 : 리턴타입은 없지만 파라미터에 데이터를 받는 쪽의 정보를 넘겨준다.
예)
Publisher(Source) --> <Event/Data> --> Subcriber
onSubscribe onNext* (onError | onComplete)?
- onSubscribe는 꼭 한 번은 호출되어야 한다.(Sub의 구독 시작)
- onNext는 한 번도 안일어 날 수도, 한 번만 일어날 수도, 계속 일어날 수도 있다.(0 ~ n)
- (onError | onComplete) 둘 중 하나만 일어나거나, 둘 다 일어나지 않을 수 있다.