MVVM은 Model-View-ViewModel의 약자로, 총 3가지의 그룹으로 이루어진
패턴이다. ViewModel은 Model의 데이터를 가공해주고
이런 ViewModel을 View가 보여주는 역할을 한다.
기존에 사용하던 MVC패턴에서 ViewController의 작업이 방대해지면서,
View와 Model을 분리해 코드의 양도 줄고 더 효율적인 방식으로 진행된다.
하지만, 데이터 binding 작업을 해야하며 단순하고 직관적인 MVC와 달리
ViewModel의 설계가 쉽지않다.
기존의 작업했던 것을 MVVM 형태로 리팩토링 해보았다.
우선 viewModel 파일을 생성해주었다. viewModel에서는 데이터(output) 과
user interactions(input)이 존재해야 한다. viewController에 있던 모델 관련 코드들을
viewModel로 넘겨주었고, item들을 viewModel에서 받을 수 있게 해주었다.
viewController에는 view components관련한 것들만 남겨두었다.
//
// FrameworkListViewModel.swift
// AppleFramework
//
// Created by 이재영 on 2023/02/02.
//
import Foundation
import Combine
final class FrameworkListViewModel {
init(items: [AppleFramework], selectedItem: AppleFramework? = nil) {
self.items = CurrentValueSubject(items)
self.selectedItem = CurrentValueSubject(selectedItem)
}
// Data => Output
var items = CurrentValueSubject<[AppleFramework], Never>(AppleFramework.list)
let selectedItem: CurrentValueSubject<AppleFramework?, Never>
// User Action => Input
let didSelect = PassthroughSubject<AppleFramework, Never>()
func didSelect(at indexPath: IndexPath) {
selectedItem.send(item)
}
}
MVVM 전환의 핵심 : view로 부터 비즈니스 로직을 최대한 분리하는 것
참고 문서 및 유용한 자료
https://scshim.tistory.com/407
https://learn.microsoft.com/ko-kr/xamarin/xamarin-forms/enterprise-application-patterns/mvvm