본문 바로가기
한눈가계부/데이터 모델

💡 ViewModel 설계: 통합형 vs. 분리형, 당신의 선택은? 🤔

by 밤새는 탐험가89 2025. 8. 25.
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