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

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

맏난거 2025. 2. 28. 20:54

MVC(Model-View-Controller) 패턴은 소프트웨어 디자인 패턴 중 하나로, 애플리케이션을 모델(Model), 뷰(View), 컨트롤러(Controller) 세 가지 역할로 분리하여 구조화하는 방식입니다.

🔹 MVC 패턴의 구성 요소

  1. Model(모델) → 데이터 및 로직
    • 애플리케이션의 데이터 및 비즈니스 로직을 담당
    • 데이터베이스나 내부 상태를 관리
    • 변경이 발생하면 뷰(View)에 알려줌
  2. View(뷰) → 사용자 인터페이스(UI)
    • 모델의 데이터를 화면(UI)으로 표시
    • 직접 데이터를 처리하지 않고, 모델의 데이터를 받아서 출력
    • 사용자의 입력을 직접 처리하지 않고, 컨트롤러를 통해 처리
  3. Controller(컨트롤러) → 입력 처리 및 연결 역할
    • 사용자의 입력을 받아 모델(Model)과 상호 작용
    • 모델을 변경한 후, 뷰(View)에 변경 사항을 반영하도록 요청

🔹 MVC 패턴의 동작 방식

  1. 사용자가 **입력(클릭, 버튼 등)**을 하면 **컨트롤러(Controller)**가 이를 처리
  2. 컨트롤러는 **모델(Model)**을 변경
  3. 모델의 데이터가 변경되면 **뷰(View)**에 알림
  4. 뷰는 변경된 데이터를 사용자에게 다시 표시

🔹 MVC 패턴의 장점

코드 분리 → 유지보수와 확장성이 좋아짐
재사용성 증가 → 뷰와 모델을 독립적으로 개발 가능
협업 용이 → 역할이 나뉘어 있어 개발자가 특정 부분에 집중할 수 있음

🔹 MVC 패턴이 적용된 예시

  • 웹 개발: ASP.NET MVC, Spring MVC
  • 게임 개발 (유니티): Unity에서도 MVC 패턴을 변형하여 사용 가능
    • Model: 게임의 데이터(점수, 캐릭터 상태 등)
    • View: UI 및 화면 출력
    • Controller: 입력 처리 및 게임 로직

 

1. 구조 설계

역할설명

Model(모델) UI에서 사용할 데이터를 저장하고 관리
View(뷰) UI 요소(텍스트, 버튼, 이미지 등)를 표시
Controller(컨트롤러) 사용자의 입력을 받아 모델을 변경하고, 변경된 내용을 뷰에 반영

2. 예제: 간단한 점수 UI (MVC 적용)

기능: 버튼을 누르면 점수가 증가하고, UI에 반영됨

using System;

public class ScoreModel
{
    public event Action<int> OnScoreChanged; // 점수가 변경되면 알림
    private int score;

    public int Score
    {
        get => score;
        set
        {
            if (score != value) // 점수가 변경될 때만
            {
                score = value;
                OnScoreChanged?.Invoke(score); // 변경된 점수 전달
            }
        }
    }
}

역할

  • Score 속성을 통해 점수를 저장하고 관리
  • 값이 변경될 때 OnScoreChanged 이벤트를 호출하여 뷰(View)에 알림

📌 View (ScoreView)

using UnityEngine;
using UnityEngine.UI;

public class ScoreView : MonoBehaviour
{
    [SerializeField] private Text scoreText;

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

역할

  • UI(Text)를 표시
  • UpdateScore(int score) 메서드를 통해 UI 업데이트

📌 Controller (ScoreController)

using UnityEngine;
using UnityEngine.UI;

public class ScoreController : MonoBehaviour
{
    [SerializeField] private ScoreView scoreView;
    private ScoreModel scoreModel;

    private void Start()
    {
        scoreModel = new ScoreModel();
        scoreModel.OnScoreChanged += scoreView.UpdateScore; // 점수 변경 시 UI 업데이트
    }

    public void IncreaseScore()
    {
        scoreModel.Score += 1; // 버튼 클릭 시 점수 증가
    }
}

역할

  • ScoreModel 인스턴스를 생성하여 데이터 관리
  • IncreaseScore()에서 점수를 증가시키고 자동으로 UI(View) 업데이트

📌 유니티에서 설정 방법

  1. Canvas를 만들고 Text와 Button을 배치
  2. ScoreView를 Text 오브젝트에 추가하고 scoreText에 연결
  3. ScoreController를 빈 GameObject에 추가하고, ScoreView 연결
  4. Button의 OnClick 이벤트에 ScoreController.IncreaseScore() 연결

🎯 MVC 패턴 적용의 장점

코드 분리로 유지보수 용이
UI(View)와 로직(Controller, Model) 분리 → 재사용성 증가
이벤트(Observer 패턴) 활용 → UI 자동 업데이트