<h1><center> Static Framework vs Dynamic Framework </center></h1> ###### title: `Static Framework vs Dynamic Framework` ###### tags: `💻 TIL`, `Static Framework`, `Dynamic Framework`, `Swift` ###### date: `2023-11-13T10:39:33.284Z` > [color=#724cd1][name=데릭] > [Framework vs Library - Sencha](https://www.sencha.com/blog/difference-between-framework-vs-library-snc/) > [iOS - Static Framework vs Dynamic Framwork](https://ios-development.tistory.com/1309) > [iOS - Framework vs Library](https://ios-development.tistory.com/1004) ## 개요 > Static Framework Dynamic Framework 대해 알아보고 차이점이 무엇인지에 대해 학습하자.<br> > Framework와 Library의 차이점도 학습하자! > [선행 학습 - Framework vs Library](https://hackmd.io/BH2HRWv9Qe-VFWAXsGnuEA) ## Static vs Dynamic ### Static Framework > 앱의 실행 파일(executuable)에 바이너리 파일이 **포함되는** 형식을 의미한다.<br> 그리고, Static Framework는 **컴파일 타임**에 로드되는 방식이다. 앞서 설명한대로, 실행 파일에 포함되기 때문에 앱의 크기가 증가할 수 있다. 1. 장점 - 컴파일 타임에 로드하기 때문에 Dynamic Framework에 비해 빠른 속도를 가질 수 있다. 2. 단점 **모듈화를 시도할 경우** - Static Framework를 의존하게 되면 복사가 되는 형식이다. **NOTE** > 여러 곳에서 A Static Framework를 의존하게 될 경우, 코드 중복이 발생할 수 있다. ![image](https://hackmd.io/_uploads/SyTNQXkNa.png) > Static Framework - Source File + Static Library + Static Linker - Static Linker를 통해 Static Library의 코드가 execute file에 결합되어 Heap 메모리에 할당된다. **주의** > Static Library는 복사되는 특징이 있는데 A Static Framework를 여러 Framework에서 의존하게 되면 코드 중복이 발생할 수 있다. ### Dynamic Framework > 앱의 실행 파일(executable)에 **포함되지 않고**, **런타임** 시 연결된다.<br> 그리고, 앱이 실행되거나 필요할 때 프레임워크 코드가 메모리에 로드되는 방식이다. 1. 장점 - Static Framework와 비교했을 때, 런타임 시에 프레임워크가 로드되기 때문에 앱의 크기가 증가하지 않는다. - 또한, Dynamic Framework는 코드를 복사하는 개념이 아니라서 의존하게 되어도 코드 중복을 고려할 필요가 없다. 2. 단점 - Staic Framework 처럼 컴파일 시점에 앱의 바이너리 파일에 포함되지 않고 링크하여 사용하여 비교적 느린 속도를 가진다. ![image](https://hackmd.io/_uploads/HysXV7y4T.png) > Dynamic Framework - Source File + Dynamic Library Reference + Dynamic Library + Static Linker - execute file에 주소를 저장하고, Static Linker를 통해 Stack으로 필요한 라이브러리를 불러와서 사용한다. - 주소 정보는 Heap 영역에 할당되어 있다. ## Embed & Sign ![스크린샷 2023-11-13 12.16.03](https://hackmd.io/_uploads/HJeWSGkEp.png) > Xcode -> Project -> General **Embed** - 앱의 번들 파일에 해당 프레임워크를 복사할 것이다를 의미한다. **Embed & Sign** - Dynamic Framework인 경우에 사용한다. **NOTE** > Framework를 앱 번들에 한번 복사하고 코드 사이닝을 실행하여 런타임 시에 프레임워크가 필요할 때 사용한다. **Do not Embed** - Static Framework인 경우에 사용한다. **NOTE** > Static Framework는 앱의 실행 파일(executable)에 포함되어 따로 번들에 참조할 필요가 없다.