Tuist를 활용하면서 터미널에
$tuist graph
명령어를 실행시키면 현재 모듈의 구조가 어떤지 다음과 같이 그림으로 나타내준다.
해당 그림을 살펴보면 Snapkit, Swinject와 같이 노랑색에 가까운 모듈이 있고, Alamofire, Then과 같이 빨간색에 가까운 모듈이 존재한다.
iOS에서의 프레임워크의 종류는 다음과 같이 두가지가 존재한다.
1. Static Framework: Do not embed(복사)
2. Dynamic Framework: Embed(참조)
위 그림에서 빨간색 모듈은 Static Framework, 노란색 모듈은 Dynamic Framework를 뜻한다.
static & dynamic 차이점
- 차이점은 컴파일된 코드를 참조하는 방식이다.
(프레임워크 생성 시 디폴트로 Dynamic Framework로 생성된다.
Static Framework
- 앱의 실행 파일 안에 복사
장점
- 앱 실행 파일에 직접 복사되어 있으므로 런타임 속도가 빠름
- 참조가 아닌 복사이므로 안정적
단점
- Dynamic에 비해 메모리를 더 소모(직접 복사되어 있으므로)
- Framework 안에 이미지 파일과 같은 리소스 파일이 있어도 사용 불가
-> 특정 모듈에서 Static Framework를 의존하는 경우 Do Not Embed를 선택
Dynamic Framework
- 런타임 상에서 Mach-O 파일과 참조관계
Mach-O란?
애플 OS에서 동작하는 컴파일된 프로그램에 대한 파일 포맷
장점
- Framework내 이미지와 같은 리소스 파일, Bundle을 Embed 할 수 있음
- 빌드 속도 상승
단점
- 메모리 상 필요할 때 load시키므로 lazy 함
- 디버그 시 필요한 dSYM 파일을 프레임워크 개발자가 따로 제공해야함
- static에 비해 런타임(앱이 실행되고 있는 동안의 동작)에서 속도 저하
-> 특정 모듈에서 Dynamic Framework를 의존하는 경우 Embed & Sign을 선택
그렇다면 각 프레임워크를 어느 상황에 써야되는걸까?
설명만 봤을 때는 Static은 코드 중복 문제, 메모리 문제, 리소스 파일 사용 불가 문제 등 때문에 Dynamic이 더 좋은게 아닐까라고 생각했다.
그러나 메인 프로젝트에 Dynamic Framework가 많을 수록 로드하는 시간이 오래 걸리고, dynamic framework가 많을수록 임베드해야 되는 프레임워크도 증가하게 된다.
따라서 Dynamic Framework를 만들고, 이 프로젝트 안에 Static Framework를 만들게되면 Dynamic Library에 Static Library에 Executable file이 복사된다. 그렇게 되면 메인프로젝트에서 가지는 Dynamic Framework를 줄일 수 있다.
(아마 이렇게 생긴 구조를 의미하는 게 아닐까 싶다)
참고링크:
https://ios-development.tistory.com/281
[iOS - swift] framework vs Library (프레임워크와 라이브러리의 차이), static framework, dynamic framework
* 더욱 자세한 static framework외 dynamic framework 개념은 최신 포스팅 글 참고 프레임워크 vs 라이브러리 라이브러리 - "사용하는 주체"가 기능을 요청하며 사용 (언제 요청 할지, 언제 응답 받을지, 언
ios-development.tistory.com
'iOS 개발' 카테고리의 다른 글
[iOS 개발] UserDefaults, KeyChain이란? (0) | 2023.11.10 |
---|---|
[iOS 개발] Face ID, Touch ID 기능 개발 (2) | 2023.11.07 |
[iOS 개발] Library not loaded: @rpath/Swinject-Dynamic.framework/Swinject-Dynamic 오류 해결 (0) | 2023.10.25 |
[iOS 개발] TDD 정의 및 장단점 (3) | 2023.09.30 |
[Git] commit template 만들기 (0) | 2023.09.26 |