Dart 3.9 발표
Dart 3.9 발표 (Announcing Dart 3.9)
안녕하세요, Dart 개발자 여러분! 최신 안정 버전인 Dart 3.9가 공식 출시됐어요!
이번 릴리스는 여러분의 작업을 더 쉽게 만들고 앱을 더 효율적으로 만드는 데 집중했어요. null 안전성의 핵심 업데이트, Dart CLI의 성능 향상, 그리고 여러분의 AI 어시스턴트를 강화해 줄 Dart와 Flutter MCP Server의 흥미로운 추가까지, 사랑할 구석이 많아요. Dart 3.9의 새로운 모든 것을 살펴볼게요.
본문
언어 업데이트
Null 안전성
Dart 3.9는 타입 승격(type promotion), 도달 가능성(reachability), 확정 할당(definite assignment)을 계산할 때 null 안전성을 가정해요. 이 개선을 활용하려면 패키지의 SDK 제약 하한을 3.9 이상으로 설정하면 돼요 (sdk: ^3.9.0). 이 변경의 결과로 dead_code 경고가 더 많이 발생할 수 있어요.
Soundness 업데이트
getter에서 반환된 값을 아무런 런타임 검사 없이 직접 호출할 수 있게 했던 soundness 이슈를 고쳤어요. getter의 반환 타입이 dynamic이나 Function으로 인스턴스화된 제네릭 타입 인자일 때 발생했던 문제예요. 이 soundness 이슈는 dev 컴파일러인 DDC에서 생겼으며, 다른 도구에는 영향이 없어요.
수정 전에는 다음 getter가 직접 호출과 관련된 문제를 일으킬 수 있었어요. 예를 들어.
// The following getter used to trigger an issue with a direct
// invocation
// The getter
class Container<T> {
T get value => ((int i) => i.isEven) as T;
}
// The direct invocation
Container<dynamic>().value('Invocation with missing runtime checks!');
도구 업데이트
Dart와 Flutter MCP Server
Dart와 Flutter MCP Server는 다리 역할을 해서, Gemini CLI, Cursor, GitHub Copilot 같은 AI 코딩 어시스턴트가 여러분의 Dart 프로젝트 맥락에 더 많이 접근할 수 있게 해줘요. 코드를 제안하는 데 그치는 대신, AI 어시스턴트가 이제 프로젝트를 깊이 이해하고 여러분을 대신해 작업을 수행할 수 있어요.
Dart와 Flutter MCP Server를 쓰면 AI 어시스턴트에게 다음과 같은 일을 시킬 수 있어요.
- 런타임 오류 고치기 (예시 참고).
- 의존성 관리하기 (예시 참고).
- 코드 작성하고 수정하기.
- 그 외 더 많은 것.
Dart와 Flutter MCP Server는 이제 Dart SDK의 stable 채널에서 사용할 수 있어요.
더 빨라진 Dart CLI
예전에는 dart analyze나 dart fix 같은 일부 Dart CLI 명령을 실행하면, 실행 직전에 analysis server용 코드를 컴파일해야 했어요. 이제 이 도구들은 analysis server의 AOT(Ahead-Of-Time) 컴파일 스냅샷을 사용해서, 서버가 미리 빠른 네이티브 머신 코드로 컴파일되어 있어요.
결과는 소스 코드에 따라 다르지만, 샘플 패키지에서 몇 가지 흔한 명령을 실행해 보니 흥미로운 결과를 얻었어요. dart format 같은 짧은 명령 중 일부는 이제 몇 분의 1 시간에 끝나고, dart analyze처럼 오래 걸리던 명령은 거의 50% 빨라졌어요.
pub 클라이언트 업데이트
Git 의존성을 이제 git 태그를 기준으로 버전 해석할 수 있어요.
디스크립터에 tag_pattern을 사용하고 버전 제약이 있을 때, 해석 동안 그 패턴과 일치하는 모든 커밋이 고려돼요. 아래 예시에서는 my_dependency 버전 2.0.1 이상만 고려돼요.
dependencies:
my_dependency:
git:
url: https://github.com/example/my_dependency
tag_pattern: v
version: ^2.0.1
언어 버전 3.9부터, 루트 패키지에서 flutter 제약의 상한이 이제 존중돼요 (dart 제약은 이미 존중되고 있었어요). 좁은 dart나 flutter 제약을 설정하면, 팀이 함께 앱을 개발할 때 모든 개발자가 같은 SDK 버전을 쓰도록 보장하는 데 유용해요 (자세한 내용은 issue #95472 참고).
예를 들어, 아래와 같은 루트 pubspec에서는 Flutter SDK 버전이 3.33.0이 아닌 채로 pub get을 호출하면 실패해요.
name: my_app
environment:
sdk: ^3.9.0
flutter: 3.33.0
Dart 네이티브 컴파일러
대상 OS가 Linux일 때 arm(ARM32)과 riscv64(RV64GC) 대상 아키텍처에 대한 크로스 컴파일 지원을 추가했어요.
Deprecation & breaking changes
32-bit x86 아키텍처
Dart는 32-bit x86 아키텍처를 deprecated 처리했어요. 대부분의 개발자에게는 영향이 없는데, 주로 옛 x86 기반 Android 에뮬레이터와 소수의 물리적 장치에만 영향을 주기 때문이에요. 32-bit ARM과 64-bit x86_64 에뮬레이터와 장치는 여전히 지원돼요. 자세한 기술적 설명은 Dart GitHub deprecation issue에서 볼 수 있어요.
dart build
dart build는 이제 beta 채널에서 프리뷰 상태예요.
dart build -f exe <target>은 이제 dart build cli --target=<target>이에요. 자세한 내용은 dart build cli --help를 확인하세요.
마무리
Dart 3.9를 마무리할게요! 여러분도 이 업데이트에 우리만큼 기대하고 있으면 좋겠어요. 우리는 항상 피드백을 감사히 여기니, 생각을 자유롭게 나눠주세요. 다음에 만날 때까지, 즐거운 코딩 하세요!
더 알아보기
- Dart와 Flutter MCP Server — AI 어시스턴트와 Dart 프로젝트 연결하기
- 자바스크립트 상호운용 — 레거시 API 대체재