🎯 Dart에서 Stream과 Future 활용하여 실시간 데이터 처리하기

Dart 튜토리얼

중급 난이도
튜토리얼 타입
11/02 등록일

Dart에서 Stream과 Future 활용하여 실시간 데이터 처리하기

중급
태그
튜토리얼 가이드 학습 stream future
## 학습 목표
이 튜토리얼을 통해 Dart의 Stream과 Future를 사용해 실시간 데이터 처리 기능을 구현할 수 있는 역량을 갖춥니다.

## 준비사항
- Flutter SDK 설치 및 Android Studio 또는 VS Code 설정
- 기본적인 Dart 문법 이해 (함수, 클래스, 제어문)
- flutter pub add streamz 또는 dart:stream 라이브러리 사용 경험

## 단계별 진행

### 1단계: 기초 설정
Stream과 Future의 기본 개념을 학습하고 간단한 예제를 실행합니다.

### 2단계: 핵심 구현
StreamController를 활용해 실시간 데이터 흐름을 관리하고, FutureBuilder로 비동기 데이터 로딩을 처리합니다.

### 3단계: 고급 기능
Stream과 Future의 조합으로 복잡한 데이터 처리 로직을 구현하고, 에러 처리 및 무한 스트림 처리를 적용합니다.

### 4단계: 완성 및 테스트
실제 앱에 통합해 UI 반응성을 검증하고, 성능 최적화 기법을 적용합니다.

## 다음 학습 단계
- Isolate 활용한 백그라운드 작업 구현
- Riverpod 또는 Bloc으로 상태 관리 확장
- WebSocket을 이용한 실시간 데이터 통신
코드 예제
// 1단계: Stream 기본 사용
import 'dart:async';
void main() {
  final stream = Stream.fromIterable(["A", "B", "C"]);
  stream.listen((data) => print('받은 데이터: $data'));
}

// 2단계: FutureBuilder 활용
import 'package:flutter/material.dart';
import 'dart:async';

class FutureBuilderExample extends StatelessWidget {
  final Future<String> _future = Future.delayed(Duration(seconds: 2), () => "완료");

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('FutureBuilder 예제')),
      body: Center(
        child: FutureBuilder<String>(
          future: _future,
          builder: (context, snapshot) {
            if (snapshot.hasData) return Text(snapshot.data!);
            return CircularProgressIndicator();
          },
        ),
      ),
    );
  }
}

// 3단계: Stream + Future 결합
import 'dart:async';
Stream<String> dataStream() {
  final controller = StreamController<String>();
  Timer(Duration(seconds: 3), () => controller.add("데이터 전송됨"));
  return controller.stream;
}

Future<void> processData() async {
  try {
    final result = await dataStream().first;
    print('처리 결과: $result');
  } catch (e) {
    print('에러 발생: $e');
  }
}

// 4단계: 실시간 UI 통합
import 'package:flutter/material.dart';
class RealtimeDataScreen extends StatefulWidget {
  @override
  _RealtimeDataScreenState createState() => _RealtimeDataScreenState();
}

class _RealtimeDataScreenState extends State<RealtimeDataScreen> {
  final StreamController<String> _controller = StreamController();
  String _latestData = '기본 데이터';

  @override
  void initState() {
    super.initState();
    Timer.periodic(Duration(seconds: 2), (_) => _controller.add(DateTime.now().toString()));
    _controller.stream.listen((data) {
      setState(() => _latestData = data);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('실시간 데이터')), 
      body: Center(child: Text(_latestData)),
    );
  }
}
등록일: 2025년 11월 02일 02:50
언어 정보
언어
Dart
카테고리
Mobile
인기도
#15
학습 팁
코드를 직접 실행해보세요
변수를 바꿔가며 실험해보세요
오류가 나도 포기하지 마세요
다른 예제도 찾아보세요