Flutter에서 비동기 완전 이해하기 — Future, Stream, Isolate 이야기

2025. 5. 26. 14:38·Flutter
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
'Flutter' 카테고리의 다른 글
  • Flutter 앱 성능 최적화 — 빌드 최적화와 오버렌더링 잡아내기
  • Flutter와 Firebase의 만남 — 고급 연동 패턴과 실전 인증 처리
  • 애니메이션을 더 깊게 — AnimatedBuilder부터 Tween까지 완전 정복
  • Flutter에서 Custom Widget 제대로 만들기 — 재사용 가능한 컴포넌트 설계
코드를 걷는 사람
코드를 걷는 사람
devwanderer 님의 블로그 입니다.
  • 코드를 걷는 사람
    터미널 밖으로 나온 개발자
    코드를 걷는 사람
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • Flutter
        • Flutter 게시판 앱 만들기
        • Flutter 뉴스 앱 만들기
        • Flutter 메모 앱 만들기
        • Flutter 캘린더 앱 만들기
        • Flutter 날씨 앱 만들기
      • Next.js
      • Ruby On Rails N
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    뉴스앱
    flutter기초
    감성앱
    RubyOnRails
    UI디자인
    flutter게시판
    메모앱
    정적사이트
    북마크기능
    rails보안
    캘린더앱
    table_calendar
    Nextjs
    코드를걷는사람
    openweather
    flutter상태관리
    개발블로그
    다크모드
    flutterui
    flutter개발
    UIUX
    백엔드개발
    flutter앱개발
    fluttertips
    Firebase
    flutter디자인
    날씨앱
    ActiveRecord
    모바일앱개발
    Flutter
  • 최근 댓글

  • 최근 글

  • 반응형
    250x250
  • hELLO· Designed By정상우.v4.10.3
코드를 걷는 사람
Flutter에서 비동기 완전 이해하기 — Future, Stream, Isolate 이야기
상단으로

티스토리툴바