부트캠프/Unity [ 스파르타 ]

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

맏난거 2025. 3. 10. 23:34

MVP(Model-View-Presenter) 패턴은 GUI 애플리케이션 개발에서 사용되는 아키텍처 패턴 중 하나로, MVC(Model-View-Controller) 패턴의 변형입니다. 이 패턴은 View와 Model 간의 결합도를 줄이고, 테스트 용이성을 높이는 것이 목적입니다.


🔹 MVP 패턴의 구성 요소

  1. Model (모델)
    • 데이터 및 비즈니스 로직을 관리합니다.
    • 데이터베이스, API, 도메인 로직 등을 처리합니다.
  2. View (뷰)
    • UI 요소를 담당합니다.
    • 사용자 입력을 처리하고, 화면을 갱신하는 역할을 합니다.
    • Presenter에 의해 업데이트됩니다.
  3. Presenter (프레젠터)
    • View와 Model 사이에서 중간 역할을 합니다.
    • View에서 받은 사용자 입력을 처리하고, Model에서 데이터를 가져와 View를 갱신합니다.
    • View에 대한 참조를 가지고 있으며, View와 Model 간의 직접적인 결합을 방지합니다.

🔹 MVP 패턴의 동작 방식

  1. View → 사용자 입력을 받음 → Presenter에 전달
  2. Presenter → Model에서 데이터 요청
  3. Model → 데이터를 반환 → Presenter가 View 업데이트
  4. 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 관련 로직을 분리하는 데 유용하게 사용 가능