MVC 패턴

JJW·2024년 11월 26일
0

Unity

목록 보기
4/34
post-thumbnail
  • UI 개발에 자주 사용되는 디자인 패턴인 MVC, MVP, MVVM 중 MVC 패턴에 대해 알아보겠습니다.
  • 총 3개의 글로 정리 될 예정이며 이 글은 첫번째 글입니다.

MVP : MVP
MVVM : MVVM


설명에 앞서 디자인 패턴에 대해 먼저 알아보겠습니다.

  • 디자인 패턴이란 ?
  • 프로그램이나 어떤 특정한 것을 개발하는 중에 발생했떤 문제점들을 정리해서
    상황에 따라 간편하게 적용해서 쓸 수 있는 것을 정리하여 특정한 "규약"을 통해
    쉽게 쓸 수 있는 형태로 만든 것

MVC

  • MVC 는 Model, View, Controller의 약자입니다.
  • 하나의 애플리케이션, 프로젝트를 구성할 때 그 구성 요소를 세가지 역할로 구분한 패턴입니다.
  • Controller를 조작하면 Controller는 Model을 통해 데이터를 가져와 View를 제어하여 사용자에게 전달하게 됩니다.

1. M (Model)

  • 애플리케이션의 데이터가 되는 요소 입니다.
  • 애플리케이션의 데이터와 이를 처리하는 로직을 담당합니다.
  • 특징으로는 데이터 상태를 저장하고 관리, 데이터 변경이 발생되면
    Controller 또는 View에 알림을 전달
  • UI와 독립적이며, 재사용이 가능하도록 설계하여야 합니다.
public class PlayerModel
{
	// 변경 사항 알림을 위한 이벤트 변수
    public event Action<int> OnHealthChanged; 
    public event Action<int> OnScoreChanged;

    private int health;
    private int score;

    public int Health
    {
        get => health;
        private set
        {
            health = value;
            // 이벤트 호출
            OnHealthChanged?.Invoke(health);
        }
    }

    public int Score
    {
        get => score;
        private set
        {
            score = value;
            // 이벤트 호출
            OnScoreChanged?.Invoke(score);
        }
    }
	
    // 변동사항에 따른 처리 방법
    public void TakeDamage(int damage)
    {
        Health = Math.Max(0, Health - damage);
    }
	
    // 변동사항에 따른 처리 방법
    public void AddScore(int points)
    {
        Score += points;
    }
}

2. V (View)

  • 데이터를 시각적으로 표시하고, 사용자와의 인터페이스를 담당합니다.
  • 특징으로는 모델의 데이터를 화면에 표시하며 사용자의 입력이 발생하면 컨트롤러로 전달해줍니다.
  • 화면에 표시되는 부분만 담당하며 (UI), 로직을 포함하지 않습니다.
public class PlayerView : MonoBehaviour
{
	// UI 변수
    [SerializeField] private Text healthText;
    [SerializeField] private Text scoreText;
	
    // 변경 통지에 따른 시각적인 처리 방법
    public void UpdateHealth(int health)
    {
        healthText.text = $"Health: {health}";
    }
	
    // 변경 통지에 따른 시각적인 처리 방법
    public void UpdateScore(int score)
    {
        scoreText.text = $"Score: {score}";
    }
	
    // 이벤트 구독
    public void BindModel(PlayerModel model)
    {
        model.OnHealthChanged += UpdateHealth;
        model.OnScoreChanged += UpdateScore;
    }

	// 이벤트 구독 해제
    public void UnbindModel(PlayerModel model)
    {
        model.OnHealthChanged -= UpdateHealth;
        model.OnScoreChanged -= UpdateScore;
    }
}

3. C (Controller)

  • Model 과 View를 연결하며 사용자 입력 처리 및 애플리케이션의 흐름을 제어합니다. (로직 담당)
  • 특징으로는 사용자의 입력을 처리하고 Model에 반영하며 Model의 데이터를 변경하거나 조회하여 View를 업데이트 합니다.
  • Model과 View 사이에서 중개 역할을 수행합니다.
public class PlayerController : MonoBehaviour
{
    [SerializeField] private PlayerModel model;
    [SerializeField] private PlayerView view;

    private void OnEnable()
    {
        // 모델과 뷰를 연결
        view.BindModel(model);
    }

    private void OnDisable()
    {
        // 이벤트 해제
        view.UnbindModel(model);
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            model.AddScore(10);
        }

        if (Input.GetKeyDown(KeyCode.H))
        {
            model.TakeDamage(5);
        }
    }
}

MVC의 작동 흐름

  • 사용자의 입력 -> Controller가 Model에 명령 -> Model의 변경사항 알림 -> View 업데이트
  • 위 코드 기준으로 예시를 든다면
  • if (Input.GetKeyDown(KeyCode.H)) : 사용자 입력
  • model.TakeDamage(5) : Controller가 Model에 명령
  • public event Action<> OnHealthChanged : Model의 변경사항 알림
  • OnHealthChanged?.Invoke(health) : View 업데이트

MVC의 장점

  • View - Controller 간 의존성이 감소합니다.
    • Controller가 View를 직접 제어하지 않아도 Model - View간 자동 동기화가 이루어집니다.
  • 확장성 증가
    • View가 여러 개여도, 동일한 Model Event를 구독하면 자동으로 업데이트 됩니다.
  • 유지보수성 향상
    • Model - View간 역할이 명확히 분리되므로, 각각 독릭접인 수정이 가능합니다.

MVC가 아직도 많이 사용되는지 ?

  • 개인적인 궁금점으로 조사해보았습니다.
    MVC가 널리 사용된다면 MVP, MVVM은 왜 나온건지 궁금하였거든요.
    결론은 MVC는 아직도 널리 사용된다고 합니다. 그 이유는 아래와 같은데요.
  1. 단순하고 직관적
  2. 웹 프레임워크에서 표준으로 자리 잡음
  3. 다양한 플랫폼에서 사용 가능

물론 단점도 존재합니다. 단점은 아래와 같습니다.

  1. 컨트롤러의 과부화
  2. 테스트 어려움
  3. Model - View간 직접 통신

이 단점을 보완하기 위해 MVP , MVVM 패턴이 나온거라고 합니다.
개인적인 생각이지만 저는 MVC가 아직도 많이 사용되는 이유는 2번이 제일 클 것 같습니다..
이미 MVC로 개발하며 테스트도 끝나있고 여러차례 안정성이 보장된 방식을
변경하는게 쉽지는 않을 것 같거든요..


테스트

MVC의 작동 흐름에서 설명한 것처럼 작동 흐름이 똑같이 흘러갑니다.


느낀 점

MVC 패턴을 사용하다보니 옵저버 패턴과 비슷하다는 느낌을 많이 받았습니다.
UI 작업할 때 MVC 패턴을 사용하면 유지보수가 쉬워질 것 같다는 느낌을 받았고 Model 부분이 애매모호 하였는데 하나의 객체 데이터로 보니 이해가 쉬워졌습니다. 아직 MVP와 MVVM 도 남아 MVC를 사용한다는 강력한 생각은 없지만 알아두면 좋을 것 같은 내용이었습니다.

  • 제가 조사한 내용이 맞지 않거나 잘못 된 경우에 댓글로 잘못된 점 지적해주시면 감사합니다 ! (´._.`)
profile
Unity 게임 개발자를 준비하는 취업준비생입니다..

0개의 댓글