호댕의 iOS 개발

[iOS] 프레임워크(UIKit, Foundation 등)와 라이브러리, Static Framework와 Dynamic Framework 본문

Software Engineering/iOS

[iOS] 프레임워크(UIKit, Foundation 등)와 라이브러리, Static Framework와 Dynamic Framework

호르댕댕댕 2022. 5. 5. 14:59

 

일단 라이브러리와 프레임워크는 개발을 하면서 반드시 사용해본 개념일 것이다. 최소한 프레임워크는 누구든 사용해봤을 것이다. 

그렇다면 라이브러리와 프레임워크는 무엇일까? 

 

🆚 라이브러리와 프레임워크

프레임워크

프레임워크는 Playgrounds 파일을 새롭게 생성하거나, 프로젝트를 생성하기만 해도 볼 수 있다. 

Xcode를 다뤄봤다면 무조건 봤을 UIKit이나 Foundation이 바로 프레임워크이다. 

 

프레임워크는 앱을 구현하기 위해 필수적인 것들이다. 즉, 레고를 예로 들자면 다양한 크기의 레고 블록인 것이다. 

우리는 이런 레고 블록이 없다면 아예 레고를 만들 수 없을 것이다. 직접 플라스틱을 녹여 만들지 않는 한 말이다. 

 

프레임워크의 경우도 앱을 만들기 위해선 반드시 import를 해서 해당 프레임워크를 기반으로 만들어야 한다. 

 

라이브러리

라이브러리는 이런 프레임워크를 기반으로 특정 기능을 좀 더 만들기 쉽도록 반복적이고 재사용되는 것들을 모듈화해놓은 것이다. 따라서 앱을 만드는데 필수적으로 사용되는 것은 아니며, 조금 더 사용하기 쉽도록 사용하는 것이다. 

Alamofire나 Moya같은 라이브러리를 사용하지 않더라도 기본적으로 URLSession을 사용해서 네트워킹을 처리할 수 있는 것이다. 

 

1️⃣ UIKit

일단 대표적인 프레임워크로 UIKit에 대해 조금 더 자세히 알아보자. 

 

UIKit은 iOS 앱을 만들고, UI를 구성하는데 필수적으로 사용되는 프레임워크이다. iOS 13부터는 SwiftUI를 통해 UI를 구현할 수도 있지만, SwiftUI도 UIKit을 import하고 있는 것을 볼 수 있다. 

SwiftUI의 import 목록

즉, iOS에서 UI를 구성할 때 필수적인 프레임워크는 UIKit인 것이다.

 

이러한 UIKit의 계층구조를 보자면 가장 상단의 Superclass로 NSObject가 있고 그 하단에 UIResponder가 있으며 이를 UIView, UIApplication, UIViewController가 상속받고 있는 형태로 구현이 되어 있다. 또 UIView를 상속받아 UIControl, UILabel, UIImageView 등이 존재한다. 

이미지 출처: informit

UIKit의 경우 반드시 메인 스레드에서 사용이 되어야 한다. 

뷰의 드로잉 사이클이 메인스레드의 메인 런루프에서 처리되기 때문이다. 

 

그렇다면 왜 메인스레드의 메인 런루프에서 UIKit 코드를 처리하도록 구현한 것일까?

만약 UIKit이 멀티 스레드 환경에서 처리됐다면, 스레드 안전성을 보장하기 위해 스레드 블락이 필요했을 것이고 이는 전체적인 성능 저하를 야기할 수 있다. 또한 UIKit 같은 프레임워크를 스레드 세이프하게 설계하는 것도 현실적으로 어렵기 때문에 메인 스레드에서만 처리하도록 구현이 된 것이 아닐까 생각한다.

 

2️⃣ Foundation

Foundation은 문자열 처리, 날짜 처리, 런 루프, GCD,  쓰레드, 네트워킹 등과 관련된 기능을 제공하게 된다.

Foundation에 정의된 클래스, 프로토콜, 데이터 타입 등은 MacOS, iOS, tvOS, watchOS 전체에서 다양하게 사용된다. 즉, 스위프트로 개발을 하기 위해 필수적인 기능을 제공하는 프레임워크라고 볼 수 있다.

 

여기에는 NSArray, NSString, NSDate 등 Objective-C와 관련된 클래스와 함께 다양한 클래스들이 존재하고 있다. 

 

  • Fundamental
    • 컬렉션, Int / String 같은 기본 타입, Data Formatting, 날짜, Sorting과 Filter 등
  • AppSupport
    • Notification, Error처리, Bundle, GCD 등
  • Files and DataPersistence
    • FileSystem, iCloud 등
  • Networking
    • URLSession 등
  • Low-Level Utilities
    • XPC(프로세서간 상호 소통을 안전하게 관리), Run loop

이런 Foundation은 CoreServices Layer에 위치하고 있다. 

 

iOS는 크게 5개의 계층 프레임워크들로 나눠서 볼 수 있다. 

전부 그런 구조로 되어 있는 것은 아니지만 대체로 위에 있는 프레임워크 계층들이 아래 있는 프레임워크에 의존하고 있으며 가장 하단에 있는 것들이 가장 기본적인 프레임워크였다. 

 

 

🆚 Dynamic Framework와 Static Framework

Static Framework의 경우 컴파일 시 Static Linker에 의해 앱의 실행 파일에 프레임워크가 복사되어 적용이 된다.

  • Static Framework가 많아질 수록 빌드에 걸리는 시간이 많아지게 됨.
  • 실행 파일 자체도 사용되는 곳이 많아지면 커지게 됨.
  • 컴파일 시 복사되어 적용이 되기 때문에, 컴파일을 다시 하지 않는 이상 파일에 대한 수정을 할 수 없음. 
    (새로운 프레임워크를 추가할 때에도 다시 빌드를 해줘야 함)
  • Heap 메모리에 상주하게 됨.

 

이에 반해 Dynamic Framework의 경우 기본적으로 파일 외부에 분리된 형태로 존재하게 된다. Xcode를 통해 Framework를 만들면 기본적으로 Dynameic Framework로 생성된다. 

  • 런타임에는 Static Framework보다 속도가 느림
  • 빌드 시간의 경우 Static Framework보다 빠름
  • 파일이 외부에 있기 때문에 만약 Dynamic Framework 파일이 손상되면 실행 파일이 더 이상 작동할 수 없음
  • 다시 빌드하지 않아도 새로운 프레임워크 사용 가능

 

📖 참고 자료

https://velog.io/@rnfxl92/%EC%99%9C-UI%EB%8A%94-Main-Queue%EC%97%90%EC%84%9C-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-%ED%95%B4%EC%95%BC-%ED%95%A0%EA%B9%8C

 

왜 UI는 Main Queue에서 업데이트 해야 할까?

UIKit이 Thread Safe하지 않는 이유에서부터 시작합니다. UIKit과 같이 매우 큰 프레임워크의 모든 속성을 Thread Safe하게 설계하는 것은 비현실적입니다. Serial Queue에서 처리함으로써 Thread Safe하지 않음

velog.io

https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Cocoa.html

 

Cocoa (Touch)

Retired Document Important: This document may not represent best practices for current development. Links to downloads and other resources may no longer be valid. Cocoa (Touch) Cocoa and Cocoa Touch are the application development environments for OS X and

developer.apple.com

https://medium.com/@StueyGK/static-libraries-vs-dynamic-libraries-af78f0b5f1e4

 

Static Libraries vs. Dynamic Libraries

Functions are blocks of code that are reusable throughout a program. Using them saves time, removing the need to rewrite code multiple…

medium.com

 

Comments