관리 메뉴

Bull

[Dart::Stream] broadcast method 본문

Computer Language/Dart

[Dart::Stream] broadcast method

Bull_ 2024. 8. 19. 17:05

Dart의 Stream에서 브로드캐스트(Broadcast) 스트림은 여러 리스너가 동시에 구독할 수 있는 스트림을 의미한다. 일반적인 단일 구독 스트림과 달리, 브로드캐스트 스트림은 여러 리스너가 동일한 스트림에 구독하여 동시에 이벤트를 받을 수 있다.

broadcast stream

  1. 다중 구독(Multiple Listeners): 브로드캐스트 스트림은 여러 개의 리스너가 동시에 구독할 수 있다. 각 리스너는 동일한 이벤트를 동시에 받게 된다.
  2. 동시 전달(Simultaneous Delivery): 이벤트는 스트림에 구독된 모든 리스너에게 동시에 전달된다. 즉, 이벤트가 발생하면 등록된 모든 리스너에게 그 이벤트가 전달된다.
  3. 데이터 캐싱 없음(No Data Caching): 브로드캐스트 스트림은 이벤트를 캐싱하지 않는다. 리스너가 나중에 구독하더라도 과거에 발생한 이벤트를 받을 수 없다. 리스너는 구독을 시작한 시점부터 발생하는 이벤트만 받을 수 있다.
  4. 자동 제어(Event Production Control): 브로드캐스트 스트림은 일반적으로 이벤트 생산자가 구독자의 존재 여부와 상관없이 이벤트를 계속 생성한다. 구독자가 없더라도 이벤트는 생성되고, 구독자가 있으면 그 이벤트가 모든 구독자에게 전달된다.

broadcast stream 생성

브로드캐스트 스트림은 StreamControllerbroadcast() 생성자를 사용하여 만들 수 있다.

broadcast stream 예제

import 'dart:async';

void main() {
  // 1. Broadcast StreamController 생성
  StreamController<int> controller = StreamController<int>.broadcast();

  // 2. 첫 번째 리스너 구독
  controller.stream.listen((data) {
    print('Listener 1 received: $data');
  });

  // 3. 두 번째 리스너 구독
  controller.stream.listen((data) {
    print('Listener 2 received: $data');
  });

  // 4. 스트림에 데이터 추가
  controller.add(1);
  controller.add(2);
  controller.add(3);

  // 5. 스트림 종료
  controller.close();
}

 

# 결과
Listener 1 received: 1
Listener 2 received: 1
Listener 1 received: 2
Listener 2 received: 2
Listener 1 received: 3
Listener 2 received: 3

StreamController<int>.broadcast() : 브로드캐스트 스트림을 생성한다.

 

리스너 등록 : 두 개의 리스너를 스트림에 구독한다. 각각의 리스너는 동일한 스트림에 대해 독립적으로 구독하고 있다.

 

데이터 이벤트 추가 : controller.add(1), controller.add(2), controller.add(3)을 통해 스트림에 데이터를 추가한다. 각 데이터 이벤트는 스트림에 구독된 모든 리스너에게 동시에 전달된다.

 

스트림 종료 : controller.close()를 호출하여 스트림을 종료한다. 이후에는 더 이상 데이터 이벤트를 추가할 수 없으며, 리스너도 더 이상 이벤트를 받지 않는다.

일반 스트림과의 차이점

  • 단일 구독 스트림 (Single-subscription Stream): 단일 구독 스트림은 하나의 리스너만 구독할 수 있으며, 리스너가 스트림을 구독하면 그 스트림은 더 이상 다른 리스너에게 구독될 수 없다. 단일 구독 스트림은 보통 비동기 작업의 결과를 전달하거나, 일회성 데이터 스트림을 처리할 때 사용된다.
  • 브로드캐스트 스트림 (Broadcast Stream): 여러 리스너가 동시에 구독할 수 있으며, 모든 리스너는 동일한 이벤트를 동시에 받을 수 있다. 브로드캐스트 스트림은 실시간 이벤트 전달, 이벤트 브로드캐스팅, 여러 컴포넌트 간의 이벤트 공유 등에 사용된다.

주의사항

Stream을 특별히 브로드캐스트 모드로 생성하지 않으면 기본적으로 단일 구독 스트림(single-subscription stream)으로 작동한다.

단일 구독 스트림은 한 번에 하나의 리스너만 구독할 수 있다. 스트림이 이미 구독되었을 때 다른 리스너가 추가로 구독하려고 하면 오류가 발생한다. 이 스트림은 주로 일회성 이벤트 흐름을 다루기 위해 사용된다. 예를 들어, 파일 읽기, 네트워크 요청 처리, UI 이벤트 처리 등에서 단일 구독 스트림이 사용된다.

 

다음은 이전 코드를 단일 구독 스트림으로 변경한 코드이다.

import 'dart:async';

void main() {
  // 1. Broadcast StreamController 생성
  StreamController<int> controller = StreamController<int>();

  // 2. 첫 번째 리스너 구독
  controller.stream.listen((data) {
    print('Listener 1 received: $data');
  });

  // 3. 두 번째 리스너 구독
  controller.stream.listen((data) {
    print('Listener 2 received: $data');
  });

  // 4. 스트림에 데이터 추가
  controller.add(1);
  controller.add(2);
  controller.add(3);

  // 5. 스트림 종료
  controller.close();
}

Bad state: Stream has already been listened to.

 

라는 에러가 나서 다중 구독을 하려면 반드시 broadcast 메소드를 등록해주어야 한다.