Library vs Framework 정리
모듈화의 개념을 이해하기 전 기초 지식으로 정리.
Library란?
- 개발자가 만들 클래스들의 집합으로 다른 프로그램에서 사용할 수 있도록 제공
Framework란?
- 소프트웨어를 개발하는데 있어서 개발 시간을 줄이고, 코드의 재사용성을 증가시키기 위해 묶음이나 뼈대(틀)을 라이브러리 형태로 제공되는 것.
- 제어의 역전 개념이 적용된 대표적 기술
Library와 framework의 차이
- 라이브러리와 프레임워크의 차이는 제어 흐름의 주도성이 누구 / 어디에게 있는가가 포인트
- 즉, 애플리케이션의 흐름(Flow)를 누가 갖고 있느냐의 차이
프레임워크는 스스로 제어 흐름의 주도성을 갖는 반면, 라이브러리는 개발자가 가짐.
StaticLibrary / Dynamic Libarary / Megable Library
해당 부분을 이해하기 위해선 운영체제 지식이 선행되어야 함.
컴파일이란?
원시 코드를 컴퓨터가 이해할 수 있는 언어로 번역해주는 과정
- 전처리기(preprocessor): 소스코드의 주석제거, define을 치환하는 기능
- 컴파일러(compiler): 어셈블리 파일로 변환(어셈블리어는 CPU 명령어 조합으로 CPU에 의존적)
- 어셈블러(assembler): object 코드 파일로 변환. object 파일은 0과 1로 이루어진 바이너리 코드(아직 주소 정보가 확정되지 않음)
- 링커(linker): object 파일을 묶어 실행 코드 파일로 변환. 운영체제가 로딩할 수 있도록 주소 정보를 할당한 파일을 만들어 냄.(링커는 운영체제에 의존적)
이 과정을 모두 거치면 실행파일 생성.
링커는 링킹 과정을 거치는데, 이 과정에서 라이브러리가 앱에 링킹되는 방식에 따라 Static 또는 Dynamic으로 구분
Static Library
- 빌드 타임에 앱의 소스코드와 필요한 라이브러리들을 실행파일에 병합
- static library는 실행파일의 크기에 영향을 주어 앱 사이즈가 커질 수도 있음
Dynamic Library
- 앱 빌드 시 라이브러리의 reference(참조)를 실행파일에 포함.
- 런타임에 필요한 라이브러리를 로딩하여, 동적 라이브러리를 로딩시간에 영향을 줄 수 있음.
Mergable Library
- 동적 라이브러리를 사용할 경우 디버그 모드에서는 동적 라이브러리 처럼 동작
- 동적 라이브러리를 릴리즈 모드에서는 정적 라이브러리 처럼 동작
- 디버그 빌드에서 빌드 시간을 단축하면서도 릴리즈 빌드에서는 정적 링크를 사용하는 것과 유사한 앱 실행 시간을 얻기 위함.
해당 부분은 별도의 포스팅으로 정리할 예정.
Do Not Embed / Embed & Sign / Embed Without Signing
Xcode 프로젝트 설정에서 Do Not Embed, Embed & Sign, Embed Without Signing 옵션은 앱에서 사용하는 프레임워크의 포함 방식을 설정하는 데 사용.
Do Not Embed
- 이 옵션은 프레임워크를 앱 번들에 포함하지 않는다는 뜻. 즉, 앱이 실행될 때 프레임워크를 찾아서 로드하지 않으며, 이 설정은 일반적으로 시스템 프레임워크나 이미 시스템에 설치된 프레임워크에 대해 사용.
- 정적 라이브러리의 경우 이미 실행 파일에 필요한 라이브러리 코드가 존재하기 때문에, Frameworks 폴더에 라이브러리가 있을 필요가 없음. 번들을 라이브러리가 가질 경우에는 예외
Embed & Sign
- 이 옵션은 프레임워크를 앱 번들에 포함, 앱 서명 과정에서 해당 프레임워크도 함께 서명된다는 뜻
- 앱이 실행될 때 이 프레임워크는 포함된 상태로 로드되며, 이 옵션은 사용자 정의 프레임워크나 외부 프레임워크를 포함할 때 주로 사용되며, iOS 앱 배포 시 필수적인 설정
- 동적 라이브러리의 경우 Frameworks 경로에 코드를 포함시켜서 임베드 하지 않으면 크래시 발생
Embed Without Signing
- 이 옵션은 프레임워크를 앱 번들에 포함하되, 서명 과정에서 제외된다는 의미이며, 개발 과정에서는 이 옵션이 유용할 수 있지만, 배포를 위해서는 대부분의 경우 서명이 필요하므로 주의해서 사용.
- 주로 macOS 앱에서 서명이 필요 없는 경우에 사용.
이 옵션들은 앱의 빌드 및 실행 방식에 큰 영향을 미치므로, 사용하는 프레임워크와 앱 배포 전략에 따라 적절히 선택해야 함
xcframwork
여러 아키텍처를 동시에 지원할 수 있는 프레임워크 패키지. 빌드 옵션에 따라 정적 혹은 동적으로 만들 수 있음.
(참고)
https://sharonprogress.tistory.com/169
https://charles098.tistory.com/102
https://medium.com/@jc3wrld999/gcc-compiler-manual-a309c8f9d8f6
https://developer.apple.com/documentation/xcode/configuring-your-project-to-use-mergeable-libraries
'apple > Docs, iOS, Swift' 카테고리의 다른 글
[Swift] Timer + RunLoop, backgroundQueue (swift-corelibs-foundation) (3) | 2024.10.15 |
---|---|
[Swift] NSCache (swift-corelibs-foundation) (9) | 2024.10.11 |
Swift @TaskLocal (3) | 2024.08.28 |
Swift KeyPath 정리 (0) | 2024.08.28 |
SwiftUI .swipeActions not working (0) | 2024.08.28 |