ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SPM 라이브러리 생성부터 GitHub 배포까지
    Swift 2025. 7. 30. 23:18

    안녕하세요 :) 🧀

    이번 포스팅에서는 Swift Package Manager(SPM)를 활용해 직접 만든 패키지를 GitHub에 배포하고,

    Xcode 프로젝트에서 의존성으로 추가하여 사용하는 방법을 알아보겠습니다.

     

    평소에 Kingfisher나 Alamofire 같은 라이브러리를 사용하면서

    "이 라이브러리들은 어떻게 만들어지고 배포될까?" 궁금하기도 했었는데요

    이번 기회에 차근차근 알아보겠습니다.


    1. 로컬 Swift 패키지 생성

    먼저 터미널을 열고 원하는 디렉터리로 이동한 뒤, 아래의 명령어로 패키지를 생성합니다.

    swift package init

     

    생성이 잘 되었다면 파일 구조는 아래와 같습니다.

    • Package.swift
    • Sources/패키지명
    • Tests/패키지명Tests

    2. 패키지 코드 작성

    Sources/패키지명/ 경로에 원하는 Swift 코드를 작성합니다.

    이번 예제는 정말 간단하게 국가와 수도를 딕셔너리로 선언하고, 국가 이름을 입력받아 수도를 반환하는 간단한

    메서드를 구현해 보았습니다.

    public struct CountryCapitalKit {
      private static let mapping: [String: String] = [
        "대한민국": "서울",
        "미국": "워싱턴 D.C.",
        "일본": "도쿄",
        "중국": "베이징",
        "영국": "런던",
        "프랑스": "파리",
        "독일": "베를린",
        "이탈리아": "로마",
        "스페인": "마드리드",
        "러시아": "모스크바",
        "캐나다": "오타와",
        "호주": "캔버라",
        "인도": "뉴델리",
        "브라질": "브라질리아",
        "멕시코": "멕시코시티",
        "남아프리카공화국": "프리토리아",
        "아르헨티나": "부에노스아이레스",
        "네덜란드": "암스테르담",
        "스웨덴": "스톡홀름",
        "스위스": "베른"
      ]
      
      /// 입력한 국가 이름에 대응하는 수도를 반환합니다.
      /// - Parameter country: 국가 이름(한국어) 예: "대한민국"
      /// - Returns: 수도 이름 예: "서울", 없으면 nil
      public static func getCapital(of country: String) -> String? {
        return mapping[country]
      }
    }

    3. Git 레파지토리 초기화 및 커밋

    작성한 패키지를 Git으로 관리하기 위해 레파지토리를 초기화하고, 모든 파일을 스테이징 한 뒤 커밋합니다.

    저는 터미널로 했지만 사용하시는 툴들로 진행하셔도 문제없습니다!

    git init
    git add .
    git commit -m "Initial commit: Add CountryCapitalKit"

    4. GitHub 원격 레파지토리 생성 및 푸시

    GitHub에서 새 레파지토리를 Public으로 생성하고, 로컬 레파지토리를 연결한 뒤

    master 브랜치로 푸시합니다.

    git remote add origin https://github.com/rakoonwc8561/CountryCapitalKit.git
    git push -u origin master
    GitHub의 기본 브랜치가 master가 아닌 main으로 설정된 경우
    아래와 같이 브랜치 이름을 변경하여 푸시할 수 있습니다.
    git remote add origin https://github.com/사용자명/CountryCapitalKit.git
    git branch -M main
    git push -u origin main

    5. 태그 생성 및 GitHub Release

    명확한 버전 관리를 위해 Git 태그를 추가하고, GitHub Release 기능을 통해 배포를 진행합니다.

    git tag v1.0.0
    git push origin v1.0.0

     

    푸시까지 완료하면 GitHub의 우측 Releases에 태그가 추가된 모습을 볼 수 있습니다.

    다음은 최종적으로 배포를 하기 위해 New release를 작성해야 합니다.

    아래와 같이 GitHub의 Releases 탭에서 생성한 태그를 이용해 릴리스를 작성하고,

    Publish release 버튼을 누르게 되면!

    다른 라이브러리들에서 자주 보던 릴리즈 화면을 볼 수 있습니다👏🏻👏🏻👏🏻

    만든 김에 README도 아래와 같이 한번 작성해 보고

     

    꽤 그럴듯한 라이브러리가 배포되었습니다 ㅎㅎ

    6. Xcode 프로젝트에서 사용하기

    Xcode에서 원하는 프로젝트를 열고, GitHub URL을 통해 방금 배포한 라이브러리를 검색합니다.

    위에서 v1.0.0으로 배포했으니, Up to Next Major Version 옵션으로 설정하고

    Add Package를 통해 프로젝트에 추가해 줍니다.

    정상적으로 추가가 되었다면 아래와 같이 Package Dependencies에서 추가된 모습을 볼 수 있습니다.

     

    마지막으로 잘 작동하는지 한번 봐볼까요?

    import SwiftUI
    
    import CountryCapitalKit
    
    struct ContentView: View {
      @State private var searchText: String = ""
      @State private var resultText: String = ""
      
      var body: some View {
        VStack(spacing: 16) {
          TextField("국가 이름을 한국어로 입력하세요", text: $searchText)
            .textFieldStyle(RoundedBorderTextFieldStyle())
            .padding(.horizontal)
          
          Button(action: {
            // 우리가 만든 CountryCapitalKit 메서드 호출
            resultText = CountryCapitalKit.getCapital(of: searchText) ?? "결과 없음"
          }) {
            Text("검색")
              .frame(maxWidth: .infinity)
              .padding()
              .background(Color.blue)
              .foregroundColor(.white)
              .cornerRadius(8)
          }
          .padding(.horizontal)
          
          Text(resultText)
            .padding()
        }
      }
    }

     

    간단하게 국가 이름을 입력하면 직접 만든 라이브러리 기능을 활용하여 해당 국가의 수도를 보여줍니다!

     

     

    마치며

    SPM을 활용해 간단한 패키지를 만들고 GitHub에 배포 한 뒤 Xcode에서 사용하는 방법까지

    전체적인 흐름을 살펴보았습니다.

    직접 해보니 생각보다 쉽고 재밌었네요! 구체적으로 들어가면 고려할 것들이 많이 있겠지만

    우선 어떤 흐름으로 흘러가는지를 알게 된 것 같아서 만족🙂

     

     

     

Designed by Tistory.