seong_hye, the developer

Swift) Library, Framework, Package에 대해 정리하기 본문

IOS

Swift) Library, Framework, Package에 대해 정리하기

seong_hye 2022. 10. 24.

 

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

 


 

Comments