iOS 프레임워크의 모든 것: Static Framework와 Dynamic Framework의 차이와 앱 빌드 전체 과정 정리
iOS 앱 개발을 하다 보면 "프레임워크"라는 단어를 자주 접하게 됩니다. 프레임워크는 개발자가 자주 사용하는 코드, UI, 리소스를 묶어둔 재사용 가능한 코드 꾸러미입니다. 이 프레임워크는 앱(App) 안에 붙여서 사용할 수 있으며, 붙이는 방식에 따라 Static Framework(정적 프레임워크) 또는 Dynamic Framework(동적 프레임워크)로 구분됩니다.
Static Framework(정적 프레임워크)란?
Static Framework는 앱을 빌드할 때 프레임워크의 코드와 리소스를 그대로 앱 안에 복사해서 넣는 방식입니다. 그 결과 앱은 하나의 덩어리 파일로 만들어지며, 실행 시 프레임워크의 존재는 따로 인식되지 않습니다.
비유로 이해하는 Static Framework
인스턴트 라면을 끓일 때, 스프를 같이 넣고 끓이는 것과 같습니다. 다 끓이고 나면 면과 스프가 하나로 합쳐져서 어떤 게 무엇이었는지 구분이 안 됩니다. 프레임워크와 앱이 완전히 합쳐지는 구조입니다.
Static Framework의 장점
- 구조가 간단하고 빌드가 빠릅니다.
- 외부 의존성이 적어 앱만 실행하면 됩니다.
Static Framework의 단점
.xib,.strings, 이미지 등의 리소스를 런타임에 접근하기 어렵습니다.- 앱 크기가 커질 수 있습니다.
- 번들(bundle) 개념이 존재하지 않기 때문에 외부 접근이 제한됩니다.
Dynamic Framework(동적 프레임워크)란?
Dynamic Framework는 앱 실행 시 외부 프레임워크 파일이 따로 로드되는 방식입니다. 이 경우 .framework 파일이 앱 번들 내에 따로 존재하고, 앱과 프레임워크는 독립적으로 존재합니다.
비유로 이해하는 Dynamic Framework
도시락 반찬통처럼 라면과 스프를 따로 담아서 필요할 때 꺼내먹는 구조입니다. 라면(앱)과 스프(프레임워크)는 분리되어 있으며, 실행 시 스프만 따로 로드해서 사용할 수 있습니다. 스프통은 하나의 번들로 존재합니다.
Dynamic Framework의 장점
- 리소스 접근이 자유롭습니다.
- 빌드 시간이 단축될 수 있습니다.
- 모듈화가 가능하고 런타임에서 관리가 수월합니다.
Dynamic Framework의 단점
- 설정이 다소 복잡합니다 (Embed & Sign 필요).
- 외부 의존성이 있을 경우 문제가 발생할 수 있습니다 (예: Firebase).
- 앱 실행 시 로딩 실패 시 런타임 오류가 발생할 수 있습니다.
프레임워크의 구조 비교
정리하자면, Static Framework는 하나의 앱 덩어리로 병합되는 방식이고, Dynamic Framework는 앱과 독립적으로 번들화되어 런타임에 로드되는 방식입니다. 프레임워크를 언제 어떤 방식으로 사용하는지가 앱의 구조, 크기, 유지보수성에 큰 영향을 미칩니다.
그렇다면 이번에는 빌드과정에 대해서 차례대로 알아보겠습니다.
iOS 앱 빌드 과정: 컴파일부터 실행까지
프레임워크를 포함한 앱을 실제로 빌드하면 어떤 과정이 진행될까요? 앱 개발자가 Xcode에서 "빌드" 버튼을 눌렀을 때부터, 앱이 시뮬레이터나 디바이스에서 실행되기까지의 과정을 단계별로 정리해 보았습니다. 이 전체 과정은 앱 최적화, 디버깅, 성능 향상에 중요한 실마리를 제공합니다.
1단계. Preprocessing (전처리)
#if,#import,#include등 매크로 조건을 해석하고, 주석을 제거하며 헤더 파일을 포함합니다.
2단계. Compilation (컴파일)
- Swift 또는 Objective-C 코드를
.o파일(중간 기계어)로 변환합니다. - 타입 검사, 문법 오류 탐지 등이 이 단계에서 이루어집니다.
3단계. Linking (링킹)
- 컴파일된 여러
.o파일과 외부 라이브러리를 결합하여 실행 가능한 바이너리를 생성합니다. - 이 과정에서 프레임워크와 정적/동적 라이브러리도 연결됩니다.
4단계. Resource Bundling (리소스 번들링)
.xib,.storyboard,.plist,.strings, 이미지 등 리소스를 앱 번들 내에 포함시킵니다.
5단계. Code Signing (코드 서명)
- 개발자 인증서로 앱을 서명하여 보안 검증을 수행합니다.
- 서명되지 않으면 실제 디바이스에서 앱이 실행되지 않습니다.
6단계. Packaging (패키징)
- 실행 파일, 리소스, 서명 정보, Info.plist 등을 하나의
.app으로 묶습니다. .app폴더가 최종 실행 가능한 앱이 됩니다.
7단계. Deployment (전송)
- 생성된
.app을 디바이스나 시뮬레이터로 전송합니다.
8단계. Launch & Runtime (실행 및 런타임 진입)
- iOS 런타임이 앱을 시작하고,
@UIApplicationMain을 통해AppDelegate→SceneDelegate순으로 앱 생명주기가 시작됩니다. - 런타임에서 리소스 로딩, 네트워크 연결, 뷰 렌더링 등 모든 동작이 수행됩니다.
정리하며
프레임워크는 iOS 개발에서 구조화와 재사용을 위한 중요한 수단입니다. Static Framework와 Dynamic Framework는 각각 장단점이 있으며, 앱의 규모나 구조, 필요한 유연성에 따라 적절하게 선택하는 것이 중요합니다. 또한, 프레임워크를 어떻게 구성하고 빌드하느냐에 따라 앱 실행 시 성능이나 안정성에도 큰 영향을 미칠 수 있습니다.
프레임워크, 프레임워크 구성, 프레임워크 사용, 프레임워크 선택, 프레임워크 로딩, 프레임워크 번들, 프레임워크 종류, 프레임워크 설정, 프레임워크 최적화 등의 키워드를 반복적으로 고려하면서 구조적인 아키텍처 설계를 시도해 보시기 바랍니다.