728x90
SMALL
안녕하세요! iOS 앱을 개발하다 보면 자연스럽게 MVVM (Model-View-ViewModel) 디자인 패턴을 고민하게 됩니다.
특히 ViewModel을 어떻게 설계할지 많은 분들이 고민하는데요.
오늘은 한눈가계부 앱의 사례를 통해, 모든 기능을 한 곳에 모은 통합형 ViewModel과 역할을 나눠 관리하는 분리형 ViewModel의 장단점을 명확하게 비교해 드릴게요.
1. 통합형 ViewModel의 편리함과 한계 🚧
초기 개발 단계에서 하나의 거대한 ViewModel을 만들어 모든 로직을 담는 것은 매우 흔한 방법입니다.
final class TransactionViewModel {
// 모든 화면에 필요한 @Published 변수들
@Published var transactions: [ExpenseModel] = []
@Published var totalBalanceThisMonth: Int = 0
@Published var recentTransactions: [ExpenseModel] = []
// ... CRUD 및 데이터 가공 메서드
}
- 장점: 모든 로직이 한 곳에 있어 코드를 찾기 쉽고, 개발 초기에는 빠르게 기능을 구현할 수 있습니다.
- 단점: 하지만 앱의 규모가 커질수록 이 ViewModel은 '신(God) 객체'가 되어버립니다. 파일이 수천 줄로 늘어나고, 특정 기능을 수정할 때 다른 화면의 로직에 영향을 줄까 봐 조심스러워지죠. 코드가 복잡해져 유지보수와 테스트가 어려워지는 명확한 한계가 있습니다.
2. 분리형 ViewModel: 더 나은 확장성을 위한 설계 ✨
이러한 문제를 해결하는 더 좋은 방법은 바로 책임에 따라 ViewModel을 분리하는 것입니다.
- 메인 ViewModel: 앱의 핵심 데이터를 중앙에서 관리합니다. 예를 들어 TransactionViewModel은 모든 거래 내역(transactions)을 관리하고, Core Data와 직접 소통하는 역할만 맡습니다.
- 서브 ViewModel: 특정 화면의 요구사항에 맞춰 데이터를 가공하고 UI 로직을 처리합니다. 예를 들어, HomeViewModel은 메인 ViewModel에서 받은 전체 데이터 중 '최근 5개 내역', '월별 합계' 등 홈 화면에 필요한 정보만 가공해서 제공합니다.
예시: 거래 내역 추가/수정
통합형 ViewModel에서는 하나의 TransactionViewModel이 모든 CRUD를 담당합니다.
분리형 구조에서는 AddViewModel을 별도로 만들어, 오직 거래 추가/수정 화면의 로직만 담당하게 할 수 있습니다. AddViewModel은 메인 TransactionViewModel에서 CRUD 메서드를 호출하여 데이터를 업데이트합니다.
// 메인 ViewModel
final class TransactionViewModel {
// 앱의 모든 데이터를 관리
@Published var transactions: [ExpenseModel] = []
private let dataManager = TransactionCoreDataManager.shared
func create(transaction: ExpenseModel) {
// ... CoreData에 저장
}
}
// 특정 화면(추가/수정)을 위한 서브 ViewModel
final class AddViewModel {
private let mainViewModel: TransactionViewModel
init(mainViewModel: TransactionViewModel) {
self.mainViewModel = mainViewModel
}
func saveTransaction(data: ExpenseModel) {
// 메인 ViewModel의 메서드를 호출하여 중앙 데이터 관리
mainViewModel.create(transaction: data)
}
}
3. 결론: 분리형 ViewModel을 선택해야 하는 이유 🏆
당장의 편리함만 생각하면 통합형 ViewModel이 쉬워 보일 수 있습니다. 하지만 앱이 성장할수록 복잡성이 기하급수적으로 늘어나고, 결국 유지보수가 불가능한 코드가 될 위험이 높습니다.
- 향상된 유지보수성: 각 ViewModel이 자신의 역할에만 집중하므로, 코드가 훨씬 읽기 쉽고 수정하기 편리합니다.
- 높은 확장성: 새로운 기능이나 화면을 추가할 때 기존 코드를 건드릴 필요 없이 새로운 ViewModel만 만들면 됩니다.
- 쉬운 테스트: 각 ViewModel이 작고 명확한 역할을 가지므로, 단위 테스트를 작성하기가 매우 수월합니다.
따라서 앱의 안정적인 성장을 원한다면, 처음부터 역할을 분리하는 분리형 ViewModel 설계를 고려하는 것이 현명한 선택입니다. 👍
728x90
LIST
'한눈가계부 > 데이터 모델' 카테고리의 다른 글
| 안녕! '신(God) 객체' 👋 더 똑똑한 ViewModel 아키텍처로 가자 (3) | 2025.08.27 |
|---|---|
| 💡 iOS 개발 필수 개념: Future와 AnyPublisher 완벽 정리 (0) | 2025.08.24 |
| 💡 iOS 가계부 앱 개발: Core Data와 FileManager 연동하기 (0) | 2025.08.24 |
| 📝 iOS 가계부 앱 개발: FileManager로 로컬 데이터 관리하기 (0) | 2025.08.24 |
| 📱 iOS 가계부 앱 개발기: 데이터 모델 설계 파헤치기 ✨ (1) | 2025.08.24 |