부트캠프/Unity [ 스파르타 ]
[스파르타 ][TIL] 유니티 스파르타 7기 33일차 - MVP패턴
맏난거
2025. 3. 10. 23:34
MVP(Model-View-Presenter) 패턴은 GUI 애플리케이션 개발에서 사용되는 아키텍처 패턴 중 하나로, MVC(Model-View-Controller) 패턴의 변형입니다. 이 패턴은 View와 Model 간의 결합도를 줄이고, 테스트 용이성을 높이는 것이 목적입니다.
🔹 MVP 패턴의 구성 요소
- Model (모델)
- 데이터 및 비즈니스 로직을 관리합니다.
- 데이터베이스, API, 도메인 로직 등을 처리합니다.
- View (뷰)
- UI 요소를 담당합니다.
- 사용자 입력을 처리하고, 화면을 갱신하는 역할을 합니다.
- Presenter에 의해 업데이트됩니다.
- Presenter (프레젠터)
- View와 Model 사이에서 중간 역할을 합니다.
- View에서 받은 사용자 입력을 처리하고, Model에서 데이터를 가져와 View를 갱신합니다.
- View에 대한 참조를 가지고 있으며, View와 Model 간의 직접적인 결합을 방지합니다.
🔹 MVP 패턴의 동작 방식
- View → 사용자 입력을 받음 → Presenter에 전달
- Presenter → Model에서 데이터 요청
- Model → 데이터를 반환 → Presenter가 View 업데이트
- Presenter → View의 UI를 갱신
🔹 MVP 패턴의 장점
✅ 결합도 감소 → View와 Model이 직접 연결되지 않아 유지보수가 쉬움
✅ 유닛 테스트 용이 → Presenter가 UI와 분리되어 있어 테스트가 쉬움
✅ 코드 재사용성 증가 → View를 독립적으로 변경 가능
🔹 MVP 패턴의 단점
❌ Presenter의 코드가 길어질 수 있음 → 로직이 많아지면 복잡해질 수 있음
❌ View와 Presenter의 관계 유지 필요 → View는 Presenter를 알아야 하므로, 다소 종속성이 존재
🔹 유니티에서 MVP 패턴 적용 예제 (C#)
유니티에서는 UI 관련 코드를 분리하기 위해 MVP 패턴을 적용할 수 있습니다.
1️⃣ Model (데이터 관리)
public class PlayerModel
{
public int Score { get; private set; }
public void IncreaseScore(int amount)
{
Score += amount;
}
}
2️⃣ View (UI 표시)
using UnityEngine;
using UnityEngine.UI;
public class PlayerView : MonoBehaviour
{
public Text scoreText;
private PlayerPresenter presenter;
public void SetPresenter(PlayerPresenter presenter)
{
this.presenter = presenter;
}
public void UpdateScoreText(int score)
{
scoreText.text = "Score: " + score;
}
public void OnScoreButtonClicked()
{
presenter?.OnScoreButtonPressed();
}
}
3️⃣ Presenter (중재자)
public class PlayerPresenter
{
private PlayerModel model;
private PlayerView view;
public PlayerPresenter(PlayerModel model, PlayerView view)
{
this.model = model;
this.view = view;
view.SetPresenter(this);
view.UpdateScoreText(model.Score);
}
public void OnScoreButtonPressed()
{
model.IncreaseScore(10);
view.UpdateScoreText(model.Score);
}
}
4️⃣ MVP 초기화 (GameManager 등에서 실행)
public class GameManager : MonoBehaviour
{
public PlayerView playerView;
void Start()
{
PlayerModel playerModel = new PlayerModel();
PlayerPresenter playerPresenter = new PlayerPresenter(playerModel, playerView);
}
}
🔹 정리
- MVP 패턴은 View와 Model 간의 의존성을 줄이고 테스트 가능성을 높이는 패턴
- Presenter가 UI와 로직을 분리하는 역할
- 유니티에서도 UI 관련 로직을 분리하는 데 유용하게 사용 가능