ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Flutter는 왜 UI를 단 하나의 스레드에서만 그릴까?
    프로그래밍/flutter로 앱만들기 2025. 4. 22. 11:47
    반응형

     

     

    처음 Flutter를 배우다 보면, 이런 생각 한 번쯤 들죠?

    “왜 이렇게 async랑 await가 많아?”
    “이거 다 Dart 문법 때문인가, 아니면 Flutter 구조 때문인가?”

     

    저도 Flutter 처음 시작할 땐 그랬어요.
    근데 알고 보니 이건 Dart 언어 특성도 있지만,
    무엇보다 Flutter의 철학적인 선택이 크더라고요.

     

    오늘은 왜 Flutter는 UI를 단 하나의 메인 스레드에서만 다루게 했는지,
    그리고 그 구조 덕분에 우리가 얼마나 편해지는지를 간단히 정리해볼게요.


    🎯 결론 먼저 말할게요

    Flutter는 개발자에게 예측 가능한 UI를 주기 위해,
    UI는 무조건 하나의 메인 스레드에서만 그리도록 강제합니다.

    이게 끝이에요. 근데 그 이유가 꽤 재밌어요.


    1️⃣ Flutter는 직접 그리는 프레임워크

    Android에서는 View, iOS에서는 UIKit을 사용해서 UI를 만드는데,
    Flutter는 그런 거 안 써요. 대신 Skia라는 그래픽 엔진을 통해
    버튼, 텍스트, 리스트 전부 직접 그립니다.

    그래서 Flutter는 iOS/Android 똑같이 생겼고, 똑같이 동작하죠.
    → "플랫폼 무관하게 동일한 UI 보장"


    2️⃣ UI를 멀티스레드로 하면 생기는 문제들

    혹시 “그럼 UI도 멀티스레드로 하면 빨라지지 않나?” 생각하실 수도 있어요.
    근데 현실은…

    • 스레드 간 데이터 충돌(race condition)
    • 락(lock)이나 세마포어 등 동기화 비용 증가
    • 개발자 입장에서 코드가 복잡하고 불안정해짐

    그래서 Android도 명시하죠:

    Only the original thread that created a view hierarchy can touch its views.
    → 즉, UI는 메인 스레드에서만 다루라는 뜻이에요.


    3️⃣ Flutter의 선택: “UI는 단일 스레드 + 나머진 비동기로”

    그래서 Flutter는 이렇게 했습니다:

    • UI는 무조건 하나의 스레드에서만 그리게 하고
    • 그 대신 시간 오래 걸리는 작업은 전부 async/await로 처리

    예를 들어,

    • Firebase 로그인
    • 파일 업로드
    • 데이터베이스 쿼리
    • 이미지 불러오기

    이런 건 전부 await 붙여서 UI랑 따로 비동기로 처리하는 거예요.


    4️⃣ await가 많은 이유는 Flutter 구조 때문

    다시 말해서…

    구분설명
    Dart 언어 비동기 친화적인 언어. Future, Stream, async/await 지원
    Flutter 프레임워크 싱글 UI 스레드 기반. 모든 I/O는 비동기로 처리하게 설계됨

    → 그래서 플러터 개발하다 보면 await를 안 쓸 수가 없어요.


    5️⃣ 무거운 연산은 어떻게 처리하냐고요? → Isolate 사용

    Flutter는 멀티스레드를 아예 안 쓰는 건 아니고, 필요할 땐 Isolate를 사용해요.

    예: 무거운 연산을 다른 isolate로 보내서 메인 스레드 안 막고 처리할 수 있어요.

     
    Future<String> result = compute(heavyFunction, input);

    ✅ 정리 한 줄 요약

    Flutter는 멀티스레드가 아닌 비동기 처리로 복잡함을 줄이고,
    UI는 단일 스레드로 안전하게 유지합니다.

    개발자는 락(lock)도, 동기화 문제도 걱정할 필요 없이
    "비동기로 요청 날리고, UI는 예쁘게 그리고, 끝"
    이렇게 심플하게 개발할 수 있어요!

     

     

     

     

    728x90
    반응형
Designed by Tistory.