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

Java 9 Flow API의 핵심 개념과 실행 단계 완벽 정리

Java 9에 도입된 Flow API는 사실상 업계 표준(de facto standard)으로 자리 잡은 Reactive Streams 명세에 대응하는 기능입니다. 이 API는 비동기 발행(publish)과 구독(subscribe)의 핵심을 담아내는 최소한의 인터페이스 집합으로 구성되어 있습니다.

Flow API의 주요 인터페이스

1) Flow.Publisher

Publisher는 구독자(Subscriber)가 소비할 수 있는 아이템을 생성하는 역할을 하며, 단 하나의 메서드 subscribe(Subscriber)만 포함합니다. 그 목적은 이름 그대로 명확합니다.

void subscribe(Flow.Subscriber<? super T> subscriber)

2) Flow.Subscriber

Subscriber는 Publisher(보통 하나)를 구독하여 아이템(onNext(T)), 에러 메시지(onError(Throwable)), 또는 더 이상 받을 아이템이 없다는 신호(onComplete())를 수신합니다. 이러한 이벤트가 발생하기 전에 Publisher는 먼저 onSubscribe(Subscription) 메서드를 호출합니다.

void onSubscribe(Flow.Subscription subscription)
void onNext(T item)
void onError(Throwable throwable)
void onComplete()

3) Flow.Subscription

Subscription은 하나의 Publisher와 하나의 Subscriber 간의 연결을 나타냅니다. 구독자는 이를 통해 더 많은 아이템을 요청하거나(request(long)) 연결을 해제할 수 있습니다(cancel()).

void request(long n)
void cancel()

Flow API의 실행 단계

Flow API가 실제로 동작하는 과정은 다음 순서로 진행됩니다.

  1. 먼저 PublisherSubscriber를 생성합니다.
  2. Publisher::subscribe를 호출하여 Subscriber를 Publisher에 구독시킵니다.
  3. Publisher는 Subscription 객체를 생성하고, 이를 인자로 Subscriber::onSubscribe를 호출합니다. 이를 통해 Subscriber가 해당 Subscription을 저장할 수 있게 됩니다.
  4. 적절한 시점에 Subscriber는 Subscription::request를 호출하여 원하는 수의 아이템을 요청합니다.
  5. Publisher는 Subscriber::onNext를 호출하여 아이템을 전달하기 시작합니다. 이때 요청된 개수를 초과하여 아이템을 발행하지 않습니다.
  6. 처리 과정에서 문제가 발생하면 Publisher는 상황에 따라 Subscriber::onComplete(정상 종료) 또는 Subscriber::onError(오류 발생)를 호출합니다.
  7. Subscriber는 계속해서 추가 아이템을 요청하거나, Subscription::cancel을 호출하여 연결을 종료할 수 있습니다.

이러한 흐름은 배압(backpressure) 메커니즘을 기반으로 하며, 구독자가 처리 가능한 만큼만 데이터를 요청함으로써 비동기 스트림 처리에서의 안정성과 효율성을 보장합니다.