본문 바로가기
Dart/Dart Server

[중급] Dart 서버 비동기 프로그래밍 심화/ Stream을 사용한 실시간 데이터 처리 및 이벤트 핸들링

by Maccrey Coding 2024. 9. 11.
728x90
반응형

 

서버 개발에서 실시간 데이터 처리와 이벤트 핸들링은 중요합니다.

Dart에서는 Stream을 사용하여 비동기적으로 데이터를 스트리밍하고, 이벤트를 처리할 수 있습니다.

이 블로그에서는 Stream의 기본 개념과 이를 활용한 실시간 데이터 처리 및 이벤트 핸들링 방법을 초보자도 이해할 수 있도록 쉽게 설명하겠습니다.

1. Stream이란 무엇인가요?

Stream은 데이터를 연속적으로 처리할 수 있는 Dart의 비동기 데이터 스트림입니다.

Stream을 사용하면 데이터가 들어오는 대로 처리할 수 있으며, 여러 개의 데이터를 비동기적으로 수신하고 처리할 수 있습니다.

  • 데이터 이벤트: Stream은 여러 개의 데이터 이벤트를 연속적으로 발생시킬 수 있습니다.
  • 비동기 처리: Stream은 비동기적으로 데이터를 처리할 수 있습니다.

2. Stream의 기본 사용법

2.1 Stream 생성하기

Stream을 생성하는 방법에는 두 가지가 있습니다.

StreamController를 사용하거나 Stream 생성자를 사용하는 방법입니다.

 

2.1.1 StreamController 사용하기

StreamController를 사용하여 Stream을 생성하고 데이터를 추가할 수 있습니다.

import 'dart:async';

void main() {
  // StreamController 생성
  final controller = StreamController<int>();

  // Stream에 데이터 추가
  controller.add(1);
  controller.add(2);
  controller.add(3);

  // 데이터 스트림 구독
  final stream = controller.stream;
  stream.listen((data) {
    print('Received data: $data');
  });

  // Stream 종료
  controller.close();
}
  • StreamController<int>: int 타입의 데이터를 처리하는 StreamController입니다.
  • controller.add(): Stream에 데이터를 추가합니다.
  • controller.stream: Stream을 가져옵니다.
  • stream.listen(): Stream의 데이터 이벤트를 처리합니다.
  • controller.close(): Stream을 종료합니다.

2.1.2 Stream 생성자 사용하기

void main() {
  final stream = Stream<int>.periodic(Duration(seconds: 1), (count) => count);

  stream.listen((data) {
    print('Received data: $data');
  });
}
  • Stream.periodic(): 주기적으로 데이터를 생성하는 Stream을 만듭니다.
  • (count) => count: 주기적으로 생성되는 데이터입니다.

3. 실시간 데이터 처리

Stream을 사용하여 실시간 데이터를 처리하는 방법을 살펴보겠습니다. 예를 들어, 서버에서 클라이언트로 실시간으로 데이터를 전송하는 상황을 고려해 보겠습니다.

3.1 실시간 데이터 스트리밍 예제

import 'dart:async';

void main() {
  final controller = StreamController<int>();

  // 실시간 데이터 생성
  Timer.periodic(Duration(seconds: 1), (timer) {
    final data = DateTime.now().second;
    controller.add(data);
  });

  // 실시간 데이터 스트림 구독
  controller.stream.listen((data) {
    print('Current second: $data');
  });

  // 10초 후에 스트림 종료
  Timer(Duration(seconds: 10), () {
    controller.close();
  });
}
  • Timer.periodic(): 1초마다 현재 초를 생성하여 Stream에 추가합니다.
  • controller.stream.listen(): 데이터를 실시간으로 처리합니다.
  • Timer(Duration(seconds: 10), () { ... }): 10초 후에 Stream을 종료합니다.

4. 이벤트 핸들링

Stream은 이벤트를 처리하는 데도 유용합니다. 예를 들어, 버튼 클릭 이벤트를 처리하는 경우를 생각해 보겠습니다.

4.1 이벤트 핸들링 예제

import 'dart:async';

void main() {
  final controller = StreamController<String>();

  // 이벤트 발생
  controller.add('Button clicked!');
  controller.add('Another event');

  // 이벤트 스트림 구독
  controller.stream.listen((event) {
    print('Event: $event');
  });

  // 스트림 종료
  controller.close();
}
  • controller.add('Button clicked!'): 이벤트를 스트림에 추가합니다.
  • controller.stream.listen(): 이벤트를 처리합니다.

5. Stream의 변형

5.1 BroadcastStream 사용하기

Stream을 여러 구독자가 동시에 구독할 수 있도록 BroadcastStream을 사용할 수 있습니다.

import 'dart:async';

void main() {
  final controller = StreamController<int>.broadcast();

  // 첫 번째 구독자
  controller.stream.listen((data) {
    print('Subscriber 1: $data');
  });

  // 두 번째 구독자
  controller.stream.listen((data) {
    print('Subscriber 2: $data');
  });

  // 데이터 추가
  for (var i = 0; i < 5; i++) {
    controller.add(i);
  }

  // 스트림 종료
  controller.close();
}
  • StreamController<int>.broadcast(): BroadcastStream을 생성하여 여러 구독자가 동시에 스트림을 구독할 수 있습니다.

Dart에서 Stream을 활용하면 실시간 데이터 처리와 이벤트 핸들링을 효율적으로 수행할 수 있습니다.

StreamController를 사용하여 데이터를 스트리밍하고, Stream을 구독하여 데이터를 실시간으로 처리하며, BroadcastStream을 사용하여 여러 구독자에게 데이터를 전송할 수 있습니다.

이 블로그가 Stream을 이해하고 활용하는 데 도움이 되었기를 바랍니다.

 

추가적인 질문이나 도움이 필요하시면 언제든지 말씀해 주세요!

구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.

Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

 

 

728x90
반응형