플러터(Flutter) 3.47이 공개됐다. 이번 릴리스의 핵심은 두 가지다. 하나는 오랫동안 코어 SDK에 묶여 있던 머티리얼(Material)과 쿠퍼티노(Cupertino) 디자인 시스템을 독립 패키지로 떼어낸 것이고, 다른 하나는 차세대 렌더링 엔진 임펠러(Impeller)를 데스크톱의 기본 렌더러로 승격한 것이다. 여기에 애플의 가을 업데이트(Xcode 27, iOS 27, macOS 27) 대응과 위젯 프리뷰의 정식 출시가 더해졌다. 실무자 입장에서는 단순한 기능 추가가 아니라 마이그레이션 계획을 세워야 하는 릴리스에 가깝다.
디자인 시스템의 분리, 왜 중요한가
그동안 머티리얼과 쿠퍼티노 위젯은 코어 SDK 안에 직접 포함돼 있었다. 픽셀 단위로 정교한 렌더링을 보장한다는 강점이 있었지만, 디자인 라이브러리의 개발 속도가 SDK 릴리스 주기에 종속되는 구조적 한계도 있었다. 3.47부터는 pub.dev에 1.0으로 정식 등록된 material_ui와 cupertino_ui 패키지를 선택적으로 도입할 수 있다. 코어 SDK에는 여전히 기존 라이브러리가 남아 있지만, 독립 패키지는 분기 단위의 SDK 릴리스와 무관하게 주 단위로 버그 수정과 신규 컴포넌트를 배포할 예정이다. 개발팀은 이를 위해 지난 4월부터 두 라이브러리에 대한 기여를 동결해 두 버전의 내용을 동일하게 맞춰 왔다고 설명한다.
마이그레이션은 제공되는 도구로 임포트 경로를 자동 변환하는 방식이다. package:flutter/material.dart와 cupertino.dart 임포트가 새 독립 패키지로 바뀐다. 다만 pubspec.yaml 갱신 과정에서 알려진 초기 버그가 발생할 수 있는데, 이 경우 flutter pub add로 패키지를 수동 추가한 뒤 dart fix --apply를 다시 실행하면 된다. 의존 패키지 일부가 아직 레거시 임포트를 쓰고 있어도 앱을 MaterialUiCompatibilityBridge로 감싸면 먼저 전환할 수 있다. flutter_localizations도 함께 분리돼, 지역화 델리게이트와 번역 문자열은 이제 각 디자인 패키지 안으로 이동했다.
주의할 점은 일정이다. 코어 SDK 내부의 기존 디자인 라이브러리는 오는 11월 가을 정식 릴리스에서 공식 지원 중단(deprecation) 절차에 들어갈 예정이다. 생태계 패키지를 관리한다면 이 전환을 메이저 릴리스로 취급하라는 권고가 붙었다. 즉 지금은 선택이지만 사실상 이주를 준비해야 하는 시점이다.
데스크톱이 1급 시민이 되다
임펠러가 macOS, 윈도우, 리눅스에서 기본 렌더러가 됐다. 임펠러는 스키아(Skia)를 대체하기 위해 처음부터 새로 설계된 엔진으로, macOS의 메탈(Metal)과 윈도우·리눅스의 불칸(Vulkan) 같은 현대 하드웨어 API를 겨냥한다. 셰이더를 런타임에 동적으로 컴파일하지 않고 빌드 시점에 고정된 집합으로 미리 컴파일하기 때문에, 애니메이션이 처음 재생될 때 발생하던 셰이더 컴파일 잔김(shader compilation jank)이 사라진다. 첫 프레임부터 일관되게 매끄러운 전환을 얻을 수 있다는 뜻이다. 부득이하게 스키아로 되돌려야 한다면 임시 옵트아웃이 가능하지만, 폴백 옵션은 향후 제거될 예정이므로 문제가 있으면 버그를 제출하는 편이 낫다. macOS에서는 와이드 색역(Wide Gamut Color)도 기본 활성화됐다.
데스크톱 관련 개선은 여기서 그치지 않는다. 캐노니컬과의 협업으로 리눅스·윈도우에 팝업 윈도우 API가 실험적으로 추가돼 네이티브 컨텍스트 메뉴나 유틸리티 팔레트를 만들 수 있고, windowHandle을 통해 HWND·NSWindow·GtkWindow 같은 네이티브 핸들에 직접 접근할 수 있다. 윈도우·리눅스에서 플레이버(flavor)가 지원되고, 콘텐츠 크기에 맞춰 자동으로 조정되는 창 API, 그리고 텍스트와 벡터 곡선을 더 선명하게 표현하는 SDF(Signed Distance Function) 렌더링도 데스크톱에 적용됐다.
애플 가을 업데이트와 웹 대응
iOS 27 SDK는 UIKit 기반 앱에 UIScene 라이프사이클을 의무화한다. Xcode 27로 빌드하면서 UIScene을 채택하지 않은 앱은 실행 시점에 구동에 실패한다. 대부분의 앱은 플러터 CLI가 빌드 과정에서 자동 처리하지만, AppDelegate에 커스텀 네이티브 코드가 있거나 레거시 라이프사이클에 의존하는 플러그인을 쓴다면 수동 마이그레이션이 필요하다. 인텔 맥 지원은 축소 단계에 들어가 CLI가 경고를 출력하며, flutter config로 ARM64 전용 빌드를 미리 선택할 수 있다. 스위프트 패키지 매니저(SwiftPM)로의 전환도 상위 100개 iOS 플러그인 중 92개가 완료된 상태이고, 코코아팟(CocoaPods)은 유지보수 모드로 전환돼 이주하지 않은 플러그인은 결국 동작을 멈추게 된다.
웹에서는 웹어셈블리(Wasm)를 기본값으로 만들기 위한 작업이 진행 중이다. release 빌드에 --wasm 플래그를 붙이면 미리 시험해 볼 수 있는데, Wasm은 레거시 dart:html을 지원하지 않으므로 새 JS 인터롭 패키지(package:web)로의 이주가 전제된다. 대형 웹 앱을 위한 Wasm 지연 로딩도 실험적으로 도입됐다. 이 밖에 위젯 프리뷰가 정식(stable) 단계에 올라 앱 전체를 빌드하지 않고도 개별 UI 컴포넌트를 렌더링·검사할 수 있게 됐고, genui 패키지는 0.10.0으로 갱신됐다. 안드로이드 가상 키보드의 수정 키 고착 문제, 윈도우의 한글 조합 시 캐럿 위치 문제 등 접근성·텍스트 선택 관련 세부 개선도 다수 포함됐다. 종합하면 3.47은 성능 향상과 함께 11월 정식 릴리스를 앞둔 대규모 전환의 시작점으로, 디자인 패키지 이주와 애플 SDK 대응을 지금부터 검증해 두는 것이 현명하다.
TTJ 코딩클래스 정규반
월급 외 수입,
코딩으로 만들 수 있습니다
17가지 수익 모델을 직접 실습하고, 1,300만원 상당의 자동화 도구와 소스코드를 받아가세요.
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공