카테고리 없음

[스파르타 ][TIL] 유니티 스파르타 7기 41일차 - MVP패턴

맏난거 2025. 4. 7. 23:31

MVP 패턴은 Model-View-Presenter의 약자로, UI와 비즈니스 로직을 분리하여 코드의 재사용성과 유지보수성을 높이기 위한 아키텍처 패턴입니다. 특히 유니티, 안드로이드, 윈폼 등에서 자주 사용됩니다.

🔷 MVP 구성요소

구성요소역할
Model 데이터와 비즈니스 로직을 담당함
View UI 요소를 담당하며, 사용자 입력을 Presenter로 전달함
Presenter View와 Model 사이를 중재하며, 로직을 처리하고 View를 업데이트함

 

🔷 각 역할 설명

✅ Model

  • 데이터 구조, 로직 처리
  • 예: 게임 점수 계산, 서버 통신, 저장 로직 등
public class ScoreModel
{
    public int Score { get; private set; }

    public void AddScore(int value)
    {
        Score += value;
    }
}

✅ View

  • 사용자 인터페이스(UI)를 보여주며, 사용자 입력을 Presenter로 전달
  • Presenter가 전달한 데이터를 UI에 반영
public interface IScoreView
{
    void UpdateScoreText(int score);
}
public class ScoreView : MonoBehaviour, IScoreView
{
    public Text scoreText;

    public void UpdateScoreText(int score)
    {
        scoreText.text = $"Score: {score}";
    }
}

✅ Presenter

  • View와 Model 사이에서 로직을 중재함
  • View의 이벤트를 받아 Model을 조작하고, 변경된 결과를 View에 반영
public class ScorePresenter
{
    private ScoreModel model;
    private IScoreView view;

    public ScorePresenter(ScoreModel model, IScoreView view)
    {
        this.model = model;
        this.view = view;
    }

    public void AddScore(int value)
    {
        model.AddScore(value);
        view.UpdateScoreText(model.Score);
    }
}

🔷 MVP 패턴의 흐름

  1. 사용자가 UI(View)에서 버튼 클릭
  2. View가 Presenter에 이벤트 전달
  3. Presenter는 Model을 조작
  4. Model이 데이터 변경
  5. Presenter가 View를 업데이트

🔷 장점

✅ 역할 분리가 명확해져서 유지보수가 쉬움
✅ UI를 테스트하기 쉬움 (로직은 Presenter에 있기 때문)
✅ View와 Model이 완전히 분리되어 재사용 가능

 

🔷 유니티에서 MVP 적용 예시

public class GameController : MonoBehaviour
{
    private ScorePresenter presenter;

    void Start()
    {
        var model = new ScoreModel();
        var view = GetComponent<ScoreView>();
        presenter = new ScorePresenter(model, view);
    }

    public void OnScoreButtonClicked()
    {
        presenter.AddScore(10);
    }
}