<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를 의존하게 될 경우, 코드 중복이 발생할 수 있다.

> 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 처럼 컴파일 시점에 앱의 바이너리 파일에 포함되지 않고 링크하여 사용하여 비교적 느린 속도를 가진다.

> Dynamic Framework
- Source File + Dynamic Library Reference + Dynamic Library + Static Linker
- execute file에 주소를 저장하고, Static Linker를 통해 Stack으로 필요한 라이브러리를 불러와서 사용한다.
- 주소 정보는 Heap 영역에 할당되어 있다.
## Embed & Sign

> Xcode -> Project -> General
**Embed**
- 앱의 번들 파일에 해당 프레임워크를 복사할 것이다를 의미한다.
**Embed & Sign**
- Dynamic Framework인 경우에 사용한다.
**NOTE**
> Framework를 앱 번들에 한번 복사하고 코드 사이닝을 실행하여 런타임 시에 프레임워크가 필요할 때 사용한다.
**Do not Embed**
- Static Framework인 경우에 사용한다.
**NOTE**
> Static Framework는 앱의 실행 파일(executable)에 포함되어 따로 번들에 참조할 필요가 없다.