Xcode의 프레임워크, 라이브러리 이해하기

2 분 소요

애플에서 제공하면서 Xcode 에서 생성할 수 있는 Framework(프레임워크)와 Package(패키지)는 코드와 리소스를 모듈화한 코드 모음이라고 볼 수 있습니다. 단일 프로젝트 내에서 폴더 단위로 코드를 분리하는 것 보다는 프레임워크, 패키지 단위로 분리하면 빌드 속도, 유지보수 및 재사용성에 이점이 있습니다.

먼저 애플 공식문서에 따르면 라이브러리의 사용 방식이 앱의 성능에 영향을 준다고 합니다.

  • 앱의 성능을 결정하는 두 가지 요소는 실행 시간과 메모리 사용량입니다.
  • 앱 실행 파일의 크기를 줄이고 실행 후 메모리 사용량을 최소화하면 앱 실행 속도가 빨라지고 실행 후 메모리 사용량이 줄어듭니다.
  • static library(정적 라이브러리) 대신 dynamic library(동적 라이브러리)를 사용하면 앱의 실행 파일 크기가 줄어듭니다.
  • 동적 라이브러리는 앱이 필요한 때만 라이브러리를 로드할 수 있습니다. 이 기능은 실행 시간 단축하고 효율적으로 메모리를 사용합니다.

정적 라이브러리와 동적 라이브러리의 차이

정적 라이브러리와 동적 라이브러리는 라이브러리를 메모리에 로드하는 방식에 차이가 있습니다. 정적 라이브러리는 컴파일 시점에 코드가 앱 실행 파일에 복사되며, 실행 시 전체 코드가 메모리에 로드됩니다. 장점은 실행 파일 자체에 라이브러리 코드가 있어 실행 속도가 빠릅니다. 단점은 실행 파일의 크기가 커지고 때문에 실행 시간이 늘어납니다.

동적 라이브러리를 사용하면 앱 실행 후 실제 필요한 시점에 코드를 로드합니다. 장점은 메모리 사용이 효율적이고 실행 파일의 크기가 상대적으로 작습니다. 단점은 런타임 시간에 라이브러리 코드를 로드하므로 실행 속도가 상대적으로 느립니다.

XCode 에서 생성한 프레임워크을 정적으로 할지, 동적으로 할지는 Build Settings -> Linking 내 Mach-O Type 옵션으로 정할 수 있습니다.

2023-06-03-Mach-O.png

  • Dynamic Library: 동적 라이브러리
  • Static Library: 정적 라이브러리

Xcode 에서 라이브러리 사용 옵션

Xcode 에서 라이브러리 사용(포함) 할 때 사용하는 옵션에 따라 앱 번들 내 생성 방식이 달라집니다.

2023-06-03-Framework-option.png

Do Not Embed 해당 옵션은 라이브러리가 앱 번들(앱 실행 파일과 리소스를 포함하고 있는 앱 디렉터리)에 포함되지 않도록 합니다. 앱 번들에 포함되지 않기 때문에 라이브러리를 시스템적으로 사용할 수 있는 상태여야 합니다. 이런 동작 방식으로 해당 옵션은 정적 라이브러리에서만 사용할 수 있습니다. 동적 라이브러리를 Do Not Embed 옵션으로 포함시키면 참조할 수 있는 방법이 없기 때문에 에러가 발생합니다.

Embed & Sign 해당 옵션은 라이브러리가 앱 번들에 포함됩니다. 앱 번들에 포함되기 때문에 정적 라이브러리와 동적 라이브러리 둘 다 사용할 수 있는 옵션입니다. 그런데 정적 라이브러리의 경우 앱 실행 파일에 코드가 복사되어 있기 때문에 앱 번들에 포함시키면 중복이 발생합니다. 굳이 필요한 상황이 아니라면 정적 라이브러리는 앱 번들에 포함시킬 필요는 없어보입니다.

다음은 정적 라이브러리, 동적 라이브러리, 라이브러리 포함 옵션에 따른 앱 번들 구조입니다.

정적 라이브러리를 Do Not Embed 로 포함했을 때

2023-06-03-App-Bundle-static-Do-Not-Embed.png

정적 라이브러리를 Embed & Sign 으로 포함했을 때

2023-06-03-App-Bundle-static-Embed-Sign.png

동적 라이브러리를 Embed & Sign 으로 포함했을 때

2023-06-03-App-Bundle-dynamic-Embed-Sign.png

참고 URL


Apple Dynamic Library Programming Topics

Apple Framework Programming Guide

Zedd0202 실험 Swift Package - Static / Dynamic 중 어떤 링크 방식을 사용할까

김종권 framework vs library, static framework, dynamic framework

김종권 Linking Mach-O Type 옵션

지마켓 iOS Framework 에서 다른 Framework 사용 시 Mach-O type 에 따른 주의사항

naljin 빌드 결과로 보는 Static Framework 와 Dynamic Framework

댓글남기기