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의 새로운 모든 것을 살펴볼게요.

출처: Announcing 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 analyzedart 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 제약은 이미 존중되고 있었어요). 좁은 dartflutter 제약을 설정하면, 팀이 함께 앱을 개발할 때 모든 개발자가 같은 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를 마무리할게요! 여러분도 이 업데이트에 우리만큼 기대하고 있으면 좋겠어요. 우리는 항상 피드백을 감사히 여기니, 생각을 자유롭게 나눠주세요. 다음에 만날 때까지, 즐거운 코딩 하세요!

더 알아보기