Swift 의존성 관리 도구인 Swift Package Manager(SPM) 와 디자인 패턴을 결합해 효율적이고 확장성 있는 프로젝트 설계 방법을 소개해드리겠습니다. Swift 개발에서 모듈화(Modularization) 와 패턴 기반 설계는 유지보수성과 협업 효율을 크게 높여줍니다. 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 원칙 실현 |
협업 최적화 |
역할과 책임이 명확해짐 |
✏️ 실습 아이디어
-
SPM 패키지로 공통 유틸리티 모듈 생성
(Logger, DateFormatter 등 싱글톤 패턴 활용)
-
Network 패키지에서 프로토콜 기반 API 설계 후
DI 패턴으로 앱에 주입
-
UI 컴포넌트 패키지에서 Strategy 패턴으로 다양한 버튼 스타일 관리
-
Factory 패턴으로 ViewController 생성 로직을 패키지에 위임
✨ 마무리하며
Swift Package Manager와 디자인 패턴을 결합하면
대규모 프로젝트에서도 다음과 같은 효과를 얻을 수 있습니다.
-
유지보수와 확장에 강한 구조
-
기능 추가 시 최소한의 변경
-
테스트와 협업 효율 대폭 상승
-
클린 아키텍처의 실현 가능
댓글 쓰기