엄격한 동시성으로 마이그레이션하기
Swift 6 동시성 검사를 단계적으로 적용합니다.
엄격한 동시성으로 마이그레이션하기은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
엄격한 동시성이란 무엇인가요?
엄격한 동시성 검사는 잠재적인 모든 데이터 경합을 컴파일 시점에 컴파일러가 진단하도록 합니다.
Swift 6 언어 모드에서는 기본적으로 활성화되고, Swift 5 모드에서는 점진적으로 선택하여 활성화합니다.
세 가지 검사 수준
-strict-concurrency 플래그에는 세 가지 수준이 있습니다. minimal은 Swift 5의 기본값이고, targeted는 이미 동시성을 사용하는 코드를 검사하며, complete는 Swift 6 방식으로 전체를 검사합니다.
// Build settings example
// SWIFT_STRICT_CONCURRENCY = complete점진적 도입
권장되는 방법은 수준을 점진적으로 높이는 것입니다. targeted에서 시작해 경고를 수정한 다음, 언어 모드를 6으로 전환하기 전에 complete로 이동하십시오.
이렇게 하면 대규모 코드베이스에서도 마이그레이션을 관리하기 쉽습니다.
// Step 1: targeted
// Step 2: complete (warnings)
// Step 3: Swift 6 mode (errors)모듈별 마이그레이션
엄격한 동시성은 target별로 설정됩니다. 한 번에 하나의 모듈을 마이그레이션하고, 준비될 때까지 다른 모듈은 Swift 5 모드로 남겨 둘 수 있습니다.
// Package.swift target
// swiftSettings: [.enableExperimentalFeature("StrictConcurrency")]일반적인 경고: 전송 불가능한 값 캡처
가장 자주 발생하는 진단은 Task에서 전송 불가능한 값을 캡처하거나 액터 경계를 넘어 전달하는 경우입니다.
타입을 전송 가능하게 만들거나 전송 가능한 데이터만 복사해 내도록 수정하십시오.
final class Model { var name = "" }
func start(_ m: Model) {
// Warning: non-Sendable Model captured by Task
// Task { print(m.name) }
}값 타입으로 수정하기
대개 가장 깔끔한 해결 방법은 데이터를 변경 불가능한 값 타입으로 모델링하는 것입니다. 그러면 자동으로 전송 가능해집니다.
struct Model: Sendable { let name: String }
func start(_ m: Model) {
Task { print(m.name) } // safe now
}@MainActor로 수정하기
사용자 인터페이스 타입은 백그라운드 작업에서 접근되는 경우가 많아 경고가 발생합니다. 타입에 @MainActor를 표시하면 해당 타입을 메인 스레드에 고정하여 경고를 해결할 수 있습니다.
@MainActor
final class ViewModel {
var items: [String] = []
func reload() async {
let fetched = await load()
items = fetched
}
}
func load() async -> [String] { [] }기존 타입의 전송 가능성 적합성
직접 관리하며 이미 스레드 안전한 타입이라면 명시적인 Sendable 또는 @unchecked Sendable 적합성을 추가하여 경고를 정직하게 없앨 수 있습니다.
import Foundation
final class Counter: @unchecked Sendable {
private let lock = NSLock()
private var n = 0
}동시성 이전 가져오기
종속성이 아직 API에 주석을 추가하지 않았다면 @preconcurrency import를 사용해 해당 모듈의 검사를 완화할 수 있습니다. 모듈이 업데이트될 때까지 오류를 경고로 낮춥니다.
@preconcurrency import SomeLegacyFramework기호에 @preconcurrency 표시하기
개별 선언에도 @preconcurrency를 표시할 수 있습니다. 그러면 전송 가능성 요구 사항을 추가하더라도 이전 코드에서 호출하는 코드에 오류가 발생하지 않습니다.
@preconcurrency
func handle(_ value: Sendable) { }마이그레이션 확인하기
complete 검사에서 경고가 하나도 발생하지 않으면 target을 Swift 6 모드로 전환하십시오. 그러면 보장이 강제되는 오류가 되어 이후에 다시 문제가 발생할 수 없습니다.
// Package.swift
// .target(name: "App", swiftSettings: [.swiftLanguageMode(.v6)])빠른 확인: 마이그레이션
엄격한 동시성 마이그레이션에 대한 이해도를 확인해 보십시오.
복습: 엄격한 동시성으로 마이그레이션하기
엄격한 동시성 검사는 데이터 경합 감지를 컴파일 시점으로 옮기며, minimal, targeted, complete 수준을 제공합니다. 모듈별로 마이그레이션하고, 값 타입과 @MainActor 또는 정직한 전송 가능성 적합성을 사용해 전송 불가능한 값 캡처를 수정하십시오. 마이그레이션되지 않은 종속성과의 상호 운용을 원활하게 하려면 @preconcurrency를 사용하십시오.
complete에서 경고가 발생하지 않으면 Swift 6 모드를 활성화하여 보장을 확정하십시오.
자주 묻는 질문
“엄격한 동시성으로 마이그레이션하기” 강의는 무료인가요?
네 — “엄격한 동시성으로 마이그레이션하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“엄격한 동시성으로 마이그레이션하기”에서 뭘 배우나요?
Swift 6 동시성 검사를 단계적으로 적용합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Swift Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“엄격한 동시성으로 마이그레이션하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 데이터 경쟁 문제
- Sendable 프로토콜
- 액터 격리와 nonisolated
- 엄격한 동시성으로 마이그레이션하기