Dart 3.8 발표
Dart 3.8 발표 (Announcing Dart 3.8)
이번 릴리스에는 포매터 업데이트, 컬렉션을 위한 null-aware 요소, 새로운 크로스 플랫폼 개발 기능, pub.dev에서 인기 있는 패키지를 더 잘 찾는 방법, 웹에서의 핫 리로드 지원 등이 담겨 있어요! 그리고 FFigen과 JNIgen 얼리 액세스 프로그램에 관심 있는 개발자들도 계실 거라 기대하고 있어요.
본문
포매터 업데이트
이전 릴리스에서 Dart에는 새 "tall" 스타일을 지원하는 대부분 다시 쓴 포매터가 포함됐어요. Dart 3.8 릴리스는 추가 피드백을 반영하고 버그 리포트를 고치며 다른 개선도 더했어요.
참고로, Dart 3.8 SDK로 업그레이드해도 패키지의 pubspec을 변경해서 최신 언어 버전에 옵트인하기 전에는 포맷팅이 바뀌지 않아요.
Trailing comma와 더 높은 코드
이전 릴리스에서는 trailing comma가 감싼 구조를 강제로 분리했어요. 새 포매터는 구성(construct)을 분리할지 먼저 결정하고, 필요에 따라 trailing comma를 추가하거나 제거해요.
// Before formatter
TabBar(tabs: [Tab(text: 'A'), Tab(text: 'B')], labelColor: Colors.white70);
// After formatter
TabBar(
tabs: [
Tab(text: 'A'),
Tab(text: 'B'),
],
labelColor: Colors.white70,
);
예전 동작이 더 좋다면 configuration flag로 다시 켤 수 있어요.
스타일 변경
출력을 다듬고 개선하는 여러 스타일 변경이 추가됐어요. 몇 가지 예시를 볼게요.
// Previously released formatter (functions)
function(
name:
(param) => another(
argument1,
argument2,
),
);
// Dart 3.8 formatter (functions)
function(
name: (param) => another(
argument1,
argument2,
),
);
// Previously released formatter (variables)
variable =
target.property
.method()
.another();
// Dart 3.8 formatter (variables)
variable = target.property
.method()
.another();
크로스 컴파일
Windows, macOS, Linux 개발 머신에서 네이티브 Linux 바이너리로 컴파일하는 것이 새로 지원돼요. dart compile exe나 dart compile aot-snapshot 명령과 --target-os, --target-arch 플래그로 할 수 있어요.
// cross compilation example for an exe
$ dart compile exe --target-os=linux --target-arch=arm64
// cross compilation example for an aot-snapshot
$ dart compile aot-snapshot --target-os=linux --target-arch=arm64
샘플 사용 사례:
- 성능이 낮은 임베디드 장치보다 빠른 개발자 노트북에서 임베디드 장치(예: Raspberry Pi)용 컴파일을 더 빨리 하는 경우.
- Linux 기반 백엔드를 Linux가 아닌 개발자 머신에서 더 빨리 컴파일하는 경우.
Null-aware 요소
새로운 null-aware 요소를 쓰면, 요소가 null이 아닐 때만 리스트, 집합, 맵 같은 컬렉션에 요소를 추가할 수 있어요. 컬렉션 리터럴에서 요소를 null-aware 요소로 만들려면 요소 앞에 ?를 붙이면 돼요.
null-aware 요소 없이 null 값을 제거하는 리스트:
// Code without null-aware elements
var listWithoutNullAwareElements = [
if (promotableNullableValue != null)
promotableNullableValue,
if (nullable.value != null)
nullable.value!,
if (nullable.value case var value?)
value,
];
null-aware 요소로 null 값을 제거하는 리스트:
// Code with null-aware elements
var listWithNullAwareElements = [
?promotableNullableValue,
?nullable.value,
?nullable.value,
];
Doc imports
이제 doc imports를 지원해요. 이것은 문서 주석에서 외부 요소를 실제로 import하지 않고도 참조할 수 있게 해주는 새로운 주석 기반 문법이에요. 이 태그는 library 지시문 위의 doc comment에서 지정할 수 있어요.
아래 예시에서 [Future]와 [Future.value]는 dart:async 라이브러리에서 import되지만, 오직 문서 주석에서만 사용돼요.
/// @docImport 'dart:async';
library;
/// Doc comments can now reference elements like
/// [Future] and [Future.value] from `dart:async`,
/// even if the library is not imported with an
/// actual import.
class Foo {}
Doc imports는 일반 Dart import와 동일한 URI 스타일을 지원해요. dart: 스킴, package: 스킴, 상대 경로가 여기 포함돼요. 다만 deferred로 만들거나 as, show, hide로 구성할 수는 없어요.
pub.dev의 인기 패키지(Trending packages)
pub.dev 랜딩 페이지에서 "Most Popular Packages" 섹션이 "Trending Packages" 섹션으로 대체됐어요. 이 새 섹션은 최근 채택과 커뮤니티 관심에서 눈에 띄는 성장을 보여준 패키지를 선보여요.
웹에서의 핫 리로드 (experimental)
Dart Development Compiler(DDC)를 사용할 때 웹에서 상태 유지형(stateful) 핫 리로드를 이제 쓸 수 있어요. Dart 코드의 JS 표현을 재설계해서, 실행 중인 앱에서 코드를 교체할 수 있게 됐어요.
아직 이 기능을 다듬는 중이지만, Dart 3.8이 처음으로 시도해 볼 기회를 제공하며 Flutter 앱부터 시작해요. 핫 리로드를 활성화하는 방법은 Flutter 블로그 글에서 확인할 수 있어요.
이건 런타임 타입 표현 바꾸기, 클래스 계층 재설계, 페이지로 코드가 로드되는 방식 업데이트를 포함한 수년간의 작업이었어요. 목표는 VM의 기존 핫 리로드 구현과 완전한 동등성을 달성하는 거예요. 거의 모든 경우에 이 기능은 이미 VM에서 익숙한 것과 구분되지 않아야 해요. 알려진 모든 이슈는 이슈 트래커에서 찾을 수 있어요.
이 기능은 우선 Flutter 앱에서 접근 가능하게 하는 데 집중하지만, 나중에는 build_web_compilers에 핫 리로드를 통합해서 Flutter 아닌 웹 앱에서도 쓸 수 있게 할 계획이에요.
네이티브 직접 상호운용
네이티브 플랫폼 API 통합을 단순화하도록 설계된 코드젠 해법인 FFigen과 JNIgen의 얼리 액세스 프로그램을 시작하게 되어 기뻐요. 이 해법으로 플러그인을 개발하거나 리팩터링하고 싶은 Flutter 플러그인 작성자를 찾고 있어요.
자세한 내용은 Flutter's Path Towards Seamless Interop라는 블로그 글을 읽어보세요. 네이티브 직접 상호운용에 대한 우리의 포부, 이를 위한 로드맵, 얼리 액세스 프로그램이 담겨 있어요.
마무리
Dart 3.8은 개발 경험을 다듬으려는 우리의 지속적인 노력의 증거예요. 똑똑한 포매터부터 크로스 컴파일 지원, null-aware 요소, 웹 핫 리로드, 네이티브 상호운용 얼리 액세스까지 이 새 기능들을 탐구해 보시길 권해요. 여러분의 통찰과 기여는 Dart와 Flutter의 지속적인 성장에 중요하며, 여러분이 만들어 낼 앱을 기대하고 있어요.
오늘 Dart 3.8로 업그레이드하고 즐거운 코딩 하세요!
더 알아보기
- Flutter 블로그 글 — 웹 핫 리로드 활성화 방법
- Flutter's Path Towards Seamless Interop — 네이티브 상호운용에 대한 포부와 로드맵