Tuist로 모듈화를 진행하면서 Framework 관련 지식들을 공부하다 보니 여러 모르는 개념들이 많이 보인다.
iOS에서 Framework를 새롭게 추가할 때 가능한 옵션은 다음과 같다.
- Framework : mach-o type = dynamic library
- Static Library : mach-o type = static library
이는 공식적으로 애플이 "Framework는 Dynamic으로 사용하세요." 라고 말하는 것 처럼 느껴진다.
실제로 Static Framework를 사용하다 보면 리소스를 포함할 수 없어서
어쩔 수 없이 Dynamic Framework를 사용하는 경우가 있다.
Dynamic Framework가 늘어나면 App Launcing Time이 길어지기에 여러가지 Trade-off를 고려해야 한다.
결국 어쩔 수 없이 각 피쳐에 대한 리소스 모듈을 하나의 Dynamic Framework에서 관리하는 의사결정을 하게 되는 경우도 생긴다.
그냥 "Static Framework는 번들을 못 찾아서 리소스를 못 써" 라고 생각하고 사용해왔는데
그 이유를 조금이나마 더 명확하게 알아보려 한다.
* 번들 유형
Framework는 관점에 따라 다양한 의미를 가질 수 있다.
- Swift 개발자 관점 - import 구문을 통해 재사용할 수 있는 코드 조각이다.
- Xcode 관점 - app, plugin, library와 함께 target에 사용할 수 있는 하나의 product이다.
두 가지 모두 맞지만 가장 원론적으로, Framework는 플랫폼별 콘텐츠가 포함된 계층적 디렉터리이다.
Apple은 이런 구조화된 폴더를 "Bundle" 이라고 부른다.
Framework 또한 Bundle의 한 유형이며, 다른 Bundle 유형에는 Application Bundle, Plugin Bundle이 있다.
애플리케이션 번들(.app 파일)과 달리 Framework 번들은 패키지가 아니다.
사용자에게 감춰진 파일로 표시되지 않고 일반 디렉터리 파일로 표현된다.
디렉터리 구조의 확인을 위해 다음과 같은 의존성을 갖는 프로젝트를 생성하였다.
- LiamApp -> FeatureA (Static Framework)
- LiamApp -> FeatureX (Dynamic Framework)
- FeatureX -> FeatureA
빌드 후 앱 번들(LiamApp.app)에 접근해 보면 아래와 같이 LiamApp.exec와 Frameworks/ 디렉터리 하위에 FeatureX.framework Dynamic Framework 번들이 존재한다.
Static Framework는 LiamApp.exec에 .o 파일로 잘 녹아 있다.
* Framework 리소스 접근
Framework에서 리소스를 관리하는 경우 우리는 Framework 번들의 리소스에 접근하기 위해 아래와 같은 코드를 사용한다.
private class BundleFinder {}
let bundle = Bundle(for: BundleFinder.self)
let image = UIImage(named: "image", in: bundle, with: nil)
위 코드의 경우 Dynamic Framework에서는 항상 잘 동작하지만
Static Framework에서는 정상적으로 Bundle을 찾을 수 없게 된다.
Static Framework의 소스 코드들은 앱 실행 파일에 포함되었지만
Static Framework Bundle은 App Bundle에 포함되지 않았다.
이를 굳이 해결하고 싶다면, Static Framework의 리소스를 App bundle에 포함해야 한다.
이것이 바로 리소스에 의존하는 Static Framewrok는 특정 리소스 번들과 함께 제공하는 이유다.
* 참고
https://engineering.monday.com/is-there-such-a-thing-as-a-static-framework/
'iOS > Module' 카테고리의 다른 글
Tuist - tuist test (0) | 2024.11.07 |
---|---|
Tuist - 기존 프로젝트에 Tuist 도입 배경 및 효과 (7) | 2024.08.18 |
Static Linking vs Dynamic Linking (3) | 2024.04.21 |