iOS 프로그래밍

Swift 6을 프로젝트에 적용한 후에... #1 시작

하늘흐늘 2025. 7. 3. 22:33
반응형

최근에 iOS용 신규 앱을 하나 새롭게 개발하고 있습니다. 몇 개월간의 개발 속에서 기본 골격을 만들었을 때 하나의 사소한 에러를 만났습니다. 해당 에러를 수정하던 중 이게 병렬처리와 관련된 에러란 것과 현재 Swift가 버전 6까지 나왔다는 것을 알게되었습니다. 신규 프로젝트를 만들때 따로 Swift 버전을 확인하지 않고 기본 설정된 버전(Swift 5.x)으로 개발했기 때문에 버전 6에 대해서는 모르고 있었습니다. 신규 프로젝트인 관계로 처음 만들때 최신 Swift를 적용하자는 생각에 Swift 버전을 6으로 올렸고 그때부터 컴파일 지옥이 시작되었습니다.

지금까지 참 많은 언어의 버전업을 경험했던거 같습니다. 그 때마다 언어의 버전업을 두려워하지 않았던 것은 보통 과거 버전 언어의 호환이 크게 문제가 되는 경우는 별로 없었기 때문인거 같습니다. 그저 C/C++ 윈도우 프로그래밍에서 보안으로 ANSI 함수에 대한 경고나 몇가지 설정 관련 문제 혹은 C++ 버전업으로 인한 컴파일 경고 수준 정도 였던거 같습니다.

하지만 Swift 6은 달랐습니다. 이건 이전 버전과 비슷하지만 마치 다른 언어를 프로그래밍 하는거 같았습니다. Swift 6을 적용하고 처음 만난 컴파일 관련 문제는 클래스를 MainActor로 만들거나 actor로 변환하지 않으면 클래스에서 싱글톤을 사용할 수 없다는 점이었습니다. 난생 처음 만나는 싱글톤 관련 에러 그리고 에러를 수정하면서 알게된 점은 Swift 6을 사용하기 위해서는 다른 언어의 업데이트와는 다른게 아예 새로운 개념을 이해하고 시작해야 한다는 점이었습니다. 

만약 Swift 6 이전 버전의 프로젝트가 있다면 Swift 6로 업데이트하는 것은 단순히 모든 클래스를 @MainActor로 만들어 메인쓰레드에서만 실행시킬게 아니라면 많은 클래스의 재설계를 포함한 내부구조의 재설계가 필요합니다. 실제로 제가 만들고 있는 신규 앱은 기존 나만의 프로젝트에서 설계한 구조를 가지고 있었는데 Swift 6를 적용한 후에 저는 기존 구조를 actor기반으로 재설계해야만 했습니다.

그럼 Swift 6은 왜 이전 버전과 그렇게 틀린 걸까요? 우선 Swift 6은 기본적으로 모든 처리가 병렬처리, 즉 멀티쓰레드로 돌아가게끔 만들어졌습니다. 디버깅하다가 본 쓰레드 구조로는 iOS 내부적으로 쓰레드풀을 돌리는거 같았습니다. 원래 서버 프로그래머 출신이라 멀티쓰레드를 쓰는 것을 두려워하거나 어려워하지는 않지만 Swift 6은 사용자가 직접 멀티쓰레드를 제어하게 만들지 않았습니다. 모든 쓰레드간 데이터 경쟁으로 인한 충돌을 컴파일시 체크하여 안전을 보장하게 만들었습니다. 이론적으로 보면 이상적인거 같은데 컴파일시에 모든 것을 체크할 수 있게 언어적인 확장이 있었고 Swift 6에서 원하는 형식으로 프로그래밍하여야 합니다. 

개인적으로 신규 앱을 5.x버전으로 개발하다 6버전으로 변경한 뒤에 드는 생각은 이제는 일반 클라이언트 프로그래머가 멀티쓰레딩 프로그래밍을 해야 하는 시대가 왔구나 라는 것과 언어의 난이도가 확 올라간다는 생각이었습니다. 

반응형