트렌드브리프

WWDC26 MetricKit, iOS 27의 Swift 새 API와 상태별 측정

게시 · 약 5분 분량

핵심 요약 애플이 WWDC26에서 공개한 iOS 27용 MetricKit은 MXMetricManager를 대체하는 Swift MetricManager API와 상태별 측정용 StateReporting 프레임워크, Metal 프레임률·메모리 예외 진단을 새로 담았다.

목차
  1. MetricKit이란 무엇인가
  2. iOS 27에서 무엇이 바뀌었나
  3. 상태별 측정은 어떻게 하나
  4. Metal 프레임률과 메모리 예외 진단
  5. 기존 MXMetricManager 코드는 어떻게 옮기나

애플은 2026년 6월 WWDC26의 'Meet the new MetricKit' 세션에서 iOS 27용 MetricKit을 바닥부터 다시 만들었다고 발표했다. 2026년 7월 기준 핵심 변화는 세 가지다. 기존 MXMetricManager를 대체하는 Swift 우선 MetricManager API, 앱의 상태별로 성능을 쪼개 보는 StateReporting 프레임워크, 그리고 Metal 프레임률과 메모리 예외 진단 같은 새 지표다. 이 글은 iOS 앱 개발자를 대상으로 WWDC26에서 공개된 새 API의 구조와 도입 판단 기준을 다룬다. 모든 세부 시그니처를 담은 레퍼런스는 아니다.

MetricKit이란 무엇인가

MetricKit은 앱이 실제 사용자 기기에서 어떻게 동작하는지를 애플이 대신 수집해 개발자에게 넘겨 주는 프레임워크다. Xcode의 Instruments가 내 손안의 개발 기기를 측정한다면, MetricKit은 앱스토어에 배포된 뒤 수많은 사용자 기기에서 벌어진 일을 하루 단위로 모아 보내 준다.

애플 공식 문서에 따르면 MetricKit이 주는 데이터는 크게 두 종류다. 하나는 지표(metric)로, 실행 시간·행(hang, 화면이 잠깐 멈추는 현상)·애니메이션 부드러움·CPU·GPU·디스크·네트워크 사용량이 좋아지는지 나빠지는지 추세를 보여 준다. 다른 하나는 진단(diagnostic)으로, 어떤 코드 경로가 그 문제를 일으켰는지 구체적인 단서를 준다. 지표로 '느려지고 있다'를 알고, 진단으로 '어디서'를 찾는 구조다. 프레임워크의 전체 그림은 애플 공식 MetricKit 문서에서 확인할 수 있다.

iOS 27에서 무엇이 바뀌었나

가장 큰 변화는 진입점이 MXMetricManager에서 MetricManager로 바뀐 것이다. 애플은 WWDC26 'Meet the new MetricKit' 세션에서 이 프레임워크를 현대적인 Swift API로 다시 설계했다고 밝혔다. 예전에는 구독자(subscriber) 객체를 만들어 델리게이트 콜백으로 리포트를 받았지만, 새 MetricManager는 리포트를 비동기 스트림으로 내보낸다.

metricReports와 diagnosticReports를 for await로 순회하면 리포트가 도착할 때마다 이어서 처리할 수 있다. 이 비동기 시퀀스 패턴이 낯설다면 콜백을 순차 코드로 바꾸는 async/await를 먼저 익히면 이해가 빠르다. 리포트가 Codable을 따르므로 JSON으로 바로 직렬화해 서버로 보내기도 쉬워졌다.

import MetricKit

let manager = MetricManager()

Task {
 for await report in manager.metricReports {
  // 하루 단위로 도착하는 성능 지표
  handle(report)
 }
}

상태별 측정은 어떻게 하나

iOS 27부터는 지표를 앱의 상태별로 나눠 볼 수 있다. 애플이 든 예시는 탭이 여러 개인 앱에서 행 시간을 잴 때, 사용자가 탭 1에 있을 때와 탭 2에 있을 때를 구분해 측정하는 것이다. 전체 평균만 보면 '가끔 멈춘다'에서 끝나지만, 상태별로 쪼개면 '지도 탭에서만 멈춘다'까지 좁힐 수 있다.

이를 위해 StateReporting 프레임워크가 새로 나왔다. 애플 설명에 따르면 사용 순서는 세 단계다. 먼저 StateReporting을 임포트하고, 역방향 DNS 형식의 문자열로 상태 영역(도메인)을 정의한 뒤 MetricManager를 만들 때 등록한다. 그다음 앱이 각 상태로 진입할 때마다 전환을 보고한다. 상태에 부가 정보를 붙이고 싶으면 ReportableMetadata 매크로로 구조체를 직접 정의해 함께 넘길 수 있다.

import MetricKit
import StateReporting

let domain = StateReportingDomain("com.example.app.tabs")
let manager = MetricManager(enabledStateReportingDomains: [domain])

let reporter = StateReporter.reporter(for: domain.rawValue)
reporter.reportTransition(to: "지도")

Metal 프레임률과 메모리 예외 진단

새 지표도 늘었다. 애플은 iOS 27의 MetricKit이 Metal 프레임률 지표를 새로 제공한다고 밝혔다. Metal(애플의 저수준 그래픽 API)로 화면을 그리는 게임에서 초당 몇 프레임이 나오는지는 체감 품질을 좌우하는 핵심 수치인데, 이제 실사용 기기의 렌더 성능을 필드에서 받아볼 수 있다.

진단 쪽에서는 메모리 예외 진단이 추가됐다. 앱이나 익스텐션이 메모리 한도를 넘겨 시스템에 강제 종료될 때, 무슨 일이 있었는지 더 구체적인 단서를 준다. 메모리 초과 종료는 일반 크래시 로그에 잘 남지 않아 원인 추적이 까다로웠는데, 이 진단이 그 공백을 메운다. 세션에 따르면 크래시 진단에는 각 종료가 지표에 어떻게 반영됐는지 알려 주는 종료 범주(termination category) 필드도 붙어, 비정상 종료와 개별 진단을 연결하기 쉬워졌다.

기존 MXMetricManager 코드는 어떻게 옮기나

애플은 새 기능을 쓰려면 MXMetricManager에서 MetricManager로 옮기라고 안내한다. 다만 서둘러 전환할 이유는 없다. 기존 구독자 기반 코드는 그대로 동작하고, 상태별 측정·Metal 프레임률·메모리 예외 진단처럼 iOS 27에서 새로 생긴 데이터가 필요해질 때 MetricManager로 갈아타면 된다.

실무 순서는 이렇게 잡는 편이 좋다. 수집한 리포트를 서버로 모으는 파이프라인이 없다면 그것부터 만든다. MetricKit 리포트는 하루에 한 번, 그것도 앱이 다음번에 실행될 때 전달되므로 기기 하나의 데이터만 봐서는 의미가 약하다. 여러 기기의 리포트를 쌓아야 비로소 추세가 보인다. 리포트가 Codable이라 JSON으로 저장하기 좋다. 이렇게 원격에서 성능을 관찰하는 흐름은, 기기 쪽에서 로그를 print에서 os_log로 옮겨 정돈해 두면 진단 단계에서 함께 쓰기 좋다.

결국 iOS 27의 MetricKit은 '얼마나 느린가'를 넘어 '어떤 상태에서 느린가'까지 답하도록 바뀌었다. 상태별 해상도가 필요할 만큼 규모가 있는 앱이라면 새 API가 주는 이점이 분명하다.

더 많은 글 보기 RSS 구독