Dart 3.3의 새로운 기능: 확장 타입, JavaScript 상호 운용, 그 외

Dart 3.3의 새로운 기능: 확장 타입, JavaScript 상호 운용, 그 외

Dart 3.3이 출시됐고, 성능과 크로스 플랫폼 개발에 있어 판도를 바꾸는 릴리스예요! 확장 타입(Extension Types)으로 앱을 강화하고, 성능 최적화와 네이티브 코드와의 상호 작용 방식을 혁신할 준비를 하세요. 그리고 새로워진 JavaScript 상호 운용 모델은 강력한 타입 안전성과 개발자 친화적인 방식으로 웹 플랫폼의 힘을 활용하게 해 줘요. 이 모든 것이 WebAssembly 지원을 위한 길을 닦아요. 아, 그리고 Dart 앱 안에서 Google AI? 물론이죠! 그것이 모두 Dart 3.3에 담겨 있어요. 함께 살펴볼까요!

출처: New in Dart 3.3: Extension Types, JavaScript Interop, and More

본문

확장 타입(Extension Types) 소개

확장 타입은 타입에 대한 제로 비용(zero-cost) 래퍼를 도입해요. 성능에 민감한 코드, 특히 호스트 플랫폼과 상호 운용할 때 이를 최적화하는 데 사용하세요. 확장 타입은 특정 멤버를 가진 커스텀 타입의 편리함을 제공하면서도, 일반적인 래퍼 할당 오버헤드를 제거해요.

extension type Wrapper(int i) {
  void showValue() {
    print('my value is $i');
  }
}

void main() {
  final wrapper = Wrapper(42);
  wrapper.showValue(); // Prints 'my value is 42'
}

위 예시는 Wrapper를 확장 타입으로 정의하지만, 평범한 Dart 타입처럼 사용해요. 인스턴스화하고 함수를 호출할 수 있어요. 핵심 차이점은 Dart가 그것을 일반적인 Dart int로 컴파일한다는 거예요. 확장 타입은 일반적인 래퍼 타입을 할당하는 간접(indirection) 비용 없이, 고유한 멤버를 가진 타입을 만드는 편리함을 허용해요. 그래서 (Dart 2.7부터 사용 가능한)확장 멤버 기능이 기존 타입에 함수와 속성을 추가하게 해 주는 반면, 확장 타입 기능은 같은 일을 하면서도 밑바탕 표현을 숨기는 새 API를 정의하게 해 줘요.

이것은 호스트 플랫폼과의 상호 운용에 특히 유용해요. 래퍼 생성 및 관련 간접 비용 없이 네이티브 타입을 직접 사용하면서도, 깔끔한 프로덕션용 Dart API를 제공할 수 있어요. 확장 타입에 대한 새 문서에서 더 알아보세요.

JavaScript 상호 운용의 진화

Dart 3.3은 JavaScript 라이브러리 및 웹과 상호 운용하기 위한 새 모델을 도입해요. JavaScript와 상호 작용하기 위한 새로운 API 세트, 즉 dart:js_interop 라이브러리로 시작해요. 이제 Dart 개발자는 JavaScript와 상호 작용하기 위한 타입화된 API에 접근할 수 있어요. 이 API는 정적 강제로 두 언어 사이의 경계를 명확하게 정의해요. 이는 컴파일 시간 전에 한 부류의 이슈 전체를 제거해요. JavaScript 코드에 접근하는 새 API 외에도, Dart는 이제 확장 타입을 사용해서 JavaScript 타입을 Dart로 표현하는 새 모델을 포함해요.

import 'dart:js_interop';

/// Represents the `console` browser API.
extension type MyConsole(JSObject _) implements JSObject {
  external void log(JSAny? value);
  external void debug(JSAny? value);
  external void info(JSAny? value);
  external void warn(JSAny? value);
}

확장 타입에 기반한 이 문법은 확장 멤버보다 더 많은 표현력과 건전성(soundness)을 허용해요. 이는 Dart에서 JavaScript API를 활용하는 것을 단순화해요. JS 상호 운용에 대한 새 문서에서 더 알아보세요.

브라우저 라이브러리 개선

버전 1.0 이후로 Dart SDK에는 포괄적인 브라우저 라이브러리 세트가 포함돼 있어요. 여기에는 핵심 dart:html 라이브러리와 SVG, WebGL 등을 위한 라이브러리가 포함돼요.

개선된 JavaScript 상호 운용 모델은 이 라이브러리들을 재상상할 기회를 제공했어요. 앞으로 우리의 브라우저 라이브러리 지원은 package:web에 집중할 거예요. 이것은 버저닝을 단순화하고, 업데이트를 가속화하며, MDN 리소스와 일치해요.

이 일련의 개선들은 다음 큰 일, 즉 Dart를 WebAssembly로 컴파일하는 것으로 이어져요.

지금 시작해서 WebAssembly 미래를 준비하세요

Dart 3.3에서, 패키지 및 애플리케이션 작성자는 WebAssembly로 컴파일된 웹 애플리케이션을 위한 기반을 마련할 수 있어요. Flutter Web에서의 WebAssembly 지원은 여전히 실험적이지만, 팀은 구현을 안정화하기 위해 열심히 노력하고 있어요. WebAssembly를 사용해서 웹에서 Flutter 애플리케이션을 실행하려면, 애플리케이션과 모든 의존성의 모든 코드를 새 JavaScript 상호 운용 메커니즘과 package:web을 사용하도록 마이그레이션해야 해요. 레거시 JavaScript 및 브라우저 라이브러리는 JavaScript 코드로 컴파일하는 데는 변경 없이 계속 지원돼요. 하지만 WebAssembly로 컴파일하려면 마이그레이션이 필요해요.

우리는 작성자들이 Wasm 포함을 시작할 수 있도록 마이그레이션 가이드를 만들었어요. 우리가 안정 릴리스에 포함할 때쯤에는 가장 인기 있는 패키지들이 Wasm을 지원하길 바래요.

한 가지 더: Google AI Dart SDK 소개

Google이 Google AI Dart SDK를 베타로 출시했어요. Dart 또는 Flutter 앱에 생성형 AI 기능을 구축할 수 있어요. 이 앱들은 Google의 최신 AI 모델 제품군인 Gemini를 사용해요. package:google_generative_ai를 살펴보세요. 이 블로그 게시물에서 Google AI Dart SDK로 구축하는 방법을 배우거나, 바로 퀵스타트로 들어가 보세요.