Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9 Publisher 인터페이스의 규칙 총정리

Publisher는 무제한 개수의 순차적 요소를 제공하며, 구독자(Subscriber)로부터 전달받은 요구(demand)에 따라 이를 발행하는 역할을 담당합니다. Publisher<T> 인터페이스는 T 타입의 요소를 발행하는 기능을 수행하며, 구독자가 자신과 연결될 수 있도록 subscribe() 메서드를 제공합니다.

public interface Publisher<T> {
    public void subscribe(Subscriber<? super T> s);
}

Reactive Streams 명세에서 Publisher를 올바르게 구현하기 위해서는 아래와 같은 규칙들을 반드시 준수해야 합니다. 주요 규칙을 세 가지 범주로 나누어 살펴보겠습니다.

1. 신호(Signal) 전달 규칙

  • Publisher가 특정 Subscriber에게 전송하는 onNext() 메서드의 총 호출 횟수는, 언제나 해당 Subscriber의 Subscription이 요청한 요소의 총 개수보다 작거나 같아야 합니다.
  • Publisher는 요청된 개수보다 적은 횟수의 onNext()만 신호할 수 있으며, 이후 onComplete() 또는 onError() 메서드를 호출하여 Subscription을 종료할 수 있습니다.
  • Subscriber에게 전달되는 onSubscribe(), onNext(), onError(), onComplete() 신호는 반드시 직렬(serially) 방식으로 순차적으로 전송되어야 합니다.

2. 성공 및 실패(종료) 처리 규칙

  • Publisher가 실패하는 경우, 반드시 onError() 메서드를 통해 오류를 알려야 합니다.
  • Publisher가 성공적으로 완료되는 경우, 반드시 onComplete() 메서드를 호출해야 합니다.
  • Publisher가 Subscriber에게 onError() 또는 onComplete()를 신호했다면, 해당 Subscriber의 Subscription은 취소된 것으로 간주합니다.
  • 최종 상태(onError(), onComplete())가 한 번 신호되면, 그 이후에는 어떠한 추가 신호도 발생해서는 안 됩니다.
  • Subscription이 취소된 경우, 해당 Subscriber는 더 이상 어떠한 신호도 받지 않아야 합니다.

3. subscribe() 메서드 동작 규칙

  • Publisher.subscribe() 메서드는 해당 Subscriber에게 다른 어떤 신호보다 먼저 onSubscribe()를 호출해야 하며, 그 외의 경우에는 정상적으로 반환되어야 합니다. 단, 전달된 Subscriber가 null이라면 호출자에게 NullPointerException을 던져야 합니다.
  • Publisher.subscribe() 메서드는 매번 서로 다른 Subscriber와 함께 필요한 만큼 여러 번 호출될 수 있습니다.
  • 하나의 Publisher는 여러 Subscriber를 지원할 수 있으며, 각 Subscription을 유니캐스트(unicast)로 처리할지 멀티캐스트(multicast)로 처리할지 결정합니다.

이러한 규칙들은 Java 9에서 도입된 Flow API의 Reactive Streams 구현체들이 상호 운용 가능하도록 보장하는 핵심 계약입니다. Publisher를 직접 구현하거나 커스텀 리액티브 컴포넌트를 설계할 때 위 규칙들을 반드시 염두에 두어야 합니다.