공부한 것을 정리하는 용도의 글이므로 100% 정확하지 않을 수 있습니다.
참고용으로만 봐주시고, 내용이 부족하다고 느끼신다면 다른 글도 보시는 것이 좋습니다.
+ 틀린 부분, 수정해야 할 부분은 언제든지 피드백 주세요. 😊
by. Oxong
이 글은 애플 공식 문서를 기반으로 레퍼런스들을 참조하여 정리한 글입니다.
레퍼런스는 가장 아래쪽에 정리해두었습니다.
애플 공식문서에는 Framework를 아래 처럼 정의하고 있다.
A framework is a hierarchical directory that encapsulates shared resources, such as a dynamic shared library, nib files, image files, localized strings, header files, and reference documentation in a single package.
framework란 dynamic shared library, nib 파일, 이미지 파일, localized strings, 헤더 파일, 레퍼런스 문서와 같은 공유 리소스들을 패키지로 캡슐화 하는 계층 구조의 파일 디렉토리를 말한다.
◆ Bundle이란?
하위 디렉토리를 가지고있는 디렉토리. (Framework도 bundle의 한 종류)
즉, iOS에서 Bundle은 이미지, Xib, 코드와 같은 파일을 한 공간에 묶는 파일시스템에 있는 디렉토리이다.
또한, 시스템에서 Bundle을 하나의 파일로 취급하기에 내부 구조를 몰라도 내부 데이터에 액세스 가능하다.
Dynamic framework와 Static Framework의 차이점은 대상 응용프로그램에서 컴파일된 코드를 참조하는 방식이 다르다는 것이다.
Dynamic ⇒ 런타임 상에서 Mach-O 파일과 연결 (참조)
☞ ibrary에 대한 참조만 포함
Static ⇒ 앱이 사용하는 프레임워크의 코드는 컴파일 시간동안 ‘Static Linker’에 의해 앱의 실행파일 안에 복사
☞ library 코드가 모두 포함
Dynamic Framework는 동시에 여러 프레임워크 또는 응용 프로그램 실행 파일에서 동일한 코드 사본을 공유하고 사용을 하므로, 메모리를 효율적으로 사용한다.
동적으로 연결되어 있으므로 전체 빌드를 다시 하지 않아도 새로운 프레임워크 사용이 가능하다.
Static Linker을 통해 Dynamic Library Reference가 응용 프로그램 실행 파일(어플리케이션 코드)에 들어가고 모듈 호출시 Stack에 있는 Library에 접근하여 사용한다.
※ 위 그림의 첫번째 단계인 Static Linker가 수행하는 라이브러리와 앱의 소스코드 파일을 병합(merge)하는 프로세스를 "Link"라고 하는데 Linker는 excutable file을 생성한다.
◆ excutable file이란?
실행파일(Executable File)이란 단순히 데이터만 담고 있는 파일이 아닌, 명령에 따라 지시된 작업을 수행하도록 하는 파일을 의미한다.
프로그램을 만들 수 있는 소스 파일을 컴파일러나 어셈블러 등을 이용하여 실행 파일로 변환이 이루어진다.
운영 체제는 파일 확장자로 실행 파일을 구분하거나, 메타데이터를 통해 파일을 인식한다.
Static Framework는 Static Linker를 통해 Static Library 코드가 어플리케이션 코드 내로 들어가 Heap 메모리에 저장한다.
Dynamic Framework과 달리 Reference가 아닌 Static Library 자체가 복사되므로, Static Framework를 여러 Framework에서 사용하게 되면 코드 중복이 발생하게 된다.
Static Framework가 많아질수록 큰 excutable file이 만들어지고, 새버전이 나오면 또 다시 컴파일해서 link해줘야 한다.
Library는 Framework가 아니라 Static Library가 복사된 곳 위치하므로, Bundle의 위치는 Static Framework가 아닌 Static Library가 위치해 있는 곳에 있다.
그렇기 때문에 번들에 접근할 때는 스스로가 접근하는 것 보단 외부에서 Bundle의 위치를 주입받는 것이 좋다.
프레임워크 메인 앱으로 드래그 및 추가
메인 앱 Frameworks, Libraries , and Embedded Content 프레임워크 추가
Frameworks, Libraries, and Embedded Content에 프레임워크 추가하면,
자동적으로 메인 앱 Build Phases → Link Binary With Libraries → 프레임워크 추가되고,
메인 앱 Build Phases → Embed Frameworks → 프레임워크 추가된다.
메인 앱 Build Phases → Link Binary With Libraries → 프레임워크 추가 되었는지 확인
메인 앱 Build Phases → Embed Frameworks → 프레임워크 추가 되었는지 확인
※ Frameworks, Libraries, and Embedded Content를 하지않는다면?
동적 프레임워크는 빌드가 되면 동적 프레임워크에서 필요한 코드의 참조만을 응용 프로그램 실행 파일에 담는다.
참조를 담았는데 막상 응용 프로그램 실행 파일가 실행될때 참조를 따라가보니 프레임워크가 없어서 실행이 불가능한 것이다.
▶ 명시적 종속성 필요
정적 프레임워크는 참조를 담는게 아니고 라이브러리 자체 필요한 코드를 담는다.
그래서 프레임워크를 또 추가하게 되면 중복이 일어나 에러가 발생한다.
프레임워크 메인 앱으로 드래그 및 추가
프레임워크 Build Settings → Mach-O Type → Static Library 로 변경
메인 앱 Build Phases → Dependencies → 프레임워크 추가
※ 정적 프레임워크는 Frameworks,Libraries, and Embedded Content를 하면 안된다.
코드가 이미 최종 바이너리(응용 프로그램 실행 파일) 에 병합되어 있기 때문에 정적 프레임워크를 포함하는 것은 잘못된 것이다.
▶ 암시적 종속성 필요