-
SPM 패키지 만드는 법: iOS 앱 등으로 테스트가 실시간으로 가능하게공부/Swift(프로그래밍 언어) 2026. 8. 11. 22:25반응형
이번 포스트에서는 실시간으로 동작을 확인할 수 있는 iOS 데모 앱이 내장된 SPM 패키지를 만드는 방법을 단계별로 정리하겠습니다. 실제로도 기본적으로 Swift Package + iOS Demo App 구조를 권장합니다.
1. Swift Package 생성
방법 1: Xcode에서 직접 생성
- Xcode → File → New → Package... 선택
- Multiplatform → Library 선택
- 테스트를 포함할 경우 Testing System에서 선택, 없으면 None 선택
- 패키지 이름 입력 (예: MyFeatureKit) 및 저장 위치 선택

File > New > Package 선택 
Multiplatform → Library 선택 
테스트를 포함할 경우 Testing System에서 선택, 없으면 None 선택 생성되면 기본 구조는 다음과 같습니다.
MyFeatureKit/ ├─ Package.swift ├─ Sources/ │ └─ MyFeatureKit/ │ └─ MyFeatureKit.swift └─ Tests/ (선택한 경우만) └─ MyFeatureKitTests/2. iOS 지원 설정
기본 Package.swift에는 플랫폼 설정이 없을 수 있습니다. iOS 테스트를 위해 명시해주는 것이 좋습니다.
// swift-tools-version: 5.9 import PackageDescription let package = Package( name: "MyFeatureKit", // 👇 플랫폼 설정 platforms: [ .iOS(.v15) ], products: [ .library( name: "MyFeatureKit", targets: ["MyFeatureKit"] ) ], targets: [ .target( name: "MyFeatureKit" ), .testTarget( name: "MyFeatureKitTests", dependencies: ["MyFeatureKit"] ) ] )3. 실시간 테스트용 iOS 앱 만들기
SPM은 단독으로 실행할 수 없기 때문에 테스트용 Demo App을 같이 만드는 것이 좋습니다.
방법
- File → New → Project
- iOS App 선택
- SwiftUI 또는 UIKit 기반 생성
- [중요] 데모 프로젝트 앱의 위치를 Swift Package 폴더 내에 생성 (하단의 스크린샷 참조)
- 생성 후 File → Add Package Dependency
- 화면 하단의 Add Local... 버튼 선택
- 방금 만든 MyFeatureKit 폴더 선택

[중요] 데모 프로젝트 앱의 위치를 Swift Package 폴더 내에 생성 (하단의 스크린샷 참조) 
Add Package Dependency 선택 후 팝업 창 하단의 Add Local... 버튼 선택 
데모 앱에서 다음과 같은 에러가 나오는데 이를 해결하기 위해 원래 '패키지'의 창을 닫습니다. 데모 앱의 다음 영역에서 패키지 실시간 구현 및 수정이 가능하기 때문입니다.

원래 패키지 창을 닫았는데도 오류가 발생한 경우 데모 앱의 창도 같이 닫았다 데모 앱 창만 다시 엽니다.
프로젝트 창이 다음과 같이 나와야 합니다.

이제 앱에서 바로 import 가능합니다.
import MyFeatureKit4. 실시간 확인 구조 만들기
예시: SwiftUI View를 패키지에 넣기
패키지 내부를 다음과 같이 구현합니다. 패키지만으로는 단독으로 확인하기 힘든 SwiftUI View를 추가해 보겠습니다.
패키지의 Sources > MyFeatureKit 의 MyFeature.swift를 열고 다음 코드를 추가합니다.
import SwiftUI public struct MyFeatureView: View { public init() {} public var body: some View { Text("Hello from Package") .font(.largeTitle) } }데모 앱에서 다음처럼 실행해봅니다.
import SwiftUI import MyFeatureKit struct ContentView: View { var body: some View { MyFeatureView() } }이제 수정 → ⌘R → 바로 확인 가능합니다.

데모 앱의 Preview 실행 화면 결과 UI가 아닌 로직 패키지일 경우
View 없이 로직만 테스트하는 방법은 다음과 같습니다.
- Unit Test 활용
- 데모 앱 없이 단독으로 패키지를 개발하는 경우 단위 테스트 방법 등을 사용합니다.
- 또는 Demo App에서 버튼으로 호출
public struct Calculator { public init() {} public func add(_ a: Int, _ b: Int) -> Int { a + b } }앱에서
Button("Test") { print(Calculator().add(3, 5)) }[참고 1] 다른 실시간 테스트 방법
SwiftUI Preview 활용
패키지 내부에서도 Preview 가능:
#Preview { MyFeatureView() }단, 패키지가 iOS 플랫폼을 명시해야 정상 동작합니다.
Workspace 구조
MyWorkspace.xcworkspace ├─ MyFeatureKit (SPM) └─ MyFeatureDemoApp (iOS App)이렇게 하면
- 패키지 수정
- 앱에서 바로 반영
- Preview 가능
- 브레이크포인트 디버깅 가능
Swift 패키지에서 다른 패키지 디펜던시(의존성)를 추가하는 방법
Swift Package에서 다른 Swift Package를 의존성으로 추가하려면 Package.swift의 dependencies와 해당 타깃의 dependencies에 등록하면 됩니다.
예를 들어 MyPackage에서 Alamofire를 사용한다고 하면 Package(...)내부에 dependencies, targets 를 설정합니다.
// swift-tools-version: 5.9 import PackageDescription let package = Package( name: "MyPackage", // ... // // 👇 의존성 추가 dependencies: [ .package( url: "https://github.com/Alamofire/Alamofire.git", from: "5.9.0" ) ], targets: [ .target( name: "MyPackage", // 👇 targets 내에 dependencies 추가 dependencies: [ .product( name: "Alamofire", package: "Alamofire" ) ] ) ] )그리고 실제 Swift 패키지의 소스 파일에 import 합니다.
import Alamofire핵심 구조
dependencies에는 패키지 자체를 등록하고, target의 dependencies에는 그 패키지가 제공하는 product를 등록합니다.
즉, Package → Dependency Package → Product → Target 이라는 구조입니다.로컬 패키지를 불러오는 경우
같은 프로젝트 디렉터리에 다른 패키지가 있다면 상대 경로를 .package의 path에 추가합니다.
dependencies: [ .package(path: "../MyOtherPackage") // 로컬 패키지의 상대 경로 입력 ].target( name: "MyPackage", dependencies: [ .product( name: "MyOtherPackage", package: "MyOtherPackage" ) ] )728x90반응형'공부 > Swift(프로그래밍 언어)' 카테고리의 다른 글