부트캠프/Unity [ 스파르타 ]
[ 스파르타 ][TIL] 유니티 스파르타 7기 28일차 - MVC패턴
맏난거
2025. 2. 28. 20:54
MVC(Model-View-Controller) 패턴은 소프트웨어 디자인 패턴 중 하나로, 애플리케이션을 모델(Model), 뷰(View), 컨트롤러(Controller) 세 가지 역할로 분리하여 구조화하는 방식입니다.
🔹 MVC 패턴의 구성 요소
- Model(모델) → 데이터 및 로직
- 애플리케이션의 데이터 및 비즈니스 로직을 담당
- 데이터베이스나 내부 상태를 관리
- 변경이 발생하면 뷰(View)에 알려줌
- View(뷰) → 사용자 인터페이스(UI)
- 모델의 데이터를 화면(UI)으로 표시
- 직접 데이터를 처리하지 않고, 모델의 데이터를 받아서 출력
- 사용자의 입력을 직접 처리하지 않고, 컨트롤러를 통해 처리
- Controller(컨트롤러) → 입력 처리 및 연결 역할
- 사용자의 입력을 받아 모델(Model)과 상호 작용
- 모델을 변경한 후, 뷰(View)에 변경 사항을 반영하도록 요청
🔹 MVC 패턴의 동작 방식
- 사용자가 **입력(클릭, 버튼 등)**을 하면 **컨트롤러(Controller)**가 이를 처리
- 컨트롤러는 **모델(Model)**을 변경
- 모델의 데이터가 변경되면 **뷰(View)**에 알림
- 뷰는 변경된 데이터를 사용자에게 다시 표시
🔹 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) 업데이트
📌 유니티에서 설정 방법
- Canvas를 만들고 Text와 Button을 배치
- ScoreView를 Text 오브젝트에 추가하고 scoreText에 연결
- ScoreController를 빈 GameObject에 추가하고, ScoreView 연결
- Button의 OnClick 이벤트에 ScoreController.IncreaseScore() 연결
🎯 MVC 패턴 적용의 장점
✅ 코드 분리로 유지보수 용이
✅ UI(View)와 로직(Controller, Model) 분리 → 재사용성 증가
✅ 이벤트(Observer 패턴) 활용 → UI 자동 업데이트