728x90
반응형
화면이 멈추지 않도록 만드는 것.
Flutter에서 비동기는 단순한 기술이 아니라, 앱의 ‘자연스러움’을 유지하는 철학이다.
이번 글에서는 Future, Stream, Isolate를 중심으로 Flutter의 비동기 처리 방식에 대해 제대로 정리해보자.
⏳ Future — 약속된 결과, 언젠가는 온다
Future는 '미래의 어떤 시점에 결과가 도착할 것'이라는 약속이다.
서버에서 데이터를 가져올 때, 파일을 읽을 때 등 다양한 곳에서 사용된다.
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 2));
return "데이터 수신 완료";
}
이런 Future는 다음처럼 await를 통해 기다릴 수 있다:
void load() async {
String result = await fetchData();
print(result);
}
→ UI는 멈추지 않고, 결과가 오면 이어서 실행된다.
🔁 Stream — 흘러오는 데이터의 흐름
Future가 하나의 결과라면, Stream은 여러 개의 결과를 시간에 따라 전달한다.
예를 들어 센서값, 채팅 메시지, 진행률 등은 Stream으로 관리하면 좋다.
Stream<int> countStream() async* {
for (int i = 1; i <= 5; i++) {
await Future.delayed(Duration(seconds: 1));
yield i;
}
}
StreamBuilder와 함께 쓰면 UI 갱신도 쉬워진다:
StreamBuilder<int>(
stream: countStream(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text('Count: ${snapshot.data}');
}
return CircularProgressIndicator();
},
)
🧵 Isolate — 진짜 멀티스레딩
Flutter는 기본적으로 단일 스레드 UI 프레임워크다.
복잡한 연산을 메인 스레드에서 처리하면 렌더링이 멈춘다.
이럴 땐 Isolate를 사용해 진짜 스레드를 만들어 분리 처리할 수 있다.
Future<int> heavyComputation(int n) async {
return await compute(expensiveFunc, n);
}
int expensiveFunc(int n) {
int result = 0;
for (int i = 0; i < 100000000; i++) {
result += n;
}
return result;
}
`compute()`는 백그라운드에서 함수를 실행하고 결과를 다시 받아온다.
🚀 비동기 Tip 요약
- Future: 단일 응답 (ex. API 호출)
- Stream: 연속된 데이터 (ex. 센서, WebSocket)
- Isolate: CPU 집중 작업 분리 (ex. 이미지 처리)
그리고 항상 기억하자. await
는 기다리지만 UI는 멈추지 않는다.
🧘 마무리하며
Flutter에서의 비동기는 앱이 ‘살아있게’ 만드는 핵심이다.
서버에서 응답이 오든, 센서 데이터가 흐르든, 우리는 그 흐름을 타야 한다.
흐름을 다스리는 자가 진정한 앱을 지배한다.
✍️ 이 글은 터미널 밖으로 나온 개발자의 Flutter 심화과정입니다.
728x90
반응형
'Flutter' 카테고리의 다른 글
Flutter 앱 성능 최적화 — 빌드 최적화와 오버렌더링 잡아내기 (0) | 2025.05.26 |
---|---|
Flutter와 Firebase의 만남 — 고급 연동 패턴과 실전 인증 처리 (0) | 2025.05.26 |
애니메이션을 더 깊게 — AnimatedBuilder부터 Tween까지 완전 정복 (0) | 2025.05.23 |
Flutter에서 Custom Widget 제대로 만들기 — 재사용 가능한 컴포넌트 설계 (0) | 2025.05.23 |
상태 관리 마스터하기 — Provider, Riverpod, Bloc 비교와 선택 가이드 (0) | 2025.05.23 |