본문 바로가기

iOS/STUDY

[iOS] Static, Dynamic Library, Framework

Xcode에서 Cocoapods, Carthage, SPM 같은 도구를 사용하여 외부 프레임워크를 사용합니다.

프레임워크가 어떻게 구성되어 있고, 동작하고, Static Framework와 Dynamic Framework의 차이가 무엇인지 알아보려고 합니다.

 

Framework

프레임워크는 공유 라이브러리와 헤더 및 다른 리소스의 하위 디렉토리를 포함하는 번들입니다.

프레임워크는 Dinaymic shared library, nib 파일, 다국어 문자열, 헤더 파일, 레퍼런스 문서와 같이 공유 리소스를 패키지로 캡슐화하는 계층 구조 파일 디렉토리 입니다.

리소스 사본은 프로세스 수에 상관없이 항상 물리적으로 메모리에 상주하며 리소스 공유로 메모리를 차지하는 공간을 줄이고 성능을 향상 시킵니다.

 

 

번들이라면 실행 가능한 프로그램이 아닐까.. 생각해보았습니다.

 

Static Framework

Static Framework는 Static linker를 통해 Static Library 코드가 어플리케이션 코드 내로 들어가 Heap 메모리에 상주합니다.

따라서 Static Library가 복사되므로 Static Framework를 여러 Framework에서 사용하게 되면 코드 중복이 발생하게 됩니다.

 

 

Dynamic Framework

Dynamic Framework는 동시에 여러 프레임워크 또는 프로그램에서 동일한 코드 사본을 공유하고 사용하기 때문에 메모리를 효율적으로 사용합니다. 동적으로 연결되어 있어 전체 빌드를 다시 하지 않아도 새로운 프레임워크 사용이 가능합니다.

 

 

 

Static Library? Dynamic Library? Static Linker? 😵‍💫

모르는 용어가 튀어나오니까 머리가 안 돌아가기 시작했습니다 🙈🙈🙈

라이브러리는 앱에서 가져다 사용할 수 있는 코드라는 것만 알겠는데 Static과 Dynamic Library는 무엇인지 차근차근 알아보겠습니다.

 

 

Library

Xcode target의 일부가 아닌 코드 및 데이터 조각을 정의하는 파일

 

Link

라이브러리와 앱의 소스코드 파일을 병합(merge)하는 프로세스

저는 단순히 그냥 가져다 사용하는 것인 줄 알았는데

링크를 통해서 파일을 병합하는 과정을 거쳐야 앱에서 사용할 수 있다는 사실을 알게 되었습니다.

 

라이브러리가 앱에 Link 되는 방식에 따라 Static Library, Dynamic Library 두가지의 카테고리로 나뉘게 된다고 합니다.

 

 

Static Linker

Linker의 역할은 소스파일과 라이브러리 파일을 받고 단일 파일로 결합해주는 역할을 합니다.

앱 실행 시 Compile → Link → Build → Run 과정에서 Link의 과정이 이 과정인 것 같습니다.

 

(근데 왜 Static Linker지..?)

  • static link: compile 된 소스파일들을 연결해서 최종 실행 가능한 파일을 만드는 것이다.
  • dynamic link: 프로그램 실행 도중, 프로그램 외부에 존재하는 코드를 찾아서 연결하는 것이다.

 

 

Static Library 

.a

 

우선 확장자가 .a로 되어 있으면 정적 라이브러리라고 합니다.

 

위에서의 링크 과정이 끝나면 앱의 소스코드와 Static Library 코드가 executabl file에 복사됩니다.

➡  앱이 실행되면 앱의 소스코드 + Static Library 코드가 앱의 주소 공간에 함께 로드됩니다.

 

Static Library 코드가 앱을 실행할 때 포함될 때의 단점은

 

1. 많은 Static Library  코드를 Link 하게 되면 실행파일이 커지게 됩니다. (느린 시작시간 + 큰 메모리 공간)

2. Static Library가 업데이트되면 클라이언트 앱은 개발자가 업데이트된 Library를 다시 Link 하지 않는 이상 업데이트된 기능을 사용할 수 없습니다.

 

▶  그래서 Static Library 코드는 복사되어 같이 로드되므로 실행 파일에 포함되지 않도록 하는 Dynamic Library을 보겠습니다.

 

Dynamic Library

.dylib

다이나믹 라이브러리의 확장자는 .dylib

Static Library와 동일하게 Link 과정을 거치고 나면! Dynamic Library의 참조만이 실행파일에 포함됩니다.

Link 과정이 완료되었지만 Dynaminc Library 코드가 실행파일에 포함되지 않았으니 크기가 Static에 비해 작다는 사실을 알 수 있습니다.

 

참조만 가지고 Library를 사용하는 방법은?

▶  Dynamic Library는 앱이 실행될 때 앱 주소 공간에 로드됩니다.

 

Dynamic Library는 앱이 실행될 때 로드되기 때문에 

Dynamic Library가 많을수록 앱의 Launch time 이 늘어난다고 합니다.

 

 

Static Library와 비교해보자면

Static Library Dynamic Library
큰 실행 파일 + 느린 시작시간 작은 실행 파일 + Dynamic Library 로드 시간 (느린 시작 시간)

 

공부하는 입장에서 현업에서는 어떤 게 더 좋을지 감이 오지는 않지만..

Dynamic Library는 다시 컴파일하지 않고도 Library가 업데이트되면 업데이트된 기능을 사용할 수 있기 때문에

업데이트가 자주 일어난다면 Dynamic Library로 만드는 게 좋지 않을까 라는 생각을.. 해보았습니다.

그렇지만 참조로 가져온다면 조금 더 느릴 수 있겠다는 생각도..

 

모든 iOS, macOS 시스템 라이브러리는 Dynamic이라고 합니다~

 

 

Static Framework, Dynamic Framework

마지막으로 처음에 보았던 Static Framework, Dynamic Framework의 차이점은?

➡  어떤 방식으로 Library를 사용할 것인지에 따라 달라진다고 알 수 있었습니다.

 

 

 

 

https://minsone.github.io/ios/mac/ios-framework-part-1-static-framework-dynamic-framework

 

[iOS][Xcode] Framework Part 1 : Static Framework와 Dynamic Framework

서론 Xcode에서는 Framework 라는 것을 통해 모듈화 단위의 코드 및 리소스를 사용할 수 있습니다. 그리고 외부 소스를 가져다 사용할 때 Cocoapods, Carthage 같은 도구를 사용하거나 혹은 직접 git submodule

minsone.github.io

 

https://zeddios.tistory.com/1308

 

(Static/Dynamic) Library

안녕하세요 :) Zedd입니다. ~ 애플 문서를 보던 중 ~ Overview of Dynamic Libraries Overview of Dynamic Libraries Two important factors that determine the performance of apps are their launch times and..

zeddios.tistory.com