들어가기 전
이전 학습시간에 우리는 Tuist를 학습하기 전 프로젝트를 구성하는 다양한 개념들을 알아봤다.
학습 내용 중 product의 여럭 case중 library와 framework , static과 dynamic이라는 키워드가 보인다.
한번 각 키워드가 의미하는 바가 무엇인지 알아보자.
library
정의
프로젝트에 사용할 Source 코드 또는 데이터의 집합 , 즉 이미지 같은 resource들은 포함될 수 없다.
종류
종류는 다음과 같이 2가지로 나뉜다. 나누는 기준이 뭘까?
링크되는 시점과 메모리 관리 방식 차이를 기준으로 나뉜다고 생각한다.
- static library
- 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가지 종류로 나뉜다.
- static framework
- 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 > Tuist' 카테고리의 다른 글
[부스트 캠프] Tuist와 불편한 동거 (1) | 2024.11.26 |
---|---|
Tuist 탬플릿 만들기 (1) Make File (0) | 2024.11.09 |
Tuist 구성 파일 (0) | 2024.11.03 |
프로젝트 생성 관련 사전 지식 (2) | 2024.11.02 |
Tuist란? (1) | 2024.11.02 |