- Published on
모던 Swift & Apple 개발 2026 완벽 가이드 - Swift 6 Strict Concurrency · SwiftData · Foundation Models · SwiftUI 5 · Vapor · TCA 심층 분석
- Authors

- Name
- Youngju Kim
- @fjvbn20031
프롤로그 — 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 토큰.
기본 사용:
import FoundationModels
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 차트 —
Chart3DAPI로 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)이 그 자리를 빠르게 차지하고 있다.
import 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 등 표준 패턴 내장.
import Vapor
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대비 특정 패턴에서 훨씬 좋음.
import Collections
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로 파싱하고 다시 인쇄하는 라이브러리.
import SwiftSyntax
import SwiftSyntaxMacros
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 이하다.
import AWSLambdaRuntime
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 개발의 풍경
정리하면:
- Swift 6 strict concurrency가 기본 — 데이터 레이스 클래스 버그가 사실상 사라짐.
- SwiftData가 Core Data를 대체 — 신규 앱은 SwiftData가 default 선택지.
- Observation이 Combine을 대체 —
@Observable이 새 표준. - Foundation Models가 Apple Intelligence 핵심 — 온디바이스 LLM이 무료 API로 풀림.
- App Intents 등록은 사실상 의무 — Siri, Spotlight, Apple Intelligence 통합 전부 여기 의존.
- Swift Testing이 XCTest를 대체 — 매크로 기반 모던 테스트.
- SwiftPM 6 + Swift Build — 빌드 시스템이 통합되고 traits로 conditional dependency 해결.
- 서버 Swift 성장 — Vapor, Hummingbird, AWS Lambda Swift.
- TCA가 대규모 SwiftUI 앱 표준 아키텍처 — Point-Free의 영향력 커짐.
- Embedded Swift 등장 — Swift가 마이크로컨트롤러까지 내려옴.
- Cross-platform 옵션 다양화 — Skip, Swift Wasm 6.
Apple 개발자에게 2026년은 학습 부담이 큰 해다. 그러나 새 도구 하나하나가 클래스를 갈아치우는 변화여서, 한 번 익히면 코드 베이스의 안전성과 표현력이 크게 올라간다.
마지막 조언 — 새 프로젝트라면 무조건 Swift 6 strict concurrency·SwiftData·Observation·SwiftUI 6를 default로 깔고 시작하자. 기존 프로젝트라면 모듈 단위로 천천히. 그리고 Apple의 WWDC 세션과 swift.org 블로그를 매년 가을과 봄에 꼭 챙겨보자.
참고 자료 (References)
- Swift.org — https://www.swift.org/
- Swift 6 announcement — https://www.swift.org/blog/announcing-swift-6/
- Swift Evolution — https://github.com/swiftlang/swift-evolution
- SE-0414 Region-based Isolation — https://github.com/swiftlang/swift-evolution/blob/main/proposals/0414-region-based-isolation.md
- Embedded Swift documentation — https://github.com/swiftlang/swift/blob/main/docs/EmbeddedSwift.md
- SwiftData official docs — https://developer.apple.com/documentation/swiftdata
- Observation framework — https://developer.apple.com/documentation/observation
- Foundation Models framework — https://developer.apple.com/documentation/foundationmodels
- App Intents — https://developer.apple.com/documentation/appintents
- SwiftUI documentation — https://developer.apple.com/documentation/swiftui
- Swift Charts — https://developer.apple.com/documentation/charts
- Swift Testing — https://github.com/swiftlang/swift-testing
- Swift Macros guide — https://docs.swift.org/swift-book/documentation/the-swift-programming-language/macros/
- swift-syntax — https://github.com/swiftlang/swift-syntax
- Swift Package Manager — https://github.com/swiftlang/swift-package-manager
- Swift Build — https://github.com/swiftlang/swift-build
- Vapor — https://vapor.codes/
- Hummingbird — https://hummingbird.codes/
- AWS Lambda Swift Runtime — https://github.com/swift-server/swift-aws-lambda-runtime
- The Composable Architecture — https://github.com/pointfreeco/swift-composable-architecture
- Point-Free — https://www.pointfree.co/
- swift-sharing — https://github.com/pointfreeco/swift-sharing
- swift-async-algorithms — https://github.com/apple/swift-async-algorithms
- swift-collections — https://github.com/apple/swift-collections
- swift-distributed-actors — https://github.com/apple/swift-distributed-actors
- Skip (Swift to Android) — https://skip.tools/
- Swift Wasm — https://swiftwasm.org/
- Hacking with Swift — https://www.hackingwithswift.com/
- let's swift conference — https://letsswift.kr/
- iOSDC Japan — https://iosdc.jp/
- try! Swift Tokyo — https://www.tryswift.co/