? : 이번 과제는 MVVM 구조로 진행해보세요~
ㄴ ? 네?? ???????? MVVM이 뭐지...
MVVM에 대한 가이드라인은 정해진 바가 없기 때문에 개발을 기획하면서, 작업하면서 맞다고 판단되는 방향으로 작업하면 된다고 하는데.. 그게 더 어렵다..
뭔지도 모르는데 가이드라인도 없다? 너무 혼란스럽다..
그래서 해당 패턴에 대해 알아볼 필요가 있다.
Model-View-ViewModel의 약자로, 소프트웨어 개발에서 사용되는 아키텍처 패턴 중 하나를 말한다.
MVVM은 애플리케이션을 세 가지 주요 컴포넌트로 분리하여 관리하며, 각 컴포넌트가 특정 역할을 담당한다.
import Foundation
import CoreData
@objc(Task)
public class Task: NSManagedObject {
}
import SnapKit
import UIKit
class BucketListView: UIView {
let tableView: UITableView = {
let tableView = UITableView()
tableView.backgroundColor = UIColor(red: 248/255, green: 248/255, blue: 248/255, alpha: 255)
tableView.separatorColor = .systemGray
tableView.register(BucketListCell.self, forCellReuseIdentifier: BucketListCell.identifier)
return tableView
}()
let addButton: UIBarButtonItem = {
let addButton = UIBarButtonItem()
addButton.image = UIImage(systemName: "plus.circle.fill")
return addButton
}()
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setupUI() {
addSubview(tableView)
tableView.snp.makeConstraints { make in
make.top.leading.trailing.bottom.equalToSuperview()
}
}
}
import Foundation
import UIKit
class BucketListViewModel {
private let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
var bucketList: [Task]?
var tableViewReloadHandler: (() -> Void)?
func fetchBucketList() {
let request = Task.fetchRequest()
do {
bucketList = try context.fetch(request)
tableViewReloadHandler?()
} catch {
print("🚨 Error: Fetch Task")
}
}
...
}
MVVM 패턴은 주로 데이터 바인딩과 함께 사용되어, 모델의 변경 사항이 자동으로 뷰에 반영되도록 한다. 이로써 코드의 가독성을 향상시키고 유지보수를 용이하게 해준다.
데이터 바인딩(Data Binding)
소프트웨어 개발에서 사용자 인터페이스(UI)와 데이터 모델을 연결하는 기술 또는 패턴이다. 주로 MVVM (Model-View-ViewModel) 아키텍처와 함께 사용되며 UI 요소의 상태와 데이터 모델 간의 동기화를 자동화한다. 데이터 바인딩은 데이터 모델의 변경 사항이 자동으로 UI에 반영되고, UI의 상태 변경이 데이터 모델에 자동으로 반영되도록 해준다.
말 그대로 MVVM은 모델, 뷰, 뷰모델로 구분하는 것이며, 본패턴에 익숙해지기까지는 시간이 좀 걸릴 것 같다.
지금 진행중인 프로젝트에 MVVM을 적용해보고 있는데, 아직까지 뷰모델과 뷰컨트롤의 역할을 어떻게 나눠야 하고 어떤 코드를 작성해야 하는지 혼란을 느끼고 있다.
그렇지만, MVVM의 장점인 뷰의 완벽한 분리에 대해서는 어느정도 이해가 된다. 내일은 뷰컨트롤에 있는 코드들을 어떤 기준으로 뷰모델로 뺄 지 고려하여 리팩토링 해보려고 한다.