iOS/Tuist

Framework vs Library

Hamp 2024. 11. 3. 14:47
반응형

들어가기 전

이전 학습시간에 우리는 Tuist를 학습하기 전 프로젝트를 구성하는 다양한 개념들을 알아봤다.

 

학습 내용 중 product의 여럭 case중 library와 framework , static과 dynamic이라는 키워드가 보인다.

한번 각 키워드가 의미하는 바가 무엇인지 알아보자.


library

정의

프로젝트에 사용할 Source 코드 또는 데이터의 집합 , 즉 이미지 같은 resource들은 포함될 수 없다.

종류

종류는 다음과 같이 2가지로 나뉜다.  나누는 기준이 뭘까?

링크되는 시점과 메모리 관리 방식 차이를 기준으로 나뉜다고 생각한다.

  1. static library 
  2. dynamic library 

한번 자세히 하니씩 알아보자.

 

1. static library

  • 컴파일 시 static linker를 통해 사용되는 소스  파일을 Excute File에 복사하여 사용
  • .a 파일 형식
  • 사용될 타겟의 cpu 아키텍쳐와 같게 빌드 되야함, x86-64, arm64 등
  • 전체 코드를 복사하기 때문에 몸집이 커지고, 시작 시간이 느림
  • 앱 실행 시 코드가 이미 올라와있으므로 실행 시간은 빠름

2. dynamic library

  • 필요한 시점에 동적으로 로드, linker는 reference만 갖고 있음 
  • .dylib파일 형식
  • 필요할 때 동적으로 사용하므로 실행시간이 느림
  • 전체 코드를 복사하지 않고 referene만 갖고 있으므로 크기가 작고, 시작 시간이 빠름

framework

정의

library와 함께 resource들을 하나의 bundle로 묶어 놓은 구조

종류

프레임워크 역시 2가지 종류로 나뉜다.

  1. static framework
  2. dynamic framework

 

1. static framework

 

  • Source File + Static Library + Static Linker로 구성되어 있다.
  • Static Linker 통해 Static Library 코드가 Execute file(= appliccation file) 내로 들어가 Heap 메모리에 상주
  • static 키워드가 붙어있기 때문에 컴파일 시 framework의 전체코드가 Excute File에 복사된다.

조금 더 자세히 알아보기위해 날진님 블로그 글을 살펴보자.

 

 

위 그림을 보면 static framework는 이미 컴파일 시점에 NaljinApp에 다 올라가 있다.

그런데 Frameworks쪽에도 static library가 있는 것을보면 불필요한 중복된 구조다.

 

이 때 우리가 무의식적으로 사용한 Embed  옵션 중 Do Not Embed를 이용하면 다음과 같이
프레임워크를 컴파일 시 별도로 생성하지 않는다.

 

 

 

2. dynamic framework

  • Source File + Dynamic Library References + Dynamic Library + Static Linker
  • 파일 아닌 주소 execute file 저장하고, Static Linker 통해서 Stack으로 필요한 라이브러리들을 불러와서 사용하는 형태
  • 주소 정보들은 Heap
  • Embed 옵션을 Embed & Sign으로 설정해줘야한다.

여기서 Embed & Sign을 사용해야하는 이유 알아보자..

 

마찬가지로 날진님 예시를 살펴보면 

 

위에서 사용한 정적프레임워크를 동적으로 바꾸고 실행파일에 어떻게 참조되어 있는지 살펴보니

@rpath/MyFramework.framework/MyFrameWork

 

형태로 참조되어 있는데 @rpath가 뭘까?

 

여기서 @rpath  Runpath Search Path 지칭하는 환경 변수로, Xcode 에서는 기본적으로 
@executable_path/Frameworks  설정되어있다.

 

마찬가지로 @executeable_path 변수는  프로세스의 메인 실행파일을 포함하고 있는 디렉터리 경로를 뜻하므로

앱 excute file을 포함한 최상위 디렉토리라고 생각된다.

 

그렇다면 다음과 같은 구조로 볼 수 있다.

 

  • @executable_path =  최상단
  • @rpath = @executable_path/Frameworks = 최상단/Frameworks 
  • @rpath/MyFramework.framework/MyFrameWork = 최상단/Frameworks.framework/MyFrameWork

여기서 정적 프레임워크에서 했던 것처럼 Embed 옵션을 Do Not Embed을 할 경우
@rpath 부분이 전부 사라지는 걸 우리는 확인했다.

 

dynamic framework는 컴파일 시 오브젝타 파일이 execute file에 올라와있지 않기 때문에 @rpath부분이 없으면 
정확한 오브젝트 파일을 찾을 수 없기 때문에 dynamic framework를 사용할 때는 반드시 Embed & Sign을 사용해야한다.

 


static vs dynamic

  링크 시점 메모리 관리 시작 속도 실행 속도 크기
static 컴파일  앱 시작 시 전체 로드
실행 중 따로 로드 없음
전체 코드 로드
앱 시작 시간 느림
앱 시작 시 이미 로드
실행 속도 빠름
전체 코드 로드
크기 커짐
dynamic 런타임 필요할 때 로드
메모리 최적화
필요할 때 로드
앱 시작 시간 빠름 
필요할 때 마다 로드
실행 속도 느림
래퍼런스 참조
크기 작음

 


참고

 

 

iOS Library, Framework, Swift Package,,, 알아보자 차이점

멀티 모듈 코드베이스의 시대

medium.com

 

 

[iOS] 빌드 결과로 보는 Static Framework 와 Dynamic Framework

이번에는 이해할 수 있을까요? 🤔

sujinnaljin.medium.com

 

반응형