[Swift Apple ] Swift Package Manager(SPM) + 디자인 패턴 활용법

Swift 의존성 관리 도구인 Swift Package Manager(SPM) 와 디자인 패턴을 결합해 효율적이고 확장성 있는 프로젝트 설계 방법을 소개해드리겠습니다. Swift 개발에서 모듈화(Modularization)패턴 기반 설계는 유지보수성과 협업 효율을 크게 높여줍니다. SPM과 디자인 패턴을 잘 활용하면, 대규모 프로젝트도 깔끔하게 관리할 수 있어요!


[Swift Apple ] Swift Package Manager(SPM)
[Swift Apple ] Swift Package Manager(SPM) 




🚀 Swift Package Manager(SPM) + 디자인 패턴 활용법

– 모듈화와 패턴으로 만드는 확장성 있는 프로젝트 구조


✅ Swift Package Manager(SPM)란?


SPM은 Swift 공식 의존성 관리 도구로,
외부 라이브러리뿐만 아니라 내부 모듈화에도 활용할 수 있습니다.

  • 외부 라이브러리 설치/관리 (예: Alamofire, SnapKit 등)

  • 내부 공통 기능을 패키지로 분리 (Core, Network, UI 등)

  • 버전 관리 및 재사용성 향상

  • Xcode 통합 지원 (별도 설치 필요 없음)




🎯 왜 SPM과 디자인 패턴을 결합할까?

  • 프로젝트를 기능별로 모듈화

  • 각 모듈에서 프로토콜 기반 패턴을 활용해 의존성 최소화

  • 기능 추가나 수정 시, 다른 모듈에 영향 없이 확장 가능

  • 테스트 코드 작성이 쉬워짐

  • 협업 시 역할 분담이 명확해짐


✅ 특히 Factory, Strategy, Delegate, DI 패턴과 결합하면 효과적!




🚀 실전 예시: SPM + 패턴 기반 아키텍처


📂 프로젝트 구조 예시

MyAppProject
├── App (메인 앱)
├── CorePackage (SPM 패키지)
│     ├── Logger.swift  (싱글톤 패턴)
│     └── Config.swift  (Factory 패턴)
├── NetworkPackage (SPM 패키지)
│     ├── NetworkService.swift (Protocol + DI)
│     └── APIManager.swift
└── UIPackage (SPM 패키지)
      ├── Theme.swift (Strategy 패턴)
      └── CustomButton.swift





1️⃣ CorePackage - 싱글톤 패턴 (공통 Logger)


공통 로그 기능을 SPM 패키지로 관리하고,

싱글톤 패턴으로 어디서든 접근 가능하게 설계.

public final class Logger {
    public static let shared = Logger()
    private init() {}

    public func log(_ message: String) {
        print("📋 [LOG]: \(message)")
    }
}

사용 예:

Logger.shared.log("앱이 시작되었습니다.")
✅ 전역 로그 관리가 필요할 때, SPM + 싱글톤 패턴 조합이 효과적!




2️⃣ NetworkPackage - 프로토콜 + DI 패턴


네트워크 기능을 패키지로 분리하고,

프로토콜 기반 설계 + 의존성 주입(DI) 으로 유연성 확보.

public protocol NetworkService {
    func fetchData(endpoint: String, completion: @escaping (Data?) -> Void)
}

public class APIManager: NetworkService {
    public init() {}

    public func fetchData(endpoint: String, completion: @escaping (Data?) -> Void) {
        // API 호출 로직
    }
}

App 모듈에서 주입:

let networkService: NetworkService = APIManager()
networkService.fetchData(endpoint: "/user") { data in
    // 처리
}
✅ 테스트 시 Mock 객체로 쉽게 대체 가능!




3️⃣ UIPackage - Strategy 패턴으로 테마 관리


UI 패키지에서 다양한 테마 전략을 제공.

public protocol ThemeStrategy {
    var backgroundColor: String { get }
}

public struct LightTheme: ThemeStrategy {
    public var backgroundColor = "White"
}

public struct DarkTheme: ThemeStrategy {
    public var backgroundColor = "Black"
}

앱에서 동적 테마 적용:

var theme: ThemeStrategy = DarkTheme()
print("현재 배경색: \(theme.backgroundColor)")
✅ 새로운 테마가 추가되어도 기존 코드 수정 없이 확장!



🎯 SPM + 패턴 결합의 장점

장점

설명

모듈화

기능별 분리로 코드 관리 효율 상승

유연한 의존성 관리

프로토콜 + DI 로 결합도 낮춤

테스트 용이성

Mock 객체 활용 가능

확장성

Open-Closed 원칙 실현

협업 최적화

역할과 책임이 명확해짐




✏️ 실습 아이디어

  1. SPM 패키지로 공통 유틸리티 모듈 생성

    (Logger, DateFormatter 등 싱글톤 패턴 활용)

  2. Network 패키지에서 프로토콜 기반 API 설계 후

    DI 패턴으로 앱에 주입

  3. UI 컴포넌트 패키지에서 Strategy 패턴으로 다양한 버튼 스타일 관리

  4. Factory 패턴으로 ViewController 생성 로직을 패키지에 위임




✨ 마무리하며


Swift Package Manager와 디자인 패턴을 결합하면

대규모 프로젝트에서도 다음과 같은 효과를 얻을 수 있습니다.

  • 유지보수와 확장에 강한 구조

  • 기능 추가 시 최소한의 변경

  • 테스트와 협업 효율 대폭 상승

  • 클린 아키텍처의 실현 가능


댓글 쓰기