[Swift] Swift 6로 마이그레이션 하기

2026. 3. 4. 15:12·Apple/Swift
728x90
반응형

안녕하세요! 피피아노입니다 🎵

 

이번 포스팅에서는 WWDC24 세션 "Migrate your app to Swift 6"의 내용을 바탕으로 내 앱을 Swift 6로 마이그레이션 하는 방법에 대해서 정리를 해보려고 합니다. 더 자세한 내용은 아래 링크 참고해 주세요!

Why Swift 6?

내 앱은 이미 잘 돌아가고 있는데 왜 굳이 Swift 6로 올려야 하지?라는 생각이 드실 수 있습니다.

 

Swift 6 전까지는 개발자가 '이 작업은 메인 스레드에서, 저 작업은 백그라운드에서'라고 기억하면서 DispatchQueue를 복잡하게 사용해야 했습니다. 만약에 실수로 한 데이터를 여러 곳에서 동시에 수정하면 앱이 크래시가 발생하거나 데이터가 꼬이는 Data Race라는 게 발생했습니다.

 

하지만 Swift 6에서는 이러한 문제점을 해결했습니다. 이제 개발자가 코드를 짤 때 컴파일러가 Data Race가 일어날 것 같은 곳은 미리 알려주기 때문에, 앱을 완성하거나 출시한 뒤 알 수 없는 크래시를 획기적으로 줄일 수 있습니다.

 

마이그레이션 해보기

Apple은 마이그레이션 단계를 3단계로 나눠서 설명하고 있습니다.

 

Apple은 한 번에 모든 것을 바꾸려고 하기보다는 타깃별로 점진적으로 적용하는 것을 권장합니다.

 

1단계: 전체 동시성 검사 활성화

전체 동시성 검사를 활성화하면 프로젝트를 Swift 5 모드로 유지하되, Swift 6의 강제 데이터 격리로 인해 실패할 수 있는 모든 코드에 대해 경고를 활성화해 줍니다.

프로젝트를 선택하고 Targets에서 Build Settings에 들어간 뒤, Strict Concurrency Checking을 찾아줍니다.

 

아마 대부분은 저게 Minimal로 체크가 되어 있을 텐데 해당 부분을 Complete로 변경해 줍니다.

 

이렇게 하면 컴파일러가 동시성 안전을 확인할 수 없는 코드에 대해 경고를 표시하기 시작합니다.

지금까지는 아직 경고만 표시하기 때문에 빌드는 성공적으로 동작합니다.

제 앱은 학습용으로 만든 간단한 앱이라서 경고가 3개만 뜨지만 앱의 규모에 따라 경고는 다양하게 나타날 수 있습니다.

Type 'WritableKeyPath<DependencyValues, ObjectCaptureSessionClient>' does not conform to the 'Sendable' protocol; this is an error in the Swift 6 language mode

 

저의 경고 메시지는 이렇게 나왔습니다. 

 

Swift 6는 여러 스레드에서 동시에 접근해도 안전한 데이터(Sendable)인지 아닌지를 컴파일 단계에서 체크하는데, 이 경고는 제가 현재 코드에서 사용 중인 KeyPath가 그 검사를 통과하지 못해서 발생한 것입니다.

 

2단계: 경고 해결

DependencyValues에 새로운 종속성을 등록할 때 사용하는 WritableKeyPath는 기본적으로 Sendable이 아닙니다.

WritableKeyPath는 특정 프로퍼티를 읽고 쓸 수 있는 통로 역할을 해주는데, Swift 6에서는 KeyPath가 참조하는 대상이나 KeyPath 자체를 스레드 간에 전달할 때, 이게 Data Race를 유발하지 않는다는 확신이 필요합니다.

 

하지만 현재 제 프로젝트에 TCA 패키지를 도입해서 발생하는 경고라서 제가 해결할 수 없고 해당 경고는 일단은 넘어가도록 하겠습니다.

(*저처럼 외부 패키지 때문에 호환 문제가 발생한 것이 아니라면 꼭 경고도 해결하고 넘어가셔야 합니다! 안 그러면 Swift 6로 넘어갔을 때 에러가 생겨요!)

 

3단계: Swift 6 모드 활성화

모든 경고를 해결했다면 프로젝트 설정에서 Build Settings에 들어가 주시고 이번에는 Swift Language Version을 검색해서 선택해 줍니다.

 

지금은 Swift 5로 선택되어 있는데 해당 버전을 Swift 6로 변경해 주시면 됩니다.

컴파일을 해보면 이제 경고가 아닌 에러로 취급되어, 향후 리팩터링 시 동시성 버그가 유입되는 것을 방지할 수 있습니다.

그리고 다음 대상으로 이동해서 이 프로세스를 반복합니다.

 

참고로 Apple은 마이그레이션 리팩터링을 할 때 중요한 리팩터링과 Data Race 안전성을 한 번에 모두 진행하려고 하지 말라고 합니다. 2가지를 동시에 진행하면 한 번에 너무 많은 변화가 일어나서 다시 되돌아가야 할 수도 있다고 경고합니다.


감사합니다.

 

잘못된 내용이 있거나 더 좋은 내용 피드백은 언제나 환영합니다!

궁금하신 부분은 댓글로 질문 부탁드립니다!

728x90
반응형

'Apple > Swift' 카테고리의 다른 글

[Swift] 싱글톤 패턴(Singleton Pattern) 알아보기  (4) 2026.02.23
[Swift] Swift 동시성 사용하기  (0) 2026.02.09
[Swift] 3D 스캔 앱을 로컬 서버와 연결하기  (2) 2025.12.30
[Swift] SwiftData 모델 구조 변경 시 런타임 에러 해결하기  (0) 2025.10.13
[Swift] 앱 인텐트 알아보기  (5) 2025.09.03
'Apple/Swift' 카테고리의 다른 글
  • [Swift] 싱글톤 패턴(Singleton Pattern) 알아보기
  • [Swift] Swift 동시성 사용하기
  • [Swift] 3D 스캔 앱을 로컬 서버와 연결하기
  • [Swift] SwiftData 모델 구조 변경 시 런타임 에러 해결하기
P_Piano
P_Piano
Apple 생태계 개발자가 되기 위한 학습과 경험의 기록
    반응형
    250x250
  • P_Piano
    피피아노의 개발 일지
    P_Piano
  • 전체
    오늘
    어제
    • 분류 전체보기 (226)
      • Apple (143)
        • iOS (25)
        • visionOS (5)
        • Swift (75)
        • UIKit (2)
        • SwiftUI (25)
        • RxSwift (2)
        • Xcode (5)
        • Metal (2)
      • C언어 (5)
      • C++ (8)
      • Dart (1)
      • Python (3)
      • JavaScript (17)
      • Git (1)
      • CS (1)
        • 디자인 패턴 (6)
        • 네트워크 (20)
        • 운영체제 (8)
        • Database (5)
        • 자료구조 (0)
      • IT 지식 (2)
      • IT 뉴스 (4)
      • 출처 표기 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    visionOS
    Xcode
    ios
    스위프트
    디자인패턴
    UIKit
    이니셜라이저
    운영체제
    프로퍼티 래퍼
    비동기
    함수
    swiftUI
    티스토리챌린지
    오블완
    Initializers
    연산자
    클래스
    Apple
    제어문
    옵셔널
    자바스크립트
    프로세스
    데이터베이스
    SWIFT
    코딩테스트
    배열
    프로그래머스
    네트워크
    변수
    Vision Pro
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
P_Piano
[Swift] Swift 6로 마이그레이션 하기
상단으로

티스토리툴바