필사 모드: 모던 Swift & Apple 개발 2026 완벽 가이드 - Swift 6 Strict Concurrency · SwiftData · Foundation Models · SwiftUI 5 · Vapor · TCA 심층 분석
한국어프롤로그 — 2026년 Swift가 다시 흥미로워진 이유
2014년 WWDC에서 Chris Lattner가 무대에 올라 "One more thing... a new programming language called Swift"라고 말했을 때, 많은 사람은 이것을 Objective-C의 더 깔끔한 후속자 정도로 받아들였다. 10년이 지난 2026년 5월, 그 평가는 완전히 바뀌어 있다.
Swift는 이제 단순히 iOS 앱을 만드는 언어가 아니다. Swift 6.1의 strict concurrency 모델은 데이터 레이스를 **컴파일타임에** 잡고, region-based isolation은 Sendable 어노테이션의 보일러플레이트를 크게 줄였다. SwiftData는 Codable 기반 영속화 + CloudKit 동기화를 한 줄의 매크로로 끝내고, Foundation Models 프레임워크는 약 30억 파라미터의 온디바이스 LLM을 Apple Silicon Neural Engine 위에서 돌린다.
서버에서는 Vapor 4와 Hummingbird 2가 async/await 위에 깔끔한 라우팅 DSL을 올렸고, AWS Lambda Swift는 콜드 스타트 100ms를 끊는다. Embedded Swift는 Raspberry Pi Pico와 ARM Cortex-M 위에서 malloc 없이 동작한다. Skip은 Swift 코드를 Kotlin으로 트랜스파일해서 Android에 떨군다.
이 글은 Swift 6 동시성 모델부터 SwiftData History API, Foundation Models tool calling, SwiftUI 5 ContainerValues, App Intents, Swift Testing, Swift Macros, SwiftPM 6, TCA 1.x, Vapor 4, Embedded Swift, Swift Wasm 6까지 — 2026년 Apple 개발자가 알아야 할 모든 변화를 한 번에 정리한다.
1장 · Swift 6 Strict Concurrency — 데이터 레이스를 컴파일타임에 잡다
Swift 6.0은 2024년 9월 GA됐고, 2026년 5월 stable은 6.1.2다. 가장 큰 변화는 **strict concurrency checking이 기본**이 됐다는 것이다.
Swift 5에서는 `-strict-concurrency=complete` 플래그를 켜야 데이터 레이스 경고가 나왔다. Swift 6은 이걸 기본 모드로 만들었다. 무엇이 바뀌나?
- 모든 actor-isolated 값은 actor 경계를 넘을 때 Sendable이어야 한다.
- non-Sendable 클래스가 `@MainActor`가 아닌 컨텍스트로 전달되면 컴파일 에러.
- 글로벌 변수는 `nonisolated(unsafe)` 또는 `@MainActor` 같은 명시적 isolation이 없으면 에러.
// Swift 5에서는 경고, Swift 6에서는 에러
class Counter {
var count = 0
}
func runConcurrently() async {
let counter = Counter()
Task { counter.count += 1 }
Task { counter.count += 1 }
// ❌ Counter가 Sendable이 아닌데 Task 클로저로 캡처됨
}
이걸 잡으려면 actor로 감싸거나, Sendable 프로토콜을 명시적으로 채택해야 한다. 처음에는 마이그레이션 비용이 크지만, 일단 통과하고 나면 데이터 레이스 클래스 버그가 사실상 제거된다.
2장 · Region-Based Isolation — Sendable의 보일러플레이트를 줄이다
Swift 6에 들어온 가장 우아한 기능 중 하나가 **region-based isolation**(SE-0414)이다. 핵심 아이디어 — **non-Sendable 값이라도 컴파일러가 "다른 스레드에서 접근하지 않는다"는 것을 추적할 수 있다면 안전하게 전달할 수 있다.**
// non-Sendable 클래스
class ImageBuffer {
var pixels: [UInt8] = []
}
func process() async {
let buffer = ImageBuffer()
buffer.pixels = generatePixels()
// Swift 5 strict: 에러 — ImageBuffer가 Sendable이 아님
// Swift 6: OK — buffer는 이 시점부터 호출자가 접근하지 않으므로 안전하게 transfer 가능
await processOnBackground(buffer)
}
컴파일러는 `buffer`가 함수 종료 전에 호출자 region에서 사용되지 않는다는 것을 정적 분석으로 증명하고, transfer를 허용한다. 이게 없었다면 `Sendable`을 따로 채택하거나 모든 데이터를 복사해야 했다.
실제 코드 베이스에서 region isolation 덕에 `Sendable` 어노테이션 50~70%를 제거할 수 있다는 게 일반적 보고다. iOS 17·18 시대의 SwiftUI 코드가 Swift 6에서 훨씬 깔끔해진 이유.
3장 · @MainActor 개선과 nonisolated(unsafe)
SwiftUI는 모든 View가 암묵적으로 `@MainActor`인 모델이다. Swift 6은 이걸 더 정교하게 만들었다.
- `@MainActor`가 클래스 단위로 붙으면 모든 메서드/프로퍼티가 메인 스레드 격리.
- 메서드 단위로 붙이면 그 메서드만.
- `nonisolated` 키워드로 격리를 명시적으로 해제 가능.
- `nonisolated(unsafe)` — Swift 6에서 도입된 escape hatch. "이 변수는 isolation 검사를 하지 않을게, 내가 책임진다."
@MainActor
class ViewModel {
var items: [Item] = []
nonisolated(unsafe) static let shared = ViewModel()
// ↑ 이게 없으면 글로벌 ViewModel.shared는 main actor 격리 위반
}
`nonisolated(unsafe)`는 마이그레이션 도구다. 시간을 내서 진짜 actor로 바꿔야 하지만, 우선 컴파일은 통과시키고 빠르게 출시할 수 있게 해준다.
4장 · Embedded Swift — Raspberry Pi Pico에서 malloc 없이
2024년에 공개된 **Embedded Swift**는 Swift를 임베디드 마이크로컨트롤러로 끌어내린 프로젝트다. 2026년 5월 시점에 production-ready 직전 단계.
핵심 제약:
- **No malloc** — 동적 메모리 할당 없이 동작. ARC도 stack/static에만.
- **Small binary** — `Hello, world` 바이너리가 10KB 미만 (vs 일반 Swift 1.5MB).
- **No reflection / no runtime metadata** — 코드 크기 폭발 방지.
- **No Foundation** — 표준 라이브러리 일부만 사용.
지원 타깃:
- Raspberry Pi Pico (RP2040, ARM Cortex-M0+)
- ESP32-C6 (RISC-V)
- STM32 시리즈 (Cortex-M3/M4)
- Apple의 Secure Enclave 일부 펌웨어
@_extern(c, "gpio_put")
func gpio_put(pin: UInt32, value: Bool)
@main struct Blink {
static func main() {
while true {
gpio_put(pin: 25, value: true)
sleep_ms(500)
gpio_put(pin: 25, value: false)
sleep_ms(500)
}
}
}
Apple은 자기네 SoC 펌웨어를 점진적으로 Swift로 옮기고 있고, 한국 라온시큐어 같은 보안 회사도 ARM Cortex-M HSM 펌웨어에 Embedded Swift를 실험 중이다.
5장 · SwiftData — Core Data를 대체하는 Codable 영속화
SwiftData는 iOS 17에서 처음 등장한 영속화 프레임워크다. Core Data를 모던 Swift 위에 재포장한 것에 가깝지만, 차이가 크다.
iOS 18에서 들어온 주요 기능:
- **History API** — 다른 디바이스에서 일어난 변경을 history transaction으로 추적. CloudKit 동기화 후 어떤 행이 들어왔는지 정확히 알 수 있다.
- **Composite keys** — 두 개 이상 필드 조합으로 unique 키 정의.
- **Indexes** — `@Attribute(.indexBinary)` 매크로로 binary index 생성.
- **#Predicate 매크로** — 타입 안전한 쿼리. SQL 인젝션 클래스 위험 제거.
@Model
final class Note {
var title: String
var body: String
var createdAt: Date
@Attribute(.indexBinary)
var tags: [String]
init(title: String, body: String) {
self.title = title
self.body = body
self.createdAt = .now
}
}
// 쿼리
let recent = try modelContext.fetch(
FetchDescriptor(predicate: #Predicate { $0.createdAt > Date.distantPast })
)
CloudKit 통합도 한 줄. `ModelConfiguration(cloudKitDatabase: .private("iCloud.com.example"))`만 추가하면 자동 동기화. 2026년 시점에서 신규 앱이 Core Data를 새로 쓸 이유가 거의 없다.
6장 · Observation Framework — @Observable 매크로
iOS 17에서 `Combine`의 `ObservableObject` + `@Published`를 대체하는 새 framework가 들어왔다. 이름은 **Observation**.
Before (Combine 시대):
class ViewModel: ObservableObject {
@Published var items: [Item] = []
@Published var isLoading = false
}
After (Observation 시대):
@Observable
class ViewModel {
var items: [Item] = []
var isLoading = false
}
`@Observable`은 Swift Macro로 구현됐다. 컴파일 타임에 KeyPath 추적과 willSet 트리거를 자동으로 합성한다. 차이점:
- **자동 의존성 추적** — View 안에서 실제로 읽은 프로퍼티만 다시 그린다. `@Published` 전체 재구독보다 효율적.
- **`@StateObject` 불필요** — `@State`로 끝.
- **Combine 종속성 제거** — `import Combine` 안 해도 됨.
대규모 앱일수록 리렌더 횟수가 줄어드는 효과가 크다.
7장 · Foundation Models — 온디바이스 LLM이 표준 API로
2024년 WWDC에서 공개된 **Foundation Models** 프레임워크는 Apple Intelligence의 핵심이다. iOS 18.4·macOS 15부터 정식 API로 풀렸다.
스펙:
- 약 30억 파라미터 규모의 디코더 전용 LLM.
- Apple Silicon Neural Engine에서 양자화된 가중치로 추론.
- M2 이상 / A17 Pro 이상에서 동작.
- 컨텍스트 약 8K 토큰.
기본 사용:
let session = LanguageModelSession()
let response = try await session.respond(to: "Summarize this email in 2 sentences: ...")
print(response.content)
핵심 기능 두 가지:
- **Tool calling** — 모델이 호출 가능한 함수를 등록하면, 자연어 요청을 받았을 때 적절한 함수를 호출.
- **Guided Generation** — 출력 스키마를 Swift 타입으로 지정하면 JSON 안 거치고 직접 Swift struct를 받음.
@Generable
struct WeatherQuery {
var city: String
var unit: TemperatureUnit
}
let query: WeatherQuery = try await session.respond(
to: "How hot is it in Seoul in fahrenheit?",
generating: WeatherQuery.self
)
// query.city == "Seoul", query.unit == .fahrenheit
서버 LLM과 비교하면 컨텍스트와 추론 능력은 약하지만, **온디바이스 + 무료 + 프라이버시**라는 세 가지 강점이 비할 데 없다.
8장 · App Intents — Siri와 Apple Intelligence의 진입점
App Intents는 iOS 16에서 시작된 프레임워크인데, Apple Intelligence와 합쳐지면서 위상이 완전히 달라졌다. 2026년 시점에서 App Intent를 등록하면:
- Siri가 자연어로 호출 가능.
- App Shortcuts에 자동 노출.
- Spotlight 검색 결과로 등장.
- Apple Intelligence가 다른 앱의 컨텍스트를 가져올 때 사용.
struct AddNoteIntent: AppIntent {
static let title: LocalizedStringResource = "Add Note"
@Parameter(title: "Title")
var noteTitle: String
@Parameter(title: "Body")
var body: String
func perform() async throws -> some IntentResult {
let note = Note(title: noteTitle, body: body)
try modelContext.insert(note)
return .result(value: note.id)
}
}
이게 등록되어 있으면 "노트 앱에 회의 메모 추가해줘"라는 Siri 명령이 정확한 매개변수로 매핑된다. 2026년 Apple은 App Intent 등록을 **사실상 의무화**하는 방향으로 가고 있다.
9장 · SwiftUI 5·6 — 애니메이션과 ContainerValues
iOS 17에서 SwiftUI 5, iOS 18에서 SwiftUI 6가 나왔다. 주요 변화들:
- **CustomAnimation 프로토콜** — 임의의 timing function 정의 가능.
- **PhaseAnimator** — 여러 단계의 애니메이션을 자동 순차 재생.
- **Metal Shader Effects** — `.colorEffect()`, `.distortionEffect()`로 GPU 셰이더 직접 적용.
- **Scroll APIs** — `.scrollPosition()`, `.scrollTransition()`, `.scrollTargetBehavior()` 도입.
- **ContainerValues** — `@Entry`로 컨테이너에 임의 키-값 전달. ForEach 자식에 props 흘리기가 깔끔해짐.
- **Custom Layout** — `Layout` 프로토콜 — 자체 레이아웃 알고리즘 구현. CGSize 기반 placement.
ScrollView {
LazyVStack {
ForEach(items) { item in
Card(item)
.scrollTransition { content, phase in
content
.scaleEffect(phase.isIdentity ? 1 : 0.85)
.opacity(phase.isIdentity ? 1 : 0.5)
}
}
}
.scrollTargetLayout()
}
.scrollTargetBehavior(.viewAligned)
이 정도 인터랙션을 UIKit으로 짜면 200줄, SwiftUI 5에서는 10줄.
10장 · Swift Charts 2.0 — 벡터화 렌더링과 3D
Swift Charts는 2022년에 처음 발표됐고 2026년 5월 stable은 2.0. 핵심 변화:
- **벡터화 렌더링** — Metal 백엔드로 수만 개 데이터 포인트를 60fps로 렌더링.
- **3D 차트** — `Chart3D` API로 RealityKit 위에 띄움. visionOS에서 특히 매력적.
- **상호작용 강화** — `chartScrollableAxes`, `chartXSelection` — 핀치 줌, 드래그, 선택.
- **Heatmap, Sankey, Treemap** 마크 정식 지원.
Chart {
ForEach(data) { point in
LineMark(
x: .value("Time", point.time),
y: .value("Value", point.value)
)
.interpolationMethod(.catmullRom)
.foregroundStyle(by: .value("Series", point.series))
}
}
.chartXSelection(value: $selectedTime)
.chartScrollableAxes(.horizontal)
데이터 분석 SwiftUI 앱이 2026년에 폭발적으로 늘어난 배경에는 Swift Charts 2.0의 기여가 크다.
11장 · Swift Testing — XCTest를 대체하는 모던 테스트 프레임워크
XCTest는 2014년 이래 Apple 플랫폼의 표준 테스트 프레임워크였지만, 매크로 기반 모던 Swift와 잘 맞지 않았다. 2024년 발표된 **Swift Testing**(swift-testing)이 그 자리를 빠르게 차지하고 있다.
@Test func basicAddition() {
#expect(2 + 2 == 4)
}
@Test(arguments: [1, 2, 3, 4, 5])
func square(value: Int) {
#expect(value * value >= value)
}
@Test("Network call returns 200")
func networkSuccess() async throws {
let response = try await fetchUser(id: 42)
#expect(response.status == 200)
}
핵심 개선:
- **`@Test` 어노테이션** — `XCTestCase` 상속 없이 함수 단위로 테스트.
- **`#expect` 매크로** — `XCTAssertEqual` 등의 길고 약한 어설션을 대체.
- **Parameterized tests** — 한 함수에 여러 입력 자동 생성.
- **Trait 시스템** — `.disabled`, `.timeLimit(.minutes(2))`, `.tags(.integration)` 같은 메타데이터.
- **병렬 실행 기본** — 테스트 간 격리가 명시적.
2026년 5월 stable은 swift-testing 0.10.x이고, Xcode 16부터 IDE에 1급 통합됐다.
12장 · Swift Macros — 컴파일 타임 코드 생성
Swift 5.9에서 도입된 매크로 시스템은 2026년에 완전히 안정화됐다. 두 가지 종류:
- **Freestanding macro** — `#stringify(2+2)`, `#expect(x > 0)` 처럼 식이나 문 자리에 호출.
- **Attached macro** — `@Observable`, `@Model`, `@Generable`처럼 선언에 붙임.
매크로는 swift-syntax 600 위에서 SwiftSyntax 트리를 받아 새로운 SwiftSyntax 트리를 반환하는 컴파일러 플러그인이다.
@freestanding(expression)
public macro stringify<T>(_ value: T) -> (T, String) = #externalMacro(
module: "MyMacros",
type: "StringifyMacro"
)
let (result, source) = #stringify(2 + 3)
// result == 5, source == "2 + 3"
매크로의 좋은 점:
- 보일러플레이트(Codable, Equatable, Mock 등) 자동 합성.
- KeyPath, 의존성, DSL 같은 메타프로그래밍에서 컴파일 타임 검증.
- 런타임 비용 0.
단점은 빌드 시간 증가와 디버깅 어려움. 매크로 expansion을 디버깅하려면 Xcode "Expand Macro" 메뉴로 결과 코드를 펼쳐봐야 한다.
13장 · Swift Package Manager 6 + Swift Build
Swift Package Manager는 2026년에 6.0 메이저 업데이트가 들어왔다. 가장 큰 변화는 **Swift Build**의 도입이다.
Swift Build는 Apple이 xcodebuild의 내부 빌드 엔진을 오픈소스화한 것. 기존 SwiftPM의 llbuild를 점진적으로 대체하고, 결과적으로 SwiftPM 빌드와 Xcode 빌드가 같은 엔진 위에서 돈다.
SwiftPM 6의 다른 변화:
- **Package traits** — Cargo의 feature flag와 동등한 기능. 패키지가 옵션 의존성을 선언할 수 있다.
- **Strict concurrency** — 매니페스트가 Swift 6 모드를 기본.
- **Prebuilt binaries** — `binaryTarget` 개선, 멀티 아키텍처 XCFramework 자동 생성.
- **Workspace 개선** — 멀티 패키지 모노레포 지원이 더 매끄러워짐.
let package = Package(
name: "MyApp",
traits: [
.default(enabledTraits: ["network"]),
"logging",
],
dependencies: [
.package(url: "https://github.com/apple/swift-log", from: "1.5.0"),
],
targets: [
.target(
name: "MyApp",
dependencies: [
.product(name: "Logging", package: "swift-log", condition: .when(traits: ["logging"]))
]
)
]
)
이전까지 SwiftPM의 가장 큰 약점이었던 conditional dependency와 IDE 통합이 SwiftPM 6에서 한 번에 풀렸다.
14장 · Vapor 4.x — Server-Side Swift의 사실상 표준
Vapor는 2016년부터 시작된 Swift 서버 프레임워크다. 2026년 5월 stable은 4.95.
특징:
- **async/await 우선** — 모든 핸들러가 `async throws` 시그니처.
- **NIO 기반** — Apple SwiftNIO 위에서 동작. 이벤트 루프 + non-blocking IO.
- **Fluent ORM** — Postgres·MySQL·SQLite 지원. Swift 타입 안전 쿼리.
- **Leaf 템플릿** — Server-Side rendering 필요 시.
- **JWT, OAuth, WebSocket** 등 표준 패턴 내장.
func routes(_ app: Application) throws {
app.get("users", ":id") { req async throws -> User in
guard let id = req.parameters.get("id", as: UUID.self) else {
throw Abort(.badRequest)
}
return try await User.find(id, on: req.db).orThrow(.notFound)
}
app.post("users") { req async throws -> User in
let payload = try req.content.decode(User.Create.self)
let user = User(name: payload.name)
try await user.save(on: req.db)
return user
}
}
Vapor 외에 **Hummingbird 2**(애플 사내 엔지니어들이 만든 가벼운 대안)와 **AWS Lambda Swift Runtime**(콜드 스타트 100ms 이하)이 자라고 있다. 한국에서는 토스 같은 회사가 일부 마이크로서비스를 Vapor로 옮긴 사례가 있다.
15장 · The Composable Architecture (TCA) 1.x
Point-Free의 Brandon Williams와 Stephen Celis가 만든 **The Composable Architecture**는 SwiftUI 시대의 가장 영향력 있는 아키텍처 라이브러리다. 2024년에 1.0이 GA됐고 2026년 5월 stable은 1.18.x.
핵심 개념:
- **State** — 화면 상태를 단일 struct로.
- **Action** — 가능한 모든 사용자/시스템 액션을 enum으로.
- **Reducer** — `(inout State, Action) -> Effect<Action>` 형태의 순수 함수.
- **Store** — State를 보관하고 Action을 reducer에 흘림.
- **Dependencies** — 시스템 의존성(시계, 네트워크 등)을 명시적 주입.
@Reducer
struct CounterFeature {
@ObservableState
struct State {
var count = 0
var isLoading = false
}
enum Action {
case incrementTapped
case fetchNumberTapped
case numberResponse(Int)
}
@Dependency(\.numberFact) var numberFact
var body: some ReducerOf<Self> {
Reduce { state, action in
switch action {
case .incrementTapped:
state.count += 1
return .none
case .fetchNumberTapped:
state.isLoading = true
return .run { send in
let n = try await numberFact.random()
await send(.numberResponse(n))
}
case .numberResponse(let n):
state.count = n
state.isLoading = false
return .none
}
}
}
}
2024~2026 사이 들어온 중요한 변화:
- **`@Reducer` 매크로** — 보일러플레이트 대폭 축소.
- **`@ObservableState`** — Observation 프레임워크와 통합.
- **Scoped stores** — child feature에 store 자르기가 간결.
- **swift-sharing** — TCA 바깥에서 `@Shared` 프로퍼티 래퍼로 상태 공유.
대규모 SwiftUI 앱(특히 Kakao Pay·당근마켓·라인 일본 일부)에서 TCA 채택률이 빠르게 늘었다.
16장 · swift-async-algorithms와 swift-collections
표준 라이브러리만으로 부족한 경우를 위해 Apple은 **swift-async-algorithms**와 **swift-collections**를 제공한다.
**swift-async-algorithms**:
- `AsyncSequence` 확장 — `.chunks(ofCount:)`, `.combineLatest`, `.merge`, `.throttle`, `.debounce`.
- Reactive 스트림(`Combine`)을 async/await 세계로 옮겨오는 다리.
let sensorStream: AsyncSequence<Reading, Error> = ...
for try await chunk in sensorStream.chunks(ofCount: 100) {
let avg = chunk.map(\.value).reduce(0, +) / 100
print("Avg over 100 samples: \(avg)")
}
**swift-collections**:
- `Deque`, `OrderedSet`, `OrderedDictionary`, `Heap` 등 표준 라이브러리에 없는 컬렉션.
- 모두 Swift 표준 컬렉션 프로토콜 준수.
- 성능이 표준 `Array`·`Set` 대비 특정 패턴에서 훨씬 좋음.
var queue: Deque<Task> = []
queue.append(task1)
queue.prepend(urgentTask)
let next = queue.popFirst()
이 두 패키지는 사실상 "Swift 1.6 표준 라이브러리 확장팩" 위치다.
17장 · swift-syntax와 swift-distributed-actors
**swift-syntax**(600 시리즈)는 매크로 작성의 핵심이다. Swift 소스를 AST로 파싱하고 다시 인쇄하는 라이브러리.
public struct LoggedMacro: PeerMacro {
public static func expansion(
of node: AttributeSyntax,
providingPeersOf declaration: some DeclSyntaxProtocol,
in context: some MacroExpansionContext
) throws -> [DeclSyntax] {
// declaration을 받아서 로그를 찍는 wrapper 메서드를 생성
// ...
}
}
**swift-distributed-actors**는 Actor 모델을 네트워크 너머로 확장한 프로젝트. 2024년 Apple이 GitHub에 공개했고, 2026년 5월 시점은 cluster 기능까지 GA. Erlang/Akka 같은 분산 시스템을 Swift로 짤 때 쓴다.
distributed actor ChatRoom {
distributed func broadcast(_ message: String) async { ... }
}
let cluster = await ClusterSystem("MyCluster")
let room = try ChatRoom.resolve(id: roomID, using: cluster)
try await room.broadcast("Hello")
게임 백엔드, IoT 메시지 브로커, edge compute에 어울리는 도구. 한국 NCsoft 일부 신규 게임 서버가 swift-distributed-actors PoC를 돌렸다는 소문이 있다.
18장 · AWS Lambda Swift Runtime — 콜드 스타트 100ms
서버 Swift의 또 다른 영역은 **AWS Lambda**다. AWS Lambda Swift Runtime은 Apple과 AWS가 공동 관리하는 공식 런타임이고, 콜드 스타트가 보통 100ms 이하다.
struct HelloHandler: LambdaHandler {
typealias Event = APIGatewayV2Request
typealias Output = APIGatewayV2Response
func handle(_ event: Event, context: LambdaContext) async throws -> Output {
return APIGatewayV2Response(statusCode: .ok, body: "Hello from Swift!")
}
}
Lambda.run(HelloHandler.init)
배포는 `swift build` + `zip` + `aws lambda update-function-code` 3단계. Docker 이미지로 패키징도 가능.
장점:
- 단일 바이너리, 빠른 콜드 스타트.
- async/await 모델이 Lambda의 invocation 모델과 잘 맞음.
- Apple 사내에서도 일부 백엔드를 Lambda Swift로 운영하는 것으로 알려짐.
단점:
- ARM64 Lambda 환경에서 빌드해야 함(혹은 Docker 크로스 빌드).
- 라이브러리 생태계가 아직 Node.js·Python보다 좁음.
19장 · Cross-Platform — Skip(Swift→Android)과 Swift Wasm 6
Swift는 Linux와 Windows에서 진작 동작했지만, 모바일 크로스 플랫폼은 오래 약점이었다. 2026년에는 두 가지 흥미로운 선택지가 있다.
**Skip**(skip.tools)은 Swift 코드를 Kotlin으로 트랜스파일해서 Android 앱을 만든다. SwiftUI를 그대로 쓰면 Skip이 Jetpack Compose 코드로 변환한다.
// 같은 SwiftUI 코드가...
struct ContentView: View {
@State var count = 0
var body: some View {
VStack {
Text("Count: \(count)")
Button("Increment") { count += 1 }
}
}
}
// ↑ iOS에서는 SwiftUI로, Android에서는 Compose로 동작
**Swift Wasm 6**은 Swift를 WebAssembly로 컴파일한다. 2024년 Wasm 6가 GA되면서 component model 호환이 들어왔고, 브라우저와 서버리스 Wasm(Fastly, Cloudflare Workers) 양쪽에서 동작.
두 프로젝트 모두 "Apple 공식"은 아니지만 Swift workgroup이 적극 관여하고 있고, 2026년 시점에서 production 사례가 늘고 있다.
20장 · 한국/일본 Apple 개발 커뮤니티
Swift는 한국과 일본에서 강한 풀뿌리 커뮤니티를 가지고 있다.
**한국**:
- **GDG iOS Korea** — 분기마다 밋업, 발표 슬라이드와 영상 공개.
- **let's swift** — 매년 12월 코엑스에서 열리는 컨퍼런스. 2025년 5회차에는 1500명 참가.
- **Codestates iOS 부트캠프**, **F-Lab** 등 신규 개발자 트레이닝.
- 회사 풍경 — 카카오, 토스, 당근마켓, 라인 코리아, 쿠팡 iOS 팀이 활발.
**일본**:
- **iOSDC Japan** — 매년 9월 도쿄. iOS 컨퍼런스 중 가장 큰 규모, 1주일 동안 3000명 이상.
- **try! Swift Tokyo** — 글로벌 Swift 컨퍼런스. 2025년 3월에 9회차 진행.
- **potatotips** — 매월 도쿄/오사카에서 열리는 5분 발표 모임. 200회 이상 누적.
- 회사 풍경 — Mercari, LINE, Cookpad, ZOZO, DeNA, CyberAgent가 활발.
영어권 자료만 보면 놓치기 쉬운데, 한국어/일본어 Swift 커뮤니티가 가지고 있는 노하우의 깊이는 만만치 않다.
21장 · 의사결정 가이드 — 어떤 도구를 언제 쓸까
질문 1. 어떤 플랫폼?
├─ iOS / macOS 단일 → SwiftUI 6 + SwiftData + Observation
├─ iOS + Android → Skip 또는 React Native / Flutter
├─ 서버 → Vapor 4 또는 Hummingbird 2
├─ AWS Lambda → AWS Lambda Swift Runtime
├─ 임베디드 → Embedded Swift
└─ 브라우저 → Swift Wasm 6
질문 2. 영속화는?
├─ 로컬 단순 → SwiftData
├─ CloudKit 동기화 → SwiftData + cloudKitDatabase
├─ 서버 RDB → Vapor + Fluent
└─ 기존 Core Data 자산 → Core Data 유지 (마이그레이션 비용 계산)
질문 3. 상태 관리는?
├─ 소규모 화면 → @State + @Observable
├─ 중규모 화면 → @Observable + Environment
├─ 대규모 앱 → TCA 1.x
└─ 분산 시스템 → swift-distributed-actors
질문 4. LLM이 필요한가?
├─ 온디바이스 + 무료 → Foundation Models
├─ 강력한 추론 필요 → 서버 LLM (Claude, GPT) API 호출
└─ Apple Intelligence 통합 → App Intents + Foundation Models 조합
22장 · 흔한 마이그레이션 함정
Swift 5 → Swift 6 마이그레이션에서 자주 보는 패턴:
- **글로벌 mutable 변수** — `nonisolated(unsafe)` 또는 actor로 감싸기. 둘 다 안 된다면 컴파일 안 됨.
- **Combine 의존** — Observation으로 옮길 때 일부 Combine 연산자(`.share()`, `.multicast()`)는 대체가 어려움. swift-async-algorithms가 메우는 중.
- **Singleton 패턴** — `static let shared`가 `@MainActor` 객체일 때 충돌. `nonisolated(unsafe)` 또는 isolated init이 필요.
- **DispatchQueue 잔재** — `DispatchQueue.main.async` 호출이 actor 모델과 섞이면 race 가능. 가급적 `await MainActor.run { ... }` 또는 `@MainActor`로 일관성 유지.
- **Core Data → SwiftData** — `@Model` 자동 합성과 기존 NSManagedObject가 다른 메모리 모델. 점진적 마이그레이션 API는 있지만, 큰 앱에서 1년 이상 걸리는 게 보통.
급하게 옮기지 말고, 모듈 단위로 천천히. Apple도 strict concurrency 마이그레이션에 3년을 잡았다.
23장 · 2026년 Apple 개발의 풍경
정리하면:
1. **Swift 6 strict concurrency가 기본** — 데이터 레이스 클래스 버그가 사실상 사라짐.
2. **SwiftData가 Core Data를 대체** — 신규 앱은 SwiftData가 default 선택지.
3. **Observation이 Combine을 대체** — `@Observable`이 새 표준.
4. **Foundation Models가 Apple Intelligence 핵심** — 온디바이스 LLM이 무료 API로 풀림.
5. **App Intents 등록은 사실상 의무** — Siri, Spotlight, Apple Intelligence 통합 전부 여기 의존.
6. **Swift Testing이 XCTest를 대체** — 매크로 기반 모던 테스트.
7. **SwiftPM 6 + Swift Build** — 빌드 시스템이 통합되고 traits로 conditional dependency 해결.
8. **서버 Swift 성장** — Vapor, Hummingbird, AWS Lambda Swift.
9. **TCA가 대규모 SwiftUI 앱 표준 아키텍처** — Point-Free의 영향력 커짐.
10. **Embedded Swift 등장** — Swift가 마이크로컨트롤러까지 내려옴.
11. **Cross-platform 옵션 다양화** — Skip, Swift Wasm 6.
Apple 개발자에게 2026년은 학습 부담이 큰 해다. 그러나 새 도구 하나하나가 클래스를 갈아치우는 변화여서, 한 번 익히면 코드 베이스의 안전성과 표현력이 크게 올라간다.
마지막 조언 — 새 프로젝트라면 무조건 Swift 6 strict concurrency·SwiftData·Observation·SwiftUI 6를 default로 깔고 시작하자. 기존 프로젝트라면 모듈 단위로 천천히. 그리고 Apple의 WWDC 세션과 swift.org 블로그를 매년 가을과 봄에 꼭 챙겨보자.
참고 자료 (References)
1. Swift.org — [https://www.swift.org/](https://www.swift.org/)
2. Swift 6 announcement — [https://www.swift.org/blog/announcing-swift-6/](https://www.swift.org/blog/announcing-swift-6/)
3. Swift Evolution — [https://github.com/swiftlang/swift-evolution](https://github.com/swiftlang/swift-evolution)
4. SE-0414 Region-based Isolation — [https://github.com/swiftlang/swift-evolution/blob/main/proposals/0414-region-based-isolation.md](https://github.com/swiftlang/swift-evolution/blob/main/proposals/0414-region-based-isolation.md)
5. Embedded Swift documentation — [https://github.com/swiftlang/swift/blob/main/docs/EmbeddedSwift.md](https://github.com/swiftlang/swift/blob/main/docs/EmbeddedSwift.md)
6. SwiftData official docs — [https://developer.apple.com/documentation/swiftdata](https://developer.apple.com/documentation/swiftdata)
7. Observation framework — [https://developer.apple.com/documentation/observation](https://developer.apple.com/documentation/observation)
8. Foundation Models framework — [https://developer.apple.com/documentation/foundationmodels](https://developer.apple.com/documentation/foundationmodels)
9. App Intents — [https://developer.apple.com/documentation/appintents](https://developer.apple.com/documentation/appintents)
10. SwiftUI documentation — [https://developer.apple.com/documentation/swiftui](https://developer.apple.com/documentation/swiftui)
11. Swift Charts — [https://developer.apple.com/documentation/charts](https://developer.apple.com/documentation/charts)
12. Swift Testing — [https://github.com/swiftlang/swift-testing](https://github.com/swiftlang/swift-testing)
13. Swift Macros guide — [https://docs.swift.org/swift-book/documentation/the-swift-programming-language/macros/](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/macros/)
14. swift-syntax — [https://github.com/swiftlang/swift-syntax](https://github.com/swiftlang/swift-syntax)
15. Swift Package Manager — [https://github.com/swiftlang/swift-package-manager](https://github.com/swiftlang/swift-package-manager)
16. Swift Build — [https://github.com/swiftlang/swift-build](https://github.com/swiftlang/swift-build)
17. Vapor — [https://vapor.codes/](https://vapor.codes/)
18. Hummingbird — [https://hummingbird.codes/](https://hummingbird.codes/)
19. AWS Lambda Swift Runtime — [https://github.com/swift-server/swift-aws-lambda-runtime](https://github.com/swift-server/swift-aws-lambda-runtime)
20. The Composable Architecture — [https://github.com/pointfreeco/swift-composable-architecture](https://github.com/pointfreeco/swift-composable-architecture)
21. Point-Free — [https://www.pointfree.co/](https://www.pointfree.co/)
22. swift-sharing — [https://github.com/pointfreeco/swift-sharing](https://github.com/pointfreeco/swift-sharing)
23. swift-async-algorithms — [https://github.com/apple/swift-async-algorithms](https://github.com/apple/swift-async-algorithms)
24. swift-collections — [https://github.com/apple/swift-collections](https://github.com/apple/swift-collections)
25. swift-distributed-actors — [https://github.com/apple/swift-distributed-actors](https://github.com/apple/swift-distributed-actors)
26. Skip (Swift to Android) — [https://skip.tools/](https://skip.tools/)
27. Swift Wasm — [https://swiftwasm.org/](https://swiftwasm.org/)
28. Hacking with Swift — [https://www.hackingwithswift.com/](https://www.hackingwithswift.com/)
29. let's swift conference — [https://letsswift.kr/](https://letsswift.kr/)
30. iOSDC Japan — [https://iosdc.jp/](https://iosdc.jp/)
31. try! Swift Tokyo — [https://www.tryswift.co/](https://www.tryswift.co/)
현재 단락 (1/474)
2014년 WWDC에서 Chris Lattner가 무대에 올라 "One more thing... a new programming language called Swift"라고 말했을...