Xcode 27 출시: 요구 사항, 배포 타깃, 그리고 무엇이 깨졌나
Xcode 27은 2026년 9월 14일 빌드 27A266a로 출시되었습니다. 피드에 iOS 27.0 RC 항목이 올라온 지 사흘 뒤의 일이며, iOS 27.0(24A437), macOS 27.0(26A428)을 비롯한 나머지 27 플랫폼과 같은 날 나왔습니다. App Store Connect는 같은 날부터 27.0 GA SDK로 만든 빌드를 받기 시작했고, RC SDK 빌드는 9월 9일부터 받고 있었습니다.15 실행하려면 macOS Tahoe 26.6 이상과 Apple silicon Mac이 필요하고, Swift 6.4와 27 SDK를 탑재하며, iOS 17 이상을 실행하는 기기를 디버깅할 수 있고, 최소 배포 타깃 세 가지가 올라갔습니다. macOS 12, watchOS 9, DriverKit 21입니다.23 기존 프로젝트 입장에서는 확실히 빌드가 실패하는 변경 세 가지(@State 매크로, SE-0508로 인한 소스 호환성 깨짐, -ld64 링커 플래그), 오류를 낼 수 있는 의존성 스캔 규칙 하나, ARCHS_STANDARD의 조용한 변경 하나, 경고 두 가지가 생겼습니다. 스캔 규칙을 제외한 모든 항목을 아래에서 27A266a로 직접 실행해 봤습니다.246
{.answer-block}
TL;DR
- 날짜와 빌드. Apple의 Releases 피드에는 Xcode 27(27A266a)과 27.0 운영체제 여섯 종 모두가 9월 14일 월요일 날짜로 올라와 있습니다. “iOS 27.0 RC (24A437)” 항목은 9월 11일 금요일 날짜인데, App Store Connect가 RC SDK 업로드를 받기 시작한 지 이틀 뒤이며, GA도 같은 빌드 번호를 답니다.15 App Store Connect 자체의 9월 14일 자 릴리스 노트에는 이제 Xcode 27로 빌드한 앱을 스토어와 TestFlight용으로 업로드할 수 있다고 적혀 있습니다.5
- 요구 사항과 하한선이 움직였습니다. Xcode 26.6은 macOS 26.2에서 실행되고 iOS 15 기기를 디버깅할 수 있었습니다. Xcode 27은 macOS 26.6이 필요하고, Apple silicon에서만 실행되며, iOS 17, tvOS 17, watchOS 10 이상만 디버깅할 수 있습니다. 이는 실제 기기뿐 아니라 시뮬레이터에도 해당합니다. 최소 배포 타깃은 macOS 11에서 12로, watchOS 8에서 9로, DriverKit 20에서 21로 올라갔고, iOS, iPadOS, tvOS는 15, visionOS는 1에 머뭅니다.23
- 확실한 실패 세 가지.
@State매크로: Apple이 직접 든 예제, 즉 선언 시점에 값을 가진@State프로퍼티를 다른 저장 프로퍼티보다 먼저 대입하는 이니셜라이저가variable 'self.title' used before being initialized로 실패합니다. 배열 또는 딕셔너리 리터럴 초기값과init접근자를 가진 계산 프로퍼티는 게터가 먼저 오면 컴파일되지 않는데, Apple은 이를 SE-0508로 인한 소스 호환성 깨짐이라고 밝힙니다. 그리고 Xcode 15가 문서화했던-ld64링커 플래그는ld: library 'd64' not found로 링크에 실패합니다.2468 - 경고하거나, 오류를 낼 수 있거나, 아무 말도 하지 않는 변경 네 가지. ld64가 사라졌기 때문에 링커는
-ld_classic을 경고와 함께 무시합니다. 한 번의 의존성 스캔 안에서 Clang 모듈 이름이 중복되면 “may report an error”(오류를 보고할 수 있음)라고 합니다. 27.0으로 설정한 macOS 전용 타깃은 x86_64를 직접 되돌려 넣지 않는 한 arm64로만 빌드되며, 아무 경고도 없습니다. 그리고PreviewProvider에는 “Use #Preview instead.”라는 27.0 사용 중단 메시지가 붙고 각 프리뷰 수정자에는 저마다의 대체 메시지가 붙지만, 배포 타깃이 27.0 미만이면 컴파일러는 그중 어느 것도 보여 주지 않습니다.24 - 9월 15일 기준으로 Apple은 Xcode 27.1을 내놓지 않았습니다. Releases 피드에도 릴리스 노트 색인에도 없고, Apple의 iPhone Duo 개발자 페이지는 27.1 베타를 여전히 “later this month”(이달 말)로 적어 두고 있습니다. Duo 개발자 글에서 설명한 SDK 공백은 그대로입니다.1
9월 14일에 무엇이 나왔습니까?
| 항목 | 빌드 | 피드 날짜 |
|---|---|---|
| Xcode 27 | 27A266a | 2026년 9월 14일 월요일 |
| iOS 27.0 / iPadOS 27.0 | 24A437 | 9월 14일 월요일. 피드의 “iOS 27.0 RC (24A437)” 항목은 9월 11일 금요일 날짜이며, App Store Connect는 9월 9일 수요일부터 RC SDK 업로드를 받았습니다 |
| macOS 27.0 | 26A428 | 9월 14일 월요일 |
| tvOS 27.0 | 24J361 | 9월 14일 월요일 |
| visionOS 27.0 | 24M362 | 9월 14일 월요일 |
| watchOS 27.0 | 24R364 | 9월 14일 월요일 |
| App Store Connect | “You can now upload apps built with Xcode 27 using the SDK for iOS 27.0, iPadOS 27.0, macOS 27.0, tvOS 27.0, visionOS 27.0, and watchOS 27.0 for the App Store, and for internal and external testing through TestFlight.”(27.0 SDK를 사용해 Xcode 27로 빌드한 앱을 App Store용으로, 그리고 TestFlight를 통한 내부 및 외부 테스트용으로 업로드할 수 있게 되었다는 뜻) | 9월 14일 |
릴리스 노트의 Overview는 이렇게 적고 있습니다. “Xcode 27 includes Swift 6.4 and SDKs for iOS 27, iPadOS 27, tvOS 27, watchOS 27, macOS 27, and visionOS 27. Xcode 27 supports on-device debugging in iOS 17 and later, tvOS 17 and later, watchOS 10 and later, and visionOS. Xcode 27 requires a Mac running macOS Tahoe 26.6 or later.”(Xcode 27은 Swift 6.4와 27 SDK들을 포함하고, iOS 17 이상, tvOS 17 이상, watchOS 10 이상, visionOS에서의 기기 디버깅을 지원하며, macOS Tahoe 26.6 이상을 실행하는 Mac이 필요하다는 뜻)2 이 Mac에서 xcodebuild -version은 Xcode 27.0 Build version 27A266a를, swift --version은 Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)를 출력합니다.4
26.6과 비교해 Xcode 27은 무엇을 요구합니까?
빌드 머신을 업그레이드하기 전에 확인해야 할 문서는 Apple의 호환성 표입니다. 두 행을 나란히 놓으면 다음과 같습니다.3
| Xcode 26.6 | Xcode 27 | |
|---|---|---|
| 실행에 필요한 macOS | Tahoe 26.2에서 26.x | Tahoe 26.6 이상, Apple silicon 전용2 |
| SDK | iOS, tvOS, watchOS, visionOS, macOS 26.5; DriverKit 25.5 | iOS, tvOS, watchOS, visionOS, macOS 27; DriverKit 27 |
| 배포 타깃 | iOS 15, tvOS 15, watchOS 8, visionOS 1, macOS 11, DriverKit 20 | iOS 15, tvOS 15, watchOS 9, visionOS 1, macOS 12, DriverKit 21 |
| 디버깅 가능한 기기 | iOS 15, tvOS 15, watchOS 8, visionOS 1 이상 | iOS 17, tvOS 17, watchOS 10, visionOS 1 이상 |
| 시뮬레이터 | iOS 15, tvOS 15, watchOS 8, visionOS 1 이상 | iOS 17, tvOS 17, watchOS 10, visionOS 1 이상 |
| Swift 컴파일러 | 6.3 | 6.4(언어 모드 6, 5, 4.2, 4) |
이 행들 뒤에는 두 가지 결과가 숨어 있습니다. Instruments는 이제 iOS 17, watchOS 10, tvOS 17보다 오래된 기기를 받지 않으므로, 오래된 iPhone으로 꾸린 프로파일링 장비는 앱 코드를 건드리기도 전에 멈춥니다.2 그리고 Apple은 Device Hub의 키보드와 포인터 상호작용 범위를 한 문장으로 못 박습니다. “only supported on the following OS versions and newer: macOS 15.0, iOS 18.0, tvOS 18.0, watchOS 11.0, visionOS 2.0.”(macOS 15.0, iOS 18.0, tvOS 18.0, watchOS 11.0, visionOS 2.0 이상에서만 지원)2
Apple silicon 요구 사항은 Xcode를 실행하는 Mac 쪽에서는 우회할 방법이 없고, 7월에 Intel 글을 읽은 분에게는 이미 지난 이야기입니다. GA 노트는 7월의 문구를 그대로 유지합니다. “Xcode 27 will only install and run on Apple silicon Macs. The macOS 27 SDK supports back deploying Universal (Intel and Apple Silicon) apps to macOS 12 and later. Intel development is still possible with macOS versions that support Rosetta like macOS 27.”(Xcode 27은 Apple silicon Mac에만 설치되고 실행된다. macOS 27 SDK는 Universal 앱을 macOS 12 이상으로 백디플로이하는 것을 지원한다. macOS 27처럼 Rosetta를 지원하는 macOS 버전에서는 Intel 개발이 여전히 가능하다)2 세 번째 문장이 말하는 우회책은 앱을 배포할 Mac을 위한 것이지, 빌드하는 Mac을 위한 것이 아닙니다.
툴체인에서 무엇이 바뀌었습니까?
링커. GA 노트는 한 문장으로 정리합니다. “The ld64 linker has been removed and the -ld_classic option is no longer supported.”(ld64 링커가 제거되었고 -ld_classic 옵션은 더 이상 지원되지 않는다)2 27A266a에서 실제로 보면 이렇습니다. 툴체인의 usr/bin에는 링커 바이너리가 ld 하나뿐이고, 자신을 ld-27037.1, 2026년 8월 25일 빌드라고 보고합니다. 옛 플래그를 넘겨도 링크가 실패하지는 않습니다. hello.c에 int main(void){return 0;} 한 줄만 넣고 clang hello.o -o hello_classic -Xlinker -ld_classic을 실행하면 ld: warning: -ld_classic is no longer supported and will be ignored를 출력하고, 종료 코드 0으로 실행 파일을 써 냅니다. Apple이 Xcode 15에서 문서화했던 다른 표기인 -ld64는 결과가 더 나쁩니다.8 clang hello.c -o hello_ld64 -Wl,-ld64는 ld: library 'd64' not found로 실패하고 종료 코드 1을 반환합니다. 새 링커가 -ld64를 -l d64, 즉 d64라는 이름의 라이브러리 요청으로 읽기 때문입니다.4 따라서 OTHER_LDFLAGS에 -ld_classic을 남겨 둔 프로젝트는 계속 빌드되지만 링크할 때마다 새 경고가 뜨고, 옛 링커에서 얻던 동작은 모두 사라졌습니다. -ld64를 남겨 둔 프로젝트는 링크가 멈추는데, 그 오류는 링커 이름을 한 번도 언급하지 않습니다. ld64 글에서 이 플래그들이 어디서 왔는지 조사하고 두 실행 결과를 모두 기록했습니다.
기본 아키텍처. Intel Deprecation 절이 규칙을 밝힙니다. “Build targets with a min deployment target set to macOS 27.0 or DriverKit 27.0 will not build Universal by default. The ARCHS_STANDARD build setting will no longer include x86_64 when MACOSX_DEPLOYMENT_TARGET or DRIVERKIT_DEPLOYMENT_TARGET >= 27.0.”(최소 배포 타깃을 macOS 27.0 또는 DriverKit 27.0으로 설정한 타깃은 기본적으로 Universal로 빌드되지 않는다. MACOSX_DEPLOYMENT_TARGET 또는 DRIVERKIT_DEPLOYMENT_TARGET이 27.0 이상이면 ARCHS_STANDARD 빌드 설정에 x86_64가 더 이상 포함되지 않는다)2 멀티플랫폼 프로젝트(Yawara, SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx xros xrsimulator)에서 xcodebuild -showBuildSettings -sdk macosx로 재현했습니다. -sdk 인수가 없으면 이 프로젝트는 ARCHS_STANDARD를 아예 해석하지 않는데, 이 특이점은 Intel 글에서 다룹니다. MACOSX_DEPLOYMENT_TARGET = 26.0에서는 ARCHS_STANDARD = arm64 x86_64로, 27.0에서는 ARCHS_STANDARD = arm64로 해석되며, ARCHS_STANDARD_64_BIT는 둘 다 arm64 x86_64를 유지합니다.4 아무 경고도 없습니다. Universal로 배포하면서 타깃을 올린다면 ARCHS에 x86_64를 직접 추가하세요.
C++ 표준 라이브러리. “The minimum supported deployment target on macOS for the C++ standard library has been increased to 11.0,”(C++ 표준 라이브러리가 macOS에서 지원하는 최소 배포 타깃이 11.0으로 올라갔다)라고 하며, 노트는 “Potentially breaking changes” 아래에 동작 변경을 나열합니다. 첫 항목은 multi{map,set}::find가 더 이상 반드시 첫 번째 일치 요소를 반환하지는 않는다는 것입니다.2 새 기능 목록은 깁니다. std::chrono 값의 해싱, zip, std::optional<T&>, std::views::indices(n) 등이 있습니다.2
의존성 스캔, 그리고 이를 실패시킬 수 있는 규칙. Apple은 Swift 의존성 스캐너를 “to avoid redundant setup work and header searches when looking up Clang modules during a single dependency-scan action”(단일 의존성 스캔 작업 중 Clang 모듈을 찾을 때 불필요한 설정 작업과 헤더 검색을 피하기 위해) 최적화했다고 밝히며, 이 속도 개선에는 요구 사항이 따라옵니다. “every Clang module reachable from a single Swift dependency-scan action must have a unique module name. If two module maps visible to the same scan declare a Clang module with the same name, the scan may report an error. Previously, the scanner may have tolerated duplicating names.”(단일 Swift 의존성 스캔 작업에서 도달 가능한 모든 Clang 모듈은 고유한 모듈 이름을 가져야 한다. 같은 스캔에 보이는 두 모듈 맵이 같은 이름의 Clang 모듈을 선언하면 스캔이 오류를 보고할 수 있다. 이전 스캐너는 중복 이름을 허용했을 수 있다)2 Apple은 걸리는 형태 두 가지를 지목합니다. “projects or SDKs that vend the same Clang module name from more than one location on the header search path, and vendored third-party sources that ship a module.modulemap redeclaring an SDK module.”(헤더 검색 경로의 여러 위치에서 같은 Clang 모듈 이름을 제공하는 프로젝트나 SDK, 그리고 SDK 모듈을 다시 선언하는 module.modulemap을 포함한 서드파티 소스)2 링커 제거와 마찬가지로 이 규칙은 배포 타깃이 아니라 툴체인 업그레이드 시점에 발동합니다. ld64 글에서 충돌하는 모듈 맵 두 개를 스캐너에 통과시키고, SDK 모듈을 가리는 번들된 SQLite3 심(shim)을 컴파일하고, 프로젝트 일곱 개를 두 형태 모두에 대해 점검했습니다.
무엇이 컴파일되지 않습니까?
@State 매크로. 이 변경은 Xcode가 아니라 iOS 27 릴리스 노트에 실려 있고, 배포하는 타깃이 아니라 빌드에 쓰는 컴파일러에 따라 작동합니다. “Xcode 27 introduces a new @State implementation that avoids this repeated evaluation. This new behavior back-deploys to iOS 17 aligned OSes. The new @State is implemented with a Swift macro. It is largely source compatible with the property wrapper version, with a few exceptions.”(Xcode 27은 이 반복 평가를 피하는 새 @State 구현을 도입한다. 이 새 동작은 iOS 17 세대 OS까지 백디플로이된다. 새 @State는 Swift 매크로로 구현되었으며, 몇 가지 예외를 제외하면 프로퍼티 래퍼 버전과 대체로 소스 호환된다)6 Apple은 예외 네 가지를 들고 그중 둘에는 코드 목록을 붙였으며, 나머지 둘에는 한두 문장씩만 달았습니다. “In rare situations, the automatic inference of generic arguments of @State is less flexible with the macro implementation. Write the type with more specificity.”(드물게 @State의 제네릭 인수 자동 추론이 매크로 구현에서는 덜 유연하다. 타입을 더 구체적으로 쓰라)와 “Composing @State with other property wrappers or macros is not supported.”(@State를 다른 프로퍼티 래퍼나 매크로와 조합하는 것은 지원되지 않는다)입니다.6 기존 코드를 잡는 것은 코드 목록이 붙은 두 가지입니다. 하나는 선언 시점에 이미 값을 가진 @State 프로퍼티에 대입하는 이니셜라이저입니다. SwiftUI는 그 대입을 늘 버려 왔는데, 이제는 “some such cases no longer compile.”(그런 경우 일부는 더 이상 컴파일되지 않는다)이라고 합니다.6 다른 하나는 모든 저장 멤버가 private일 때 컴파일러가 합성하는 private 멤버와이즈 이니셜라이저입니다. “The state macro disables this synthesized initializer. So the code above no longer compiles.”(state 매크로는 이 합성 이니셜라이저를 비활성화한다. 따라서 위 코드는 더 이상 컴파일되지 않는다)6 27A266a에서 첫 번째 예제는 적힌 그대로 실패하며, page를 대입하는 줄에서 error: variable 'self.title' used before being initialized가 납니다. title이 존재하기 전에 매크로의 세터가 self에 대해 실행되기 때문입니다. self.title = title을 그 위로 옮기면 같은 파일이 컴파일되고, @State 대입은 예전처럼 버려집니다.46 두 번째 예제, 즉 선언 시점 값이 없는 @State를 가진 구조체에 대해 익스텐션에서 self.init(page: page, title: title)을 호출하는 코드는 제 실행에서 수정 없이 컴파일되었고, 매크로 확장을 보면 이를 가능하게 하는 형태가 드러납니다. 매크로는 @storageRestrictions(initializes: _page) init 접근자 뒤에 private var _page: SwiftUICore.State<StickerPage>를 내보내는데, 이 구성 덕분에 멤버와이즈 이니셜라이저가 page:를 받을 수 있습니다.4 이 노트는 확인해야 할 형태를 설명한 것으로 읽고, 각각을 자신의 코드에서 직접 확인하세요. @State 매크로 글은 출시 중인 앱 네 개에서 두 패턴을 세어 봤습니다. 그 글은 이번 GA 테스트 전인 7월에 베타 노트를 바탕으로 썼는데, 거기서 열어 둔 질문도 여기서 닫힙니다. 이니셜라이저 안에서 백킹 스토리지에 직접 대입하는 _page = State(initialValue:)는 선언 시점 값이 있든 없든 27A266a에서 컴파일됩니다.4
SE-0508 깨짐. Swift Compiler의 Known Issues에 이렇게 적혀 있습니다. “A computed property with both an init accessor and an array/dictionary literal initial value will no longer compile if the getter is declared before the init accessor.”(init 접근자와 배열/딕셔너리 리터럴 초기값을 모두 가진 계산 프로퍼티는 게터가 init 접근자보다 먼저 선언되면 더 이상 컴파일되지 않는다) 코드 목록이 이어지고, 그 뒤에 출처가 나옵니다. “This is a known source break from SE-0508.”(이는 SE-0508로 인한 알려진 소스 호환성 깨짐이다) 우회책 전문은 이렇습니다. “Swap the init accessor and the getter such that the init accessor is declared first.”(init 접근자가 먼저 선언되도록 init 접근자와 게터의 순서를 바꾸라)2 SE-0508은 “Array expression trailing closures”(배열 표현식 후행 클로저)로 Swift 6.4에 구현되었으며, 제안서는 정확히 이 경우를 예고합니다. “If the getter is declared before the init accessor, we will now attempt to parse as a trailing closure,”(게터가 init 접근자보다 먼저 선언되면 이제 후행 클로저로 파싱을 시도한다)에 더해 “init accessors are however considered for disambiguation, so swapping the accessors is sufficient to make this valid regardless of initial value used,”(다만 init 접근자는 모호성 해소에 고려되므로, 접근자 순서를 바꾸면 초기값과 무관하게 유효해진다)라고 하고, 이 경우가 “does not appear in the source compatibility suite, or for internal Swift projects at Apple.”(소스 호환성 스위트에도, Apple 내부 Swift 프로젝트에도 나타나지 않는다)이라고 덧붙입니다.7 아홉 줄짜리 구조체로 재현됩니다. 게터를 먼저 두면 swiftc가 접근자 줄에서 error: initializers may only be declared within a type으로 실패하고, @storageRestrictions(initializes:) init 접근자를 get 위로 옮기면 같은 파일이 컴파일됩니다.4
struct Container {
private var storage: [Int] = []
var items: [Int] = [] {
@storageRestrictions(initializes: storage)
init(initialValue) { storage = initialValue } // get보다 먼저 와야 함
get { storage }
set { storage = newValue }
}
}
PreviewProvider. Previews 절에는 사용 중단 항목이 하나 있습니다. “PreviewProvider and its family of preview modifiers.”(PreviewProvider와 그에 딸린 프리뷰 수정자들)2 SDK에도 반영되어 있는데, 프로토콜에는 메시지 하나가, 각 수정자에는 서로 다른 메시지가 붙어 있습니다. iOS 27 SDK의 SwiftUI 인터페이스에서 public protocol PreviewProvider는 @available(anyAppleOS, deprecated: 27.0, message: "Use #Preview instead.") 아래에 있고, previewLayout은 “Use #Preview(traits: .sizeThatFitsLayout) or .fixedLayout(width:height:) instead.”, previewDisplayName은 “Use #Preview(“name”) instead.”, previewInterfaceOrientation은 “Use #Preview(traits: .landscapeLeft) or other orientation traits instead.”, previewDevice는 “Use the device picker in Xcode’s canvas.”(Xcode 캔버스의 기기 선택기를 사용하라), 그리고 previewContext는 PreviewContext 및 PreviewContextKey 프로토콜과 함께 “Use #Preview with a Widget timeline provider or entries instead.”(대신 Widget 타임라인 프로바이더 또는 엔트리를 지정한 #Preview를 사용하라)라고 말합니다.4 이 메시지를 보게 될지는 두 가지 사실이 결정합니다. 컴파일러는 사용 중단 버전을 배포 타깃과 비교하므로, 수정자들은 최소 버전이 27.0인 타깃에서만 경고합니다. previewLayout, previewDisplayName, previewDevice를 사용하는 파일은 -target arm64-apple-ios27.0-simulator에서 경고 세 개를 냈고 17.0과 26.0에서는 하나도 내지 않았습니다. 그리고 PreviewProvider 자체는 다른 이유로 절대 경고하지 않습니다. SDK는 이를 anyAppleOS 사용 중단 바로 위에 @available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)를 붙여 선언하는데, 제 검증에서 이 쌍을 가진 프로토콜은 27.0 타깃에서 준수(conformance)에 대해서도, 매개변수 타입으로 쓰는 경우에 대해서도 경고를 내지 않았습니다. 반면 같은 프로토콜을 @available(iOS, deprecated: 27.0)만으로, 또는 anyAppleOS 형태만으로 사용 중단 처리하면 둘 다 경고했습니다. 수정자들은 자기 선언에 anyAppleOS 사용 중단만 달고 있고(이들을 담은 extension SwiftUICore.View가 introduced 속성을 달고 있는데, 그렇게 상속된 형태는 경고를 억제하지 않습니다), 그래서 수정자는 경고하고 프로토콜은 경고하지 않는 것입니다.4 실제 출시 중인 어떤 배포 타깃에서도 빌드 로그는 어느 쪽이든 조용하므로, PreviewProvider와 수정자들을 검색해 #Preview로 옮기세요. 캔버스는 이제 새 #Preview(arguments:) 문법을 통해 인수별로 그리드로 렌더링합니다.24
System의 새 stat(). System 라이브러리는 이제 stat, lstat, fstat, fstatat에 대한 Swift API를 제공하며, Stat 타입과 FilePath.stat() 인스턴스 메서드가 있습니다.2 노트는 한정자 없는 stat()을 호출하는 익스텐션이 새 메서드와 충돌하던 문제를 해결됨으로 표시합니다. 그 충돌이 살아 있던 동안 Darwin. 한정자를 추가했다면 그대로 두어도 됩니다.2
Address Sanitizer는 반대 방향입니다. “Address Sanitizer might fail to launch on iOS 27.0, tvOS 27.0, watchOS 27.0, and visionOS 27.0 when building with Xcode 26.4 or older.”(Xcode 26.4 이하로 빌드하면 iOS 27.0, tvOS 27.0, watchOS 27.0, visionOS 27.0에서 Address Sanitizer가 실행에 실패할 수 있다) 우회책은 Xcode 26.5 이상인데, CI 머신에는 옛 Xcode를 유지하면서 기기만 27.0으로 업데이트하는 팀에는 중요한 문제입니다.2
IDE와 도구에서는 무엇이 바뀌었습니까?
- Interface Builder가 시뮬레이터 없이 빌드합니다. 새 컴파일 모드
toolchain은 “for UIKit (Cocoa Touch) based documents. Enabled by default,toolchainallows compiling IB documents without the need to download a simulator, which is especially useful for build servers.”(UIKit(Cocoa Touch) 기반 문서용이며, 기본으로 활성화된toolchain은 시뮬레이터를 내려받지 않고도 IB 문서를 컴파일할 수 있어 빌드 서버에 특히 유용하다)라고 설명됩니다.2 - 시뮬레이터가 더 빨리 부팅되고, 재부팅도 됩니다. “The simulator runtimes now contain a pre-built dyld cache. This will make first launch of a simulator much faster,”(시뮬레이터 런타임에 미리 빌드된 dyld 캐시가 포함되어 시뮬레이터의 첫 실행이 훨씬 빨라진다)라고 하며,
simctl에reboot명령이 추가되었습니다.2 알려진 문제 하나가 남아 있는데, Apple의 표현으로는 이렇습니다. “Some simulator runtimes are not completely deleted when removed, re-appearing after a reboot.”(일부 시뮬레이터 런타임은 제거해도 완전히 삭제되지 않고 재부팅 후 다시 나타난다)2 - devicectl JSON은 버전 5입니다.
xcrun devicectl --version은 642.16을 보고하고,list devices --json-output은"jsonVersion": 5를 씁니다. Apple은hardwareProperties,deviceProperties,connectionProperties필드를 사용 중단하고properties딕셔너리로 대체했으며, 이 필드들이 아직 들어 있는 결과에는_deprecationNotice가 붙습니다.24 - StoreKit 테스트. StoreKit 구성 UI에서 오퍼 코드를 정의할 수 있고, 로컬 테스트용 구독 번들을 구성할 수 있으며, Transaction Manager에서 기기 없이 오퍼 코드가 적용된 구매를 시험할 수 있습니다.2
- Organizer. Insights Overview가 “summarizes high-impact performance regressions”(영향이 큰 성능 저하를 요약한다)라고 하며, Hitches 지표가 Scrolling 지표를 대체합니다.2
- 코딩 어시스턴트. 모델 목록에 Google Gemini가 합류했고, “Planning with agents is now first class in Xcode,”(에이전트와 함께하는 플래닝이 이제 Xcode의 일급 기능이다)라고 하며, 플랜은 에이전트가 진행하기 전에 승인하는 편집 가능한 Markdown 산출물입니다. 코딩 에이전트 글에서 베타 시점의 워크플로를 다뤘고, GA 노트에는 바로 그 산출물을 위한 Markdown 편집기가 실려 있습니다.2
- 현지화. 에이전트가 String Catalog 항목을 번역할 수 있고, 현지화 내보내기가 이제 헤더 파일에서
NSLocalizedString과 유사한 매크로를 추출합니다.2 - Icon Composer. 노트는 이를 Icon Composer 2.0이라 부르며 “a new sharper rendering mode for upcoming 2027 operating systems”(다가오는 2027년 운영체제를 위한 더 선명한 새 렌더링 모드)라고 설명합니다. 27A266a에 들어 있는 번들은 버전 27.0을 보고합니다.24
- 테스트. 테스트 플랜에서 UI 테스트 중 대상 앱이 충돌했을 때 Xcode가 어떻게 처리할지를 끔부터 치명적 실패까지 설정할 수 있고,
swift test에--maximum-repetitions와--repeat-until [pass|fail], 그리고 마지막에 나오는 실패 요약이 추가되었습니다.2 - 디버깅. 브리징 헤더가 있을 때 LLDB는 “can now directly import explicitly built Swift modules and PCH from DerivedData,”(이제 DerivedData에서 명시적으로 빌드된 Swift 모듈과 PCH를 직접 가져올 수 있다)라고 하며,
language swift task tree명령이 Swift 동시성 태스크를 나열합니다.2
이번 주에 제가 할 일
- CI를 건드리기 전에 호환성 행을 읽습니다. 빌드 Mac에는 macOS 26.6, Apple silicon 전용, 가장 오래된 테스트 기기는 iOS 17, 그리고 macOS 12, watchOS 9, DriverKit 21 중 제품에 해당하는 것을 확인합니다.23
-ld_classic과-ld64를 grep으로 찾아 둘 다 제거합니다. 링커는 첫 번째를 링크할 때마다 경고와 함께 무시하고, 두 번째에서는 바로 실패합니다. 빌드 설정을 열어 본 김에, SDK 모듈을 다시 선언하는 직접 작성한module.modulemap파일도 찾아봅니다. Apple이 고유 모듈 이름 규칙에서 지목한 바로 그 형태입니다.24- macOS나 DriverKit 타깃을 27.0으로 설정했고 Intel용으로도 배포한다면
ARCHS를 명시적으로 설정합니다.ARCHS_STANDARD만으로는 arm64가 되는데, macOS에 대해서는 제가 재현했고 Apple은 둘 다에 대해 명시합니다.24 PreviewProvider,previewLayout,previewDisplayName,previewDevice를 검색하고 각 주석의 메시지를 따릅니다. 프로토콜은#Preview로,previewLayout은#Preview(traits: .sizeThatFitsLayout)또는.fixedLayout(width:height:)로,previewDisplayName은#Preview("name")로,previewDevice는 캔버스의 기기 선택기로 옮깁니다. 수정자들은 27.0 배포 타깃에서만 경고하고PreviewProvider준수는 어떤 타깃에서도 경고하지 않으므로, 출시 중인 타깃의 빌드 로그는 조용한 채로 남습니다.4- Xcode 27로 한 번 빌드하고 진단 두 가지를 확인합니다. 하나는
variable 'self.title' used before being initialized로, 선언 시점 값을 이미 가진@State프로퍼티를 다른 저장 프로퍼티보다 먼저 대입하는 이니셜라이저에서 나며, @State 매크로 글이 차근차근 설명합니다. 다른 하나는initializers may only be declared within a type으로, 배열 또는 딕셔너리 리터럴 초기값과 init 접근자를 가진 프로퍼티에서 나며, 접근자를 게터 위로 옮기면 됩니다.246 - App Store Connect가 받아 주는 지금, 27 SDK로 TestFlight 빌드를 업로드합니다. 그리고 런치 스크린 규칙과 UIKit 씬 의무화를 염두에 두세요. 둘 다 앱이 27에 링크되는 순간부터 적용됩니다.56
자주 묻는 질문
Xcode 27은 언제 나왔습니까?
2026년 9월 14일 월요일, 빌드 27A266a로, iOS 27.0, iPadOS 27.0, macOS 27.0, tvOS 27.0, visionOS 27.0, watchOS 27.0과 같은 날 나왔습니다. 피드는 iOS 27.0 RC(24A437) 항목에 9월 11일 날짜를 달았는데, App Store Connect가 RC SDK 빌드를 받기 시작한 지 이틀 뒤입니다.15
Xcode 27은 어떤 macOS가 필요합니까?
Apple silicon Mac의 macOS Tahoe 26.6 이상입니다. Intel Mac에는 설치되지도 실행되지도 않습니다. 같은 날 출시된 macOS 27.0에서도 실행됩니다.23
Xcode 27의 최소 배포 타깃은 무엇입니까?
iOS 15, iPadOS 15, tvOS 15, watchOS 9, visionOS 1, macOS 12, DriverKit 21입니다. Xcode 26.6과 비교하면 watchOS는 8에서, macOS는 11에서, DriverKit은 20에서 올라갔습니다.3
Xcode 27로 여전히 Universal Mac 앱을 빌드할 수 있습니까?
예, macOS 12까지 거슬러 빌드할 수 있지만, 타깃의 MACOSX_DEPLOYMENT_TARGET이 27.0이 되면 기본으로는 그렇지 않습니다. 그때 ARCHS_STANDARD는 arm64로만 해석되므로 ARCHS에 x86_64를 직접 추가해야 합니다.24
Xcode 27.1은 나왔습니까?
2026년 9월 15일 기준으로 아직입니다. Apple의 Releases 피드와 Xcode 릴리스 노트 색인에는 Xcode 27만 있고, Apple의 iPhone Duo 개발자 페이지는 Xcode 27.1 베타를 여전히 “Coming later this month”(이달 말 출시 예정)로 적어 두고 있습니다. iPhone Duo SDK는 이번 릴리스에 포함되지 않습니다.1
Xcode 27 릴리스 노트는 어디에 있습니까?
Apple 개발자 문서 사이트의 Xcode Release Notes 아래에 이 릴리스용 페이지 하나로 있습니다. 여기서 인용한 절은 Overview, Linking, Intel Deprecation, Previews, Swift Compiler, Address Sanitizer, Instruments, Device Hub, devicectl, Simulator, Interface Builder, C++ Standard Library, Organizer, Coding Intelligence, Source Editor, Icon Composer, StoreKit Testing in Xcode, Localization, Testing, Swift Package Manager, Debugging, System입니다.2 @State 매크로 변경은 대신 iOS 및 iPadOS 27 릴리스 노트의 SwiftUI 절에 있습니다.6
출처
-
Apple, Releases, 2026년 9월 15일에 가져온 RSS 피드. “Xcode 27 (27A266a)”, “iOS 27.0 (24A437)”, “iPadOS 27.0 (24A437)”, “macOS 27.0 (26A428)”, “tvOS 27.0 (24J361)”, “visionOS 27.0 (24M362)”, “watchOS 27.0 (24R364)”, “App Store Connect Update”는 모두 2026년 9월 14일 월요일 날짜이고, “iOS 27.0 RC (24A437)”는 2026년 9월 11일 금요일 날짜입니다. Xcode Release Notes 색인에는 27 항목이 “Xcode 27 Release Notes” 하나뿐이며, 두 곳 모두 27.1 항목은 없습니다. Apple Developer, Get Ready for iPhone Duo, 2026년 9월 15일 확인: “Xcode 27.1 beta. Get the latest SDKs to build, run, and test your app for iPhone Duo. Coming later this month”(Xcode 27.1 베타. iPhone Duo용 앱을 빌드, 실행, 테스트할 최신 SDK. 이달 말 출시 예정). ↩↩↩↩↩
-
Apple, Xcode 27 Release Notes, GA 출시 후인 2026년 9월 15일 확인. 인용한 절: Overview; Linking, Deprecations(“The ld64 linker has been removed and the
-ld_classicoption is no longer supported.” 165165518); Intel Deprecation, New Features(ARCHS_STANDARD, 161837535) 및 Deprecations(Apple silicon 전용, 전문 인용, 162138432); Previews, Deprecations(“PreviewProviderand its family of preview modifiers.” 144168701) 및 New Features(#Preview(arguments:), 167544057); Swift Compiler, New Features(의존성 스캐너와 고유 모듈 이름 요구 사항, 발췌, 136303612) 및 Known Issues(SE-0508, 180969028; 우회책 문장은 전문 인용); System, New Features 및 Resolved Issues(177911316); Address Sanitizer, Known Issues(178072780); Instruments, Deprecations(166097304); Device Hub, Deprecations(160482487); devicectl, New Features(170812159) 및 Deprecations(183772705); Simulator, New Features(179846743, 172303413) 및 Known Issues(141290052); Interface Builder, New Features; C++ Standard Library, New Features 및 Deprecations; Organizer; Coding Intelligence(171990272, 172857081); Source Editor, New Features(Markdown 편집기, 175022151); Localization; Icon Composer; StoreKit Testing in Xcode; Testing; Swift Package Manager, New Features(--maximum-repetitions, 177561078; 실패 요약, 168311253); Debugging. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple, Xcode support: minimum requirements and supported SDKs, 2026년 9월 15일 확인. Xcode 27 행: macOS Tahoe 26.6 이상; SDK는 iOS 27, tvOS 27, watchOS 27, visionOS 27, macOS 27, DriverKit 27; 배포 타깃은 iOS 15에서 27, iPadOS 15에서 27, tvOS 15에서 27, watchOS 9에서 27, visionOS 1에서 27, macOS 12에서 27, DriverKit 21에서 27; 기기 지원은 iOS 17, tvOS 17, watchOS 10, visionOS 1 이상; 시뮬레이터는 iOS 17, tvOS 17, watchOS 10, visionOS 1 이상; Swift 6.4 컴파일러, 언어 모드 6, 5, 4.2, 4. Xcode 26.6 행: macOS Tahoe 26.2에서 26.x; SDK는 26.5, DriverKit 25.5; 배포 타깃은 iOS 15, tvOS 15, watchOS 8, visionOS 1, macOS 11, DriverKit 20; 기기와 시뮬레이터 지원은 iOS 15, tvOS 15, watchOS 8, visionOS 1부터; Swift 6.3. ↩↩↩↩↩↩
-
저자 재현.
DEVELOPER_DIR을 가리키게 한 Xcode 27.0(27A266a), macOS 26.6.2(25G83), 2026년 9월 15일.xcodebuild -version: “Xcode 27.0 Build version 27A266a”;swift --version: “Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)”; 툴체인의usr/bin에는 링커가ld하나뿐이고,ld -v는 “PROJECT:ld-27037.1”과 “Aug 25 2026” 빌드를 출력합니다.int main(void){return 0;}가 담긴hello.c로clang hello.o -o hello_classic -Xlinker -ld_classic은 “ld: warning: -ld_classic is no longer supported and will be ignored”를 출력하고 종료 코드 0으로 끝났으며,clang hello.c -o hello_ld64 -Wl,-ld64는 “ld: library ‘d64’ not found”와 “clang: error: linker command failed with exit code 1 (use -v to see invocation)”를 출력하고 출력 파일 없이 종료 코드 1로 끝났습니다. 멀티플랫폼 프로젝트 Yawara.xcodeproj(SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx xros xrsimulator,-sdk인수 없이는ARCHS_STANDARD줄을 출력하지 않음)에 대한xcodebuild -showBuildSettings -sdk macosx:MACOSX_DEPLOYMENT_TARGET = 26.0에서ARCHS_STANDARD = arm64 x86_64, 27.0에서ARCHS_STANDARD = arm64, 둘 다에서ARCHS_STANDARD_64_BIT = arm64 x86_64.var items: [Int] = []와@storageRestrictions(initializes: storage) init(initialValue)접근자를 가진 아홉 줄짜리Container구조체: 게터가 먼저면init줄에서 “error: initializers may only be declared within a type”으로 실패하고, 접근자가 먼저면 종료 코드 0으로 컴파일됩니다. iPhoneOS 27.0 SDK의SwiftUI.swiftmodule/arm64e-apple-ios.swiftinterface:@available(anyAppleOS, deprecated: 27.0, message: "Use #Preview instead.")가 14971행(public protocol PreviewProvider), 14978행(그 익스텐션), 14991행(PreviewPlatform)에; “Use #Preview with a Widget timeline provider or entries instead.”가 15023행(PreviewContextKey), 15029행(PreviewContext), 15069행(previewContext)에; “Use the device picker in Xcode’s canvas.”가 15053행(previewDevice)에; “Use #Preview(traits: .sizeThatFitsLayout) or .fixedLayout(width:height:) instead.”가 15058행(previewLayout)에; “Use #Preview("name") instead.”가 15063행(previewDisplayName)에; “Use #Preview(traits: .landscapeLeft) or other orientation traits instead.”가 15075행(previewInterfaceOrientation)에 있습니다. 순수한PreviewProvider준수를swiftc -c로 컴파일하면-target arm64-apple-ios27.0-simulator,ios26.0,ios17.0어디서도 경고가 없었습니다.PreviewProvider안에서previewLayout(.sizeThatFits),previewDisplayName("Card"),previewDevice(PreviewDevice(rawValue: "iPhone 18 Pro"))를 적용한 파일은ios27.0에서[#DeprecatedDeclaration]경고 세 개(“‘previewLayout’ was deprecated in any Apple OS 27.0: Use #Preview(traits: .sizeThatFitsLayout) or .fixedLayout(width:height:) instead.” 및 그에 대응하는previewDisplayName과previewDevice메시지)를 냈고ios26.0과ios17.0에서는 없었습니다. 프로토콜 네 개에 각각 준수 구조체를 두고 한 함수 시그니처에any P매개변수를 둔 검증을-target arm64-apple-ios27.0-simulator로 컴파일했습니다.@available(iOS, deprecated: 27.0)만,@available(anyAppleOS, deprecated: 27.0)만,@available(iOS, deprecated: 27.0)위에@available(iOS 13.0, *)를 둔 것은 각각 준수 줄과any P매개변수 타입에서 경고(“‘P1’ was deprecated in iOS 27.0”, “‘P2’ was deprecated in any Apple OS 27.0”, “‘P4’ was deprecated in iOS 27.0”)를 냈지만, SDK의 쌍인@available(anyAppleOS, deprecated: 27.0)위의@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)는 어느 쪽에도 경고를 내지 않았습니다. 그 존재 타입을 통한 메서드 호출은 네 경우 모두 진단이 없었고,ios26.0에서는 네 경우 모두 경고하지 않았습니다. 인터페이스에서PreviewProvider는 14970행에서 14972행까지 정확히 그 쌍 아래에 있고,previewLayout은 15058행에서 15059행까지 자기 선언에anyAppleOS사용 중단만 달고 있으며, 이를 담은extension SwiftUICore.View의 introduced 속성은 15051행에 있습니다.init(title:)안에서_page = State(initialValue: StickerPage(title: title))를 대입하는 뷰 두 개, 즉@State private var page: StickerPage인 것과@State private var page = StickerPage()인 것을 담은 파일은ios27.0에서 종료 코드 0, 진단 없이 컴파일되었습니다.@State검증은 각각@State private var page와let title: String을 가진StickerPageView로, iPhoneSimulator 27.0 SDK에 대해swiftc -c -target arm64-apple-ios27.0-simulator로 컴파일했습니다. Apple의 첫 번째 예제, 즉@State private var page = StickerPage()와self.page를 먼저 대입하고self.title을 대입하는init(title:)는self.page줄에서 “error: variable ‘self.title’ used before being initialized”로 실패해 종료 코드 1이었고,self.title = title을self.page대입 위로 옮긴 같은 파일은 컴파일되어 종료 코드 0이었습니다. Apple의 두 번째 예제, 즉 초기값 없는@State private var page: StickerPage와self.init(page: page, title: title)을 호출하는 익스텐션은 컴파일되어 종료 코드 0이었고,-Xfrontend -dump-macro-expansions는 매크로가@storageRestrictions(initializes: _page) init(initialValue)접근자와 함께private var _page: SwiftUICore.State<StickerPage>를 내보내는 것을 보여 줬습니다.xcrun devicectl --version: 642.16;devicectl list devices --json-output은"jsonVersion": 5를 썼습니다. 27A266a 안의 Icon ComposerInfo.plist:CFBundleShortVersionString27.0. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple, App Store Connect release notes, 2026년 9월 15일 확인. 2026년 9월 14일 항목은 위 표에 전문 인용했습니다. 2026년 9월 9일 항목은 RC SDK 업로드를 기록하고 iPhone Duo, iPhone 18 Pro Max, iPhone 18 Pro, Apple Watch Ultra 4, Apple Watch Series 12의 스크린샷과 앱 미리보기 사양을 추가하며, “Support for uploading assets for iPhone Duo in App Store Connect will be available later this year.”(App Store Connect에서 iPhone Duo용 에셋 업로드 지원은 올해 말에 제공될 예정)라고 적고 있습니다. ↩↩↩↩↩
-
Apple, iOS & iPadOS 27 Release Notes, SwiftUI, New Features(105893279), 2026년 9월 15일 확인. 다음 인용의 출처입니다. “Xcode 27 introduces a new
@Stateimplementation that avoids this repeated evaluation. This new behavior back-deploys to iOS 17 aligned OSes. The new@Stateis implemented with a Swift macro. It is largely source compatible with the property wrapper version, with a few exceptions.”;StickerPageView목록이 딸린 “If you provide an initial value at@Statedeclaration, and also try to assign a value to it in an initializer, the initializer value is discarded. This behavior has not changed because of the macro, but some such cases no longer compile:”; 목록이 딸린 “When all stored members of a struct are private, the compiler synthesizes a private init that can be used in an extension of the same type:”; 그리고 “The state macro disables this synthesized initializer. So the code above no longer compiles. To mitigate, assign value to members explicitly:”; 또한 목록 없는 두 예외 “In rare situations, the automatic inference of generic arguments of@Stateis less flexible with the macro implementation. Write the type with more specificity.”와 “Composing@Statewith other property wrappers or macros is not supported.” 같은 문서의 UIKit 절에는 6단계에서 인용한 두 요구 사항이 있습니다. New Features의 “iOS and iPadOS apps built with the 27.0 SDK or later are required to include a launch screen.”(27.0 SDK 이상으로 빌드한 iOS 및 iPadOS 앱은 런치 스크린을 포함해야 한다)(168247372)와 Deprecations의 “Apps built with the latest SDK must adopt the scene-based life cycle or they fail to launch.”(최신 SDK로 빌드한 앱은 씬 기반 라이프사이클을 채택해야 하며, 그렇지 않으면 실행에 실패한다)(141837548)입니다. ↩↩↩↩↩↩↩↩↩↩ -
Cal Stephens, SE-0508: Array expression trailing closures, Swift Evolution, 상태 “Implemented (Swift 6.4)”, 구현 swiftlang/swift#86244, 2026년 9월 15일 확인. “Init accessors” 소절이 다음의 출처입니다. “One other case where this can result in an error is for properties with both an
initaccessor and initial value that is either an array or dictionary literal. If the getter is declared before theinitaccessor, we will now attempt to parse as a trailing closure:”, 위에서 인용한 모호성 해소 문장, 그리고 “This particular case appears to be quite rare in practice, it does not appear in the source compatibility suite, or for internal Swift projects at Apple.” ↩ -
Apple, Xcode 15 Release Notes, Linking, New Features(108915312), 2026년 9월 15일 확인: “The classic linker can still be explicitly requested using -ld64, and will be removed in a future release.”(클래식 링커는 -ld64로 여전히 명시적으로 요청할 수 있으며, 향후 릴리스에서 제거될 예정) ↩↩