[TIL] Flutter의 쓰레드 사용법

김영광·2026년 1월 27일

강의를 듣던 중, compose와는 다르게 단일 쓰레드를 사용한다는 말을 듣고 기겁을 했다.
많이 무겁겠다는 생각이 들었지만, Isolate라는 방식을 통해 가볍게 관리한다는 개념을 이해한뒤 괜찮겠다는 생각이 들었다.

🔎 Flutter, 단일 쓰레드

보통 자바나 C++, kotlin 같은 언어를 사용하면 대부분의 프레임워크는 멀티 쓰레딩 환경을 지원한다.
프로세스 내 작업 단위로 쓰레드를 여럿 사용하며, 모든 쓰레드가 Heap 영역을 공유하게 된다.
데이터 전달 속도는 빠르지만 데드락이 발생할 수 있다.
또, 하나의 쓰레드에서 메모리 부하가 오면 전체 쓰레드가 멈출 수 있다.

이번엔 Flutter 만의 단일 쓰레드 방식을 살펴보자.
Dart 언어를 사용하는 Flutter는 각자 독립된 Heap 영역을 가지고 있다.
객체 복사를 통해 데이터를 전달한다(여기서도 vm에서의 state 관리와 비슷한 개념으로 이해할 수 있다)

데이터를 전달할 때 객체가 복사됨에 따라 큰 데이터 전달 시에는 오버헤드가 발생할 수 있다.
하지만, Dart 최신 버전에서는 Uint8List에 대해 메모리 주소를 통째로 넘겨주는 TransferableTypedData 기능을 지원함으로 단점을 보완하고 있다.

🔎 Isolate

Isolate는 영어로 "격리하다"라는 뜻을 가지고 있다.
일반적인 멀티 쓰레딩 환경에서는 메모리가 공유되어 쓰레드가 북적거리지만, Dart의 Isolate는 자신만의 전용 메모리와 이벤트 루프를 가진다.

Isolate는 3가지 속성을 가지고 있다.

  • 독립성 : 한 Isolate에서 오류가 발생해도 다른 Isolate에 영향을 끼치지 않는다.
  • 공유 금지 : 전역변수 조차 공유되지 않는다(별개의 공간으로 구분된다).
  • 통신 : Port를 통한 대화만 가능하다, 데이터 전송 시 복사 후 전달하거나 소유권 자체를 옮겨야 한다

📚 사용 방법

예전에는 RecivePort, SendPort 등 복잔한 설정이 필요했지만, 훨씬 간편해졌다.

1️⃣ Isolate.run()

단순히 무거운 계산을 수행하고 결과를 받아올 때 사용한다.
복잡한 설정 없이 실행할 수 있다.

// 무거운 작업 함수
int heavyTask(int count) {
  int sum = 0;
  for (int i = 0; i < count; i++) {
    sum += i;
  }
  return sum;
}

void main() async {
  // 메인 UI 스레드 멈춤 없이 별도 Isolate에서 실행
  final result = await Isolate.run(() => heavyTask(1000000000));
  print('결과: $result');
}

2️⃣ compute() 메서드

Isolate.run()과 유사하지만, Flutter에서 직접 제공하는 유틸리티이다.
대용량 JSON 파싱처럼 CPU를 많이 쓰는 작업에 사용된다.

강의에서도 튜터님은 coumpte() 메서드를 사용했는데 큰 차이 있는지는 좀 더 학습해봐야겠다.

profile
주니어 개발자

0개의 댓글