Dart 3.10 출시 소식

Dart 3.10 출시 소식

이번 릴리스는 계속해서 핵심 개발자 경험 개선에 집중해요. 새로운 dot shorthands(.) 기능은 코드를 더 읽기 쉽고 덜 장황하게 쓸 수 있게 도와줘요. 또 강력한 새 analyzer plugin system을 도입해서, IDE에 직접 통합되는 커스텀 정적 분석 규칙을 만들 수 있게 됐어요. 그리고 build hooks가 드디어 안정화(stable)됐다는 소식도 전할게요.

이번 릴리스는 pub.dev와 패키지 관리에도 여러 개선을 가져와요. 프로필의 "Likes" 탭에 새 검색 기능이 생기고, 패키지 작성자는 보안 강화를 위해 수동 게시를 비활성화할 수 있어요. 마지막으로, API 진화를 더 세밀하게 제어할 수 있도록 더 구체적인 deprecation 어노테이션 묶음도 추가했어요.

Dart 3.10의 이 기능들과 다른 개선 사항들에 대해 자세히 알아볼게요.

출처: Announcing Dart 3.10

본문

Language updates

Dot shorthands 🆕

Dart 3.10이 dot shorthands(.을 줄여 쓰는 표기)를 도입했어요. 이 새 기능은 컴파일러가 문맥에서 타입을 추론할 수 있을 때, 중복되는 클래스나 enum 이름을 생략할 수 있게 해줘요.

흔한 시나리오인 로깅을 볼게요. 예전에는 이렇게 썼을 거예요.

enum LogLevel { info, warning, error, debug }

void logMessage(String message, {LogLevel level = LogLevel.info}) {
  // ... implementation
}

// Somewhere else in your app
logMessage('Failed to connect to database', level: LogLevel.error);

level 파라미터가 이미 LogLevel을 기대하므로, enum 이름을 반복하는 건 불필요해요. dot shorthands를 쓰면 이렇게 쓸 수 있어요.

enum LogLevel { info, warning, error, debug }

void logMessage(String message, {LogLevel level = .info}) {
  // ... implementation
}

// Somewhere else in your app
logMessage('Failed to connect to database', level: .error);

이제 코드는 타입(LogLevel)보다 (.error)에 집중해요.

dot shorthands는 enum에만 쓰는 게 아니에요. 생성자, 정적 메서드, 정적 필드에도 쓸 수 있어요. 더 자세히 알고 싶다면 Dot shorthands 가이드를 읽어보세요.

Tools updates

Analyzer plugins 🆕

코드를 리뷰하다가 "이건 analyzer가 잡아줘야 하는 거 아냐?"라고 생각해 본 적 있나요? 이제 그게 가능해요.

Dart 3.10이 Dart analyzer를 위한 강력한 새 플러그인 시스템을 도입했어요. 이제 자신만의 정적 분석 규칙을 작성해서 IDE와 dart analyze·flutter analyze 같은 커맨드라인 도구에 직접 통합할 수 있어요. analyzer plugins으로 이런 일을 할 수 있어요.

  • 팀 코드베이스의 관례를 유지하기 위한 맞춤 린트·경고 등 프로젝트 고유의 규칙을 강제하기.
  • 자신의 도메인 특화된 흔한 함정과 모범 사례를 피하기.
  • 퀵 픽스와 퀵 어시스트를 제공해서 문제를 자동으로 고치거나 새 API로 마이그레이션하는 코드 변경을 자동화하기.

이 새 시스템은 커뮤니티 구동 도구의 풍부한 생태계를 가능하게 하려는 상당한 아키텍처적 노력의 결과예요. 일반적으로 analyzer의 값진 수정과 기능을 기여해 준 커뮤니티 기여자 Felipe Morschel에게 특별히 감사를 전하고 싶어요.

analyzer 플러그인을 쓰려면 analysis_options.yaml 파일에 그냥 추가하면 돼요.

analyzer:
  plugins:
    - some_plugin
    - another_plugin

커스텀 규칙을 직접 만드는 방법은 analyzer 플러그인 작성 문서에서 볼 수 있어요.

Build hooks 🚀

C++나 Rust, Swift 같은 네이티브 코드를 Dart 패키지에 통합하는 일은 종종 CMake나 Gradle처럼 복잡하고 플랫폼 특화된 빌드 파일을 관리해야 했어요. Dart 3.10에서는 이 과정이 훨씬 단순해졌어요.

build hooks(이전의 native assets)가 안정화됐다는 걸 알려드려요. 이 훅을 쓰면 네이티브 코드를 컴파일하거나 네이티브 자산(동적 라이브러리 같은)을 내려받아 Dart 패키지에 바로 번들할 수 있어요. 이 강력한 기능을 이용하면 기존 네이티브 코드나 라이브러리를 패키지 안에서 재사용할 수 있고, 운영체제마다 SPM, Gradle, CMake 같은 별도 빌드 파일을 쓸 필요가 없어져요.

더 자세한 내용은 build hook 작성 문서를 보거나, build hooks에 관한 Flutter Build show 에피소드를 시청해 보세요.

Remove Deprecations lint 🆕

패키지의 새 주 버전(예: 1.0.0이나 0.2.0)을 출시할 때, 이전에 deprecated로 표시한 API를 제거하는 게 모범 사례예요. 그러면 패키지가 깔끔하게 유지되고 개발자들이 낡은 코드를 쓰는 걸 막을 수 있어요. 그런데 출시 과정에서 이 단계를 잊기 쉽죠.

이를 돕기 위해 새 린트인 remove_deprecations_in_breaking_versions를 도입했어요. 이 린트는 패키지 버전이 새 주요 브레이킹(breaking) 버전으로 올라갈 때 남겨진 deprecated 요소를 감지해요. 이런 경우를 표시함으로써 패키지 API가 최신 상태를 유지하고 사용자들이 이해하기 쉽도록 도와줘요.

@Deprecated annotation ⬆️

기존 @Deprecated 어노테이션은 다소 무뚝뚝한 도구였어요. API를 더 이상 권장하지 않는다는 걸 알려주긴 하지만, 뉘앙스를 담을 수는 없었죠. 예를 들어 "이 클래스는 더 이상 확장(extend)하면 안 되지만, 인스턴스화는 여전히 가능하다"는 걸 어떻게 알려줄 수 있을까요?

패키지 작성자가 API 진화를 더 정밀하게 제어할 수 있도록, Dart 3.10은 더 구체적인 deprecation 어노테이션 묶음을 도입했어요.

이제 클래스와 mixin의 특정 사용 사례를 deprecated로 지정할 수 있어요.

추가로, @Deprecated.optional()을 쓰면 선택적 파라미터가 향후 버전에서 필수가 된다는 신호를 보낼 수도 있어요.

Pub updates

좋아하는 패키지 검색·정렬·unlike 지원 🆕

pub.dev에서 좋아하는(favorite) 패키지를 관리하는 게 크게 개선됐어요. 검색 기능이나 프로필의 Likes tab에서, 일반 검색에 쓰는 것과 동일한 익숙한 컨트롤로 좋아하는 패키지를 검색·정렬·필터링할 수 있어요. 좋아요 수, pub points, 인기도(popularity)로 정렬하는 것도 포함돼요. 패키지를 unlike하는 UI도 개선해서, 좋아하는 패키지 목록을 깔끔하고 최신 상태로 유지하기가 그 어느 때보다 쉬워졌어요.

검색 기능으로 좋아하는 패키지를 찾고 싶다면 쿼리에 is:liked-by-me를 추가하면 돼요.

수동 게시 활성화·비활성화 🆕

보안을 강화하고 실수로 게시되는 일을 막기 위해, 이제 패키지의 수동 게시(pub publish)를 비활성화할 수 있어요. 자동화된 게시 워크플로를 쓰거나 더 이상 적극적으로 게시하지 않는 패키지에 딱 맞는 기능이에요.

수동 게시를 비활성화하면 개인 자격 증명으로 패키지를 업데이트하는 걸 막아서, 승인되지 않았거나 실수로 인한 릴리스 위험을 줄여줘요.

이 기능은 패키지의 Admin 탭에서 "Enable manual publishing" 체크박스로 제어할 수 있어요.

Wrap up

Dart 3.10 릴리스는 개발자 생산성, 도구, 패키지 생태계의 전반적인 건강에 초점을 맞춘 많은 개선을 담고 있어요. 코드를 더 간결하게 만드는 dot shorthands 같은 언어 기능부터, analyzer 플러그인과 안정화된 build hooks 같은 강력한 새 도구 기능까지, 이번 릴리스가 더 나은 앱을 만드는 데 힘을 실어 주길 바라요.

이번 릴리스에 기여해 준 많은 엔지니어와 팀, 그리고 Dart를 모두를 위해 더 좋게 만드는 데 힘써 준 커뮤니티 기여자분들께 정말 감사드려요.

Dart 3.10로 무엇을 만들지 기대돼요. 시작하려면 오늘 Dart 3.10 SDK를 받으면 돼요. 모든 새 기능과 업데이트된 기능의 전체 목록은 Dart SDK changelog에서 확인할 수 있어요.

더 알아보기