
최근 퍼즐 게임을 개발할 때 MVVM 패턴을 사용하는 케이스가 많다는 이야기를 들었다.
특히 UI 요소가 많고, 게임 상태와 연출이 분리되어야 하며, 동일한 데이터를 여러 UI가 바라보는 구조가 빈번할 때 유지보수와 확장성이 크게 좋아진다고 한다.
그래서 이번 기회에 "MVVM이 실제로 어떤 구조인지, 왜 퍼즐 장르에서 자주 사용하는지" 알아보려고 한다.
MVVM은 말 그대로 세 가지 레이어로 구성된다.
- Model
게임의 순수한 데이터, 로직, 상태
(점수, 턴 수, 퍼즐 보드 상태 등)- View
플레이어가 보는 UI/화면 요소
(점수 UI, 셀 애니메이션, 버튼 등)- ViewModel
View와 Model을 이어주는 중간 계층
UI가 직접 Model에 접근하지 않고, ViewModel을 통해 상태를 받아옴.
-> 양방향 바인딩도 가능
구조를 단순하게 표현하면
Model <-> ViewModel <-> View
이런 느낌이다.
Unity에선 보통 View가 MonoBehaviour에 속하고,
ViewModel과 Model은 C# 클래스로 구성되는 경우가 많다.
처음 느낀 의문은
"MVC 패턴이 있는데, 굳이 MVVM 패턴을 사용할 필요가 있나?"
였다.
핵심 차이는 UI 바인딩과 상태 흐름의 책임 분리이다.
<MVC 패턴>
Controller가 View와 Model을 모두 직접 제어한다.
View <-> Controller <-> Model
문제는 UI 변화가 많으면 Controller가 비대해지기 쉽다.
<MVVM 패턴>
View는 ViewModel만 바라본다.
그리고 ViewModel은 Model의 상태를 가공하여 View에 전달한다.
View <-> ViewModel <-> Model
이 구조 덕분에
특히 퍼즐 게임이나 캐주얼 게임처럼 UI 갱신 빈도가 높은 장르에서 매우 유용하다
<1. 상태 변화가 많고 UI가 계속 따라붙는 장르>
퍼즐 게임의 특성
이러한 요소들을 Controller나 MonoBehaviour에 몰아넣으면 스크립트가 복잡해질 수 있다.
그런데 MVVM 패턴을 사용하면
-> 코드가 자연스럽게 분리된다.
<2. 동일 데이터를 바라보는 UI가 많다>
ex) 콤보
Model의 콤보 값이 바뀌면
ViewModel은 이를 기반으로 UI 여러 곳에 자동 반영한다.
<3. 애니메이션 + 연출 지연 + 게임 로직이 섞이면 코드가 복잡해진다.>
퍼즐 장르는 연출이 굉장히 많다.
이런 로직들을 MonoBehaviour 하나에서 모두 처리하려고 하면
상태 관리, UI 갱신, 연출 타이밍이 뒤섞여 코드가 금방 복잡해진다.
하지만 ViewModel을 두면
-> 로직과 연출이 자연스럽게 분리되어 유지보수가 훨씬 쉬워진다.
간단하게 퍼즐 셀 상태를 표시하는 예를 들어보자.
// Model public class CellModel { public int value; public bool isMatched; } // ViewModel public class CellViewModel { public readonly ReactiveProperty<int> Value = new(); public readonly ReactiveProperty<bool> IsMatched = new(); public void Bind(CellModel model) { Value.Value = model.value; IsMatched.Value = model.isMatched; } } // View (Unity) public class CellView : MonoBehaviour { [SerializeField] private Text valueText; private CellViewModel viewModel; public void Bind(CellViewModel vm) { viewModel = vm; viewModel.Value.Subscribe(v => { valueText.text = v.ToString(); }); viewModel.IsMatched.Subscribe(isMatched => { // 애니메이션 구현 }); } }
-> Model 값이 바뀌면 ViewModel이 감지하고
-> View는 UI만 바꾼다
-> 게임 로직과 UI 로직이 깔끔하게 분리됨
* 반응형 프로퍼티를 활용하면 더욱 자연스러운 MVVM 구조가 된다.
<장점>
<단점>
퍼즐 게임 쪽에서 MVVM을 많이 쓴다는 이야기를 듣고 "왜 하필 퍼즐 장르에서 많이 사용할까?"가 궁금해서 정리했는데, 정리하고 나니 이유가 명확해졌다.
퍼즐 게임은
상태 변화 -> UI 반영 -> 연출 -> 다시 상태 변화
이 흐름이 반복되는 구조라
UI와 상태를 분리해 관리하는 MVVM이 자연스럽게 잘 맞는 구조였던 것이다.
다음에 퍼즐 시스템을 만들 일이 생기면, 이번에 정리한 MVVM 패턴을 실제로 적용하여 깔끔한 코드 구조를 짜보고 싶다.