
iOS 개발을 하다 보면 반복적으로 사용하는 컴포넌트나 유틸리티가 생긴다. 이를 직접 라이브러리화해서 오픈 소스로 공개하면, 다른 개발자들과 지식을 나누고 함께 발전시킬 수 있다. Swift Package Manager(SPM)를 통해 간편하게 배포할 수도 있어, 점점 더 많은 개발자가 애용하는 방식이다. 이번 글에선 Swift 패키지를 생성하고, GitHub에 올려 오픈 소스로 관리하면서, SPM을 통해 배포하는 전 과정을 자세하고 쉽게 정리해본다.
먼저 라이브러리를 어떤 목적과 기능으로 제작할지 구상한다. 예를 들어, 자주 사용하는 Custom View나 Utility 코드를 오픈 소스로 만들기로 결정했다고 가정한다. 이후 Xcode 메뉴를 통해 Swift 패키지를 생성할 준비를 한다.
패키지가 생성 되면 아래와 같은 폴더 구조를 가지게 된다.
MySwiftLibrary/
├─ Sources/
│ └─ MySwiftLibrary/
│ └─ MyFeature.swift
└─ Tests/
└─ MySwiftLibraryTests/
└─ MyFeatureTests.swift
터미널에서 swift package init --type library 명령어를 사용하지 않고, Xcode 메뉴를 통해 Swift 패키지를 만드는 과정을 살펴본다.
File > New로 이동한다. New 서브 메뉴에서 Package...를 선택한다.
다음으로 Choose a template for your new package 창이 뜬다.
Library 템플릿을 선택하고 Next 버튼을 누른다.
Create를 누르면 Swift Package 초기화가 완료된다.이 과정을 마치면, Package.swift를 포함해 기본 폴더 구조가 자동으로 생성된다. 이제 Sources 폴더와 Tests 폴더를 활용해 라이브러리를 구성할 수 있다.
라이브러리의 핵심 기능을 작성한다. 예를 들어, Sources/MySwiftLibrary 폴더 내부에 OneThingPerPageView.swift와 같은 Swift 파일을 만들어 원하는 코드를 작성한다. 간단한 예시로, 아래와 같은 코드가 있다고 가정한다.
import SwiftUI
public struct OneThingPerPageView: View {
private let title: String
private let subTitle: String
public init(title: String, subTitle: String) {
self.title = title
self.subTitle = subTitle
}
public var body: some View {
VStack {
Text(title)
.font(.largeTitle)
.padding()
Text(subTitle)
.font(.subheadline)
}
}
}
위 코드는 제목과 서브타이틀을 표시해주는 간단한 SwiftUI View다. 공개(public) 접근 제어자를 사용해야 다른 프로젝트에서 사용할 수 있다.
오픈 소스로 공개하기 전, 기본적인 유닛 테스트 코드를 작성해두면 여러 가지 이점이 있다. 버그를 조기에 발견할 수 있고, 다른 개발자도 라이브러리의 동작 방식을 테스트 코드로 파악할 수 있기 때문이다.
Tests/MySwiftLibraryTests 폴더 내부에 테스트 코드를 작성한다.
import XCTest
@testable import MySwiftLibrary
final class MyFeatureTests: XCTestCase {
func testExample() throws {
// 주어진 View나 함수가 올바르게 동작하는지 간단히 테스트한다
let expectedTitle = "Hello"
let expectedSubTitle = "World"
let view = OneThingPerPageView(title: expectedTitle, subTitle: expectedSubTitle)
// SwiftUI View 자체를 테스트할 때는 스냅샷 테스트 등을 사용하기도 한다
// 이 예시에서는 단순히 속성 확인 혹은 실제 로직 테스트를 한다
}
}
간단한 테스트라도 작성해두면 협업 시 큰 도움이 된다.
MySwiftLibrary라는 이름으로 생성한다고 가정한다. Source Control 설정을 통해 Git 초기화를 해도 된다.)터미널을 사용한다면 아래와 같은 명령어를 입력할 수 있다.
git init
git remote add origin https://github.com/사용자명/MySwiftLibrary.git
git add .
git commit -m "Initial commit"
git push -u origin main
이제 GitHub에서 Package.swift 파일과 소스 코드들을 확인할 수 있다.
오픈 소스 프로젝트에서 README.md 파일은 매우 중요하다. 이 라이브러리를 어떻게 사용하고 설치하는지, 어떤 기능이 있는지, 간단한 예시가 무엇인지 등을 작성해두면 다른 개발자들이 이해하기 쉽다.
또한, 라이선스(License) 파일을 명시해서 사용 범위를 명확히 해야 한다. 많이 쓰이는 MIT License 같은 것을 활용하면 유연하게 오픈 소스를 배포할 수 있다.
Swift Package Manager로 간편하게 이용하려면 태그(Tag)와 릴리스(Release)를 지정해야 한다. 예를 들어, 첫 번째 공식 버전을 1.0.0으로 지정하려면 아래와 같이 진행한다.
git tag 1.0.0
git push origin 1.0.0
이렇게 하면 GitHub 저장소에 1.0.0 태그가 등록된다. GitHub에서 Releases 메뉴로 이동해 새로운 릴리스를 생성하고, 릴리스 노트를 작성해 공식 배포할 수 있다.
이제 다른 프로젝트에서 아래와 같이 Package.swift 혹은 Xcode의 Package Dependencies를 통해 이 라이브러리를 불러올 수 있다. 예를 들어, Xcode를 사용 중이면 다음 과정을 거친다.
https://github.com/사용자명/MySwiftLibrary)를 입력한다. 1.0.0)하고 추가한다.또는, Package.swift 파일에 직접 의존성을 추가하려면 아래와 같이 작성한다.
dependencies: [
.package(url: "https://github.com/사용자명/MySwiftLibrary.git", from: "1.0.0")
]
다른 SwiftUI 프로젝트에서 라이브러리를 설치했다면, 간단히 import MySwiftLibrary를 통해 라이브러리를 사용할 수 있다.
import SwiftUI
import MySwiftLibrary
struct ContentView: View {
var body: some View {
OneThingPerPageView(title: "Hello", subTitle: "World")
}
}
빌드가 성공적으로 완료되면, 프로젝트 내에서 라이브러리가 제공하는 모든 컴포넌트와 함수들을 활용할 수 있다.
1.0.1, 1.0.2 등으로 태깅한다.2.0.0 등의 Major 버전을 선언한다.이상으로 Xcode 메뉴를 활용해 Swift 패키지를 생성하고, GitHub에 오픈 소스로 공개한 뒤, Swift Package Manager를 통해 배포하는 전 과정을 살펴보았다.
라이브러리를 오픈 소스로 공개하면, 코드의 가시성과 활용도가 높아지는 장점이 있다. 다른 개발자들의 피드백을 받아 더 나은 품질로 발전시켜 나갈 수 있다. 이번 기회를 통해 본인이 가진 노하우나 자주 쓰는 컴포넌트를 오픈 소스로 만들어 보는 것을 권장한다.
위 예시는 SwiftUI로 구현된 커스텀 뷰와 Alert, ButtonStyle 등이 포함되어 있다.
궁금한 점이나 개선사항이 있다면 언제든지 이슈 혹은 PR로 소통할 수 있다.