guricode

[Flutter] 비동기 처리하는 여러가지 방법 본문

앱/Flutter&Dart

[Flutter] 비동기 처리하는 여러가지 방법

agentrakugaki 2025. 10. 20. 03:07

1) Future / async-await

자주사용하는 대표적인 비동기 처리

 한 번 완료되는 비동기 작업(HTTP, 파일 I/O)을 처리한다.

Future<T>가 완료되면 콜백 실행. async/await로 동기처럼 작성.

Future<String> fetch() async {
  final res = await http.get(Uri.parse('...')); // await가 다음 줄 일시중단
  return res.body;
}
  • 에러: try/catch로 처리. 동시 실행은 Future.wait([...]).

2) Stream

 여러 값이 시간에 따라 연속 도착(소켓, 이벤트, 센서, 페이지네이션) 할때 사용한다.

구독해 데이터/에러/완료를 받음.

UI 연동: StreamBuilder<T>(stream: ..., builder: ...).

stream.listen()이 Stream의 각 이벤트를 구독하고 처리하는 핵심 메서드다.

정의 Stream의 데이터를 실시간으로 구독(listen) 해서 값, 에러, 완료 상태를 처리
리턴 값 StreamSubscription — 언제든지 pause(), resume(), cancel() 가능
콜백 구조 (data), onError, onDone 세 가지 콜백 사용 가능

 

final stream = Stream.periodic(
  const Duration(seconds: 1),
  (count) => '메시지 $count',
).take(5); // 5개까지만 발행

final subscription = stream.listen(
  (data) => print('받은 데이터: $data'),
  onError: (err) => print('에러: $err'),
  onDone: () => print('스트림 종료'),
);

 

3) Isolate / compute

CPU 무거운 작업을 UI와 분리해 프레임 드랍 방지(이미지 처리, 대용량 파싱)한다.

 메모리 분리. 메시지로 통신. 간단히는 compute 사용.

import 'package:flutter/foundation.dart';

int sumTo(int n) { var s = 0; for (var i=0;i<n;i++) s+=i; return s; }

final result = await compute(sumTo, 100000000); // 별도 Isolate에서 계산

4) 이벤트 루프 

이벤트 루프는 Dart의 비동기 작업을 순서대로 실행하고 관리하는 메커니즘이다.

쉽게 말하면 작업 큐를 돌면서 해야할 일을 하나씩 처리하는 Dart의 실행 엔진이다.

Dart는 단일 스레드로 동작하는데 여러작업이 동시에 진행되는것처럼 보여도 실제로는 이벤트루프가 순서대로 처리한다.

Isolate
 └── Event Loop
       ├── Microtask Queue (우선 처리)
       └── Event Queue     (나중 처리)
  • 마이크로태스크( 우선순위가 높은 비동기 작업 (예: Future.then, scheduleMicrotask) ) > 이벤트 큐 ( 일반적인 이벤트 (예: IO, Timer, UI 이벤트) )순으로 처리.
  • scheduleMicrotask는 바로 다음 tick에, I/O 완료는 이벤트 큐에서.

5) UI 패턴

  • 단발성 비동기: FutureBuilder.
FutureBuilder<User>(
  future: repo.getUser(),
  builder: (_, snap) {
    if (!snap.hasData) return const CircularProgressIndicator();
    return Text(snap.data!.name);
  },
);
  • 상태관리와 결합: Riverpod FutureProvider/AsyncNotifier로 로딩·에러 일원화.

 

  • 한 번만 : Future.
  • 여러 번 흘러오는 비동기처리: Stream.
  • 무거운 CPU 비동기처리: Isolate/compute.
  • 네트워크 대기 많음: Future/Stream이면 충분. Isolate 불필요.