일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 회고
- uikit
- 고차함수
- Switch
- NotificationCenter
- 화면전환
- PushNotification
- list
- singleton
- class
- SWIFT
- segue
- ScrollView
- escaping
- self
- calendar
- IOS
- SWIFTUI
- error
- Git
- 글또
- apns
- struct
- Refresh
- http
- array
- mvvm
- protocol
- Observer
- viewlifecycle
- Today
- Total
seong_hye, the developer
Swift) Library, Framework, Package에 대해 정리하기 본문
Swift 공부를 하다보면 나오는 Library, Framework. Package에 대해
좀 더 자세히 알아보려고 한다.
📁 한 줄 정리
모두 "코드를 재사용 가능하게 만든 단위"이지만 약간씩 의미와 사용방식이 다름
용어 | 한 줄 설명 |
Library | 함수/ 클래스를 모다운 재사용 가능한 코드 집합 |
Framework | 실행, 구조, 상호작용까지 포함된 큰 단위의 라이브러리 |
Package | 하나 이상의 라이브러리/모듈을 포함한 배포 가능한 단위 (SwiftPM 기준) |
📘Library (라이브러리)
특정 기능을 제공하는 코드 묶음, 개발자가 호출해서 사용
- 보통 함수나 클래스 집합
- 앱이 직접 라이브러리를 "사용자"로써 호출
🔹 핵심 특징
항목 | 설명 |
구성 | 함수, 클래스, 구조체, 프로토콜 등 |
재사용성 | 여러 앱에서 동일한 기능을 공유 |
수동 호출 | 앱이 라이브러리의 함수를 직접 "사용" |
역할 | 특정 기능에 집중 (ex. 네트워크, 이미지 처리, 암호화 등) |
독립성 | 자체 실행 안 됨, 앱에 의해 실행됨 |
🔹 Library 사용 방법 (ex. Alamofire)
1. CocoaPods를 통한 Library 다운
pod 'Alamofire'
2. Swift Package Manager (SPM)
File > Add Package Dependencies ...
https://github.com/Alamofire/Alamofire
🔹Library 종류
구분 | 설명 |
정적 라이브러리(.a) | 앱 빌드 시 코드에 통합됨 -> 실행파일 커짐, 로딩 빠름 |
동적 라이브러리(.dylib, .framework) | 런타임에 연결됨 -> 앱 크기 작아짐, 로딩 느릴 수 있음 |
➡️ Swift에서는 보통 .framework 형태로 많이 사용됨
🔹 Library 장점
장점 | 설명 |
빠른 개발 | 복잡한 기능을 손쉽게 사용 가능 |
검증된 코드 | 수많은 프로젝트에서 이미 사용 중 |
성능 향상 | 최적화된 알고리즘 내장 |
커뮤니티 지원 | 문서, GitHub Issue, StackOverflow 풍부 |
🔹 Library 사용 시 주의점
항목 | 체크 사항 |
중복 의존성 | 같은 라이브러리를 두 번 설치하지 않기 |
보안 | 오픈소스는 코드를 확인하고 쓸 것 |
업데이트 | 너무 자주 업데이트 시 버전 충돌 가능성 있음 |
테스트 | 앱과 충돌 여부를 항상 확인하기 |
📘Framework (프레임워크)
라이브러리를 포함하면서도 실행 환경, 구조, 진입점 등을 갖춘 더 큰 단위
앱의 전체 구조나 생명주기를 주도하거나, 더 많은 기능을 포함
🔍 라이브러리와 차이점
- 라이브러리 : 내가 불러서 쓰는 것
- 프레임워크 : 나를 불러서 구조를 짜주는 것도 포함
🔹핵심 특징
항목 | 설명 |
코드 재사용 단위 | 함수, 클래스, 뷰, 이미지, nib 파일 등 포함 가능 |
앱에 통합 가능 | 외부 프레임워크를 불러와 기능 확장 |
구조 포함 가능 | UIKit,SwiftUI처럼 앱 구조 전체를 이끌 수도 있음 |
버전 관리, 심볼 노출 | API 공개 범위 (public, internal) 제어 가능 |
배포 가능 | 다른 프로젝트에서 가져다 쓸 수 있는 .framework 파일로 존재 |
🔹Framework 예시
예시 | 설명 |
UIKit.framework | iOS 앱 UI를 구성하는 핵심 프레임 워크(View, ViewController 등 포함) |
Foundation.framework | 문자열, 날짜, 컬렉션 등 기본 타입을 제공 |
SwiftUI.framework | 선언형 UI 기반 프레임워크 |
Combine.framework | 리액티브 프로그래밍 기반 데이터 흐름 처리 |
🔹Framework 구조
MyFramework.framework/
├── Modules/
│ └── MyFramework.swiftmodule
├── Headers/
│ └── MyFramework-Swift.h (or .h files)
├── Info.plist
├── Resources/
│ └── Assets, .xib, .storyboard, .bundle
├── MyFramework (이진 파일)
➡️ macOS 또는 iOS 프로젝트의 .framework 번들이며, 앱이 통합될 수 있음
🔹Framework 종류
구분 | 설명 |
정적 프레임워크 | 앱 빌드 시 실행 파일에 통합됨 -> 실행 속도 빠름, 파일 크기 큼 |
동적 프레임워크 | 런타임에 로드됨 -> 앱 용량 작아짐, 로딩 느릴 수 있음 |
➡️ Swift에서는 정적 프레임워크를 많이 사용하고,
Apple이 제공하는 프레임워크는 대부분 동적 프레임워크가 사용됨
🔹사용하는 이유
이유 | 설명 |
기능 모듈화 | 코드 구조를 명확하게 분리할 수 있음 |
협업 | 팀원별로 프레임워크 단위 개발 가능 |
배포 | 기능을 다른 프로젝트나 외부에 제공 가능 |
재사용 | 여러 앱에서 동일한 기능 재사용 가능 |
🔹Framework vs Module
- 모듈(Module): Swift 컴파일러 기준의 독립적 코드 단위 (ex. import 대상)
- 프레임워크(Framework): 모듈 + 리소스 + 구조까지 포함된 물리적 배포 단위
📘Pakeage (패키지) - Swift Package Manager 기준
Swift에서 배포 가능한 코드 단위
하나 이상의 모듈, 라이브러리, 리소스를 묶어 재사용하고 배포할 수 있게 만든 단위
- Package.swift 파일로 정의
- Swift Package Manager (SPM)로 설치
🔹Swift Package의 주요 구성 요소
구성 요소 | 설명 |
Package.swift | 패키지의 설정/정의 파일 (필수) |
Targets | 실제 코드(소스 파일), 테스트, 리소스를 담는 단위 |
Products | 외부에서 사용할 수 있는 공개 라이브러리/실행파일 |
Dependencies | 다른 패키지(외부 라이브러리)를 의존성으로 추가 가능 |
🔍 Package.swift 예시
imprt PackageDescription
let package = Package(
name: "MyPackage",
platforms: [.iOS(.v13)],
products: [
.library(name: "MyLibrary", targets: ["MyLibrary"])
],
dependencies: [
.package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.6.0")
],
targets: [
.target(name:"MyLibrary", dependencies: ["Alamofire"]),
.testTarget(name: "MyLibraryTests", dependencies: ["MyLibrary"])
]
)
🔹용어 정리
용어 | 의미 |
Package | 패키지 전체(프로젝트 단위) |
Product | 외부에 제공할 수 있는 라이브러리나 실행 파일 |
Target | 실세 소스 코드가 들어 있는 논리 단위 |
Dependency | 이 패키지가 의존하는 다른 패키지들 |
Module | Swift에서 import하는 단위(보통 타겟 1개 = 모듈 1개) |
🔹Swift Package의 장점
장점 | 설명 |
설치 간편 | URL만 있으면 설치 가능 (버전 관리 포함) |
Xcode 통합 | Xcode에서 바로 설치, 관리 가능 |
Git 기반 | Git 저장소만 있으면 패키지화 가능 |
재사용 가능 | 여러 앱에서 동일 패키지를 공유 가능 |
의존성 관리 | 다른 패키지를 종속성으로 설정 가능 |
🔹구조
MyAwesomePackage/
├── Package.swift
├── Sources/
│ └── MyLibrary/
│ └── Math.swift
├── Tests/
│ └── MyLibraryTests/
│ └── MathTests.swift
🔹Swift Package vs CocoaPods vs Carthage
항목 | Swift Package | CocoaPods | Carthage |
Apple 공식 지원 | O | X | X |
Xcode 내장 | O | X (터미널 필요) | X |
Git 기반 설치 | O | O | O |
설정 파일 | Package.swift | Podfile | Cartfile |
복잡도 | 낮음 | 중간 | 높음 |
통합 방법 | Xcode에서 바로 가능 | .xcworkspace 필요 | 수동 통합 필요 |
📁 공통점
항목 | 설명 |
코드 재사용 | 한 번 만든 기능을 여러 프로젝트에서 재사용 가능 |
구성 요소 | 클래스, 구조체, 함수, 프로토콜 등 코드 포함 |
외부 의존성 | 다른 앱이나 모듈에서 가져다 쓸 수 있음 |
유지 보수 | 기능 수정 시 라이브러리만 교체 가능 |
문서화 | 보통 API 문서 또는 README와 함께 배포됨 |
📁 차이점
항목 | Library | Framework | Package |
정의 | 코드 기능 모음 | 구조, 리소스, 실행 환경 포함된 모듈 | 코드, 라이브러리, 리소르를 묶은 배포 단위 |
포함 요소 | 함수, 클래스 등 기능 단위 | 실행 흐름, 리소스, 심볼 등 포함 | 하나 이상의 라이브러리, 실행 파일 등 |
사용 목적 | 특정 기능을 재사용 | UI/플랫폼/기능을 제공하거나 구성 주도 | 다른 프로젝트에 코드 전달 |
예시 | Alamofire (네트워크 기능) | UIKit, SwiftUI, Combine | Alamofire 전체 패키지 (SPM 설치용) |
SwiftPM 지원 | 포함됨 | 일부만 가능 | 주체 |
배포 형식 | .swift, .a, .dylib | .framework | Package.swift |
Apple 공식 개념 | X | O | O (Swift Package Manager) |
📁 포함관계
Package
└── 포함 → Library or Executable
└── 포함 → Source files (.swift)
Framework
└── Library + 리소스 + 메타 정보 + API 노출 구조
- Library : "기능 묶음" ~> 특정 기능을 하는 도구 (ex. 드릴)
- Framework: "기능 + 구조+ 실행환경" ~> 드릴 + 배터리 + 설명서 +작동 구조까지 포함된 세트
- Package: 그 모든 걸 "묶어서 배포"하기 위한 포멧 ~> 도구를 담는 상자 (ex. 도구 + 설명서)
📁 상황별 용도 및 예시
기술 | Library | Framework | Package |
Alamofire | 네트워크 기능 | 내부적으로는 Swift 모듈 | GitHub에서 SPM으로 설치 |
SnapKit | 제약 조건 DSL | 내부 구현은 프레임워크 형식 | SPM/CocoaPods로 배포 |
UIKit | X | Apple이 제공하는 프레임워크 | X |
'IOS' 카테고리의 다른 글
Swift) StateObject, ObservableObject, EnvironmentObject (0) | 2022.11.02 |
---|---|
Swift) Error Code (0) | 2022.10.28 |
Swift) APNs 설정 방법 알아보기 (0) | 2022.10.23 |
Swift) APNs에 대해 알아보기 & 설정 방법 알아보기 (0) | 2022.10.23 |
Swift) 문법 정리 - @attribute (0) | 2022.10.22 |