설명에 앞서 디자인 패턴에 대해 먼저 알아보겠습니다.
- 디자인 패턴이란 ?
- 프로그램이나 어떤 특정한 것을 개발하는 중에 발생했떤 문제점들을 정리해서
상황에 따라 간편하게 적용해서 쓸 수 있는 것을 정리하여 특정한 "규약"을 통해
쉽게 쓸 수 있는 형태로 만든 것

- MVC 는 Model, View, Controller의 약자입니다.
- 하나의 애플리케이션, 프로젝트를 구성할 때 그 구성 요소를 세가지 역할로 구분한 패턴입니다.
- Controller를 조작하면 Controller는 Model을 통해 데이터를 가져와 View를 제어하여 사용자에게 전달하게 됩니다.
- 애플리케이션의 데이터가 되는 요소 입니다.
- 애플리케이션의 데이터와 이를 처리하는 로직을 담당합니다.
- 특징으로는 데이터 상태를 저장하고 관리, 데이터 변경이 발생되면
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;
}
}
- 데이터를 시각적으로 표시하고, 사용자와의 인터페이스를 담당합니다.
- 특징으로는 모델의 데이터를 화면에 표시하며 사용자의 입력이 발생하면 컨트롤러로 전달해줍니다.
- 화면에 표시되는 부분만 담당하며 (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;
}
}
- 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);
}
}
}
- 사용자의 입력 -> Controller가 Model에 명령 -> Model의 변경사항 알림 -> View 업데이트
- 위 코드 기준으로 예시를 든다면
- if (Input.GetKeyDown(KeyCode.H)) : 사용자 입력
- model.TakeDamage(5) : Controller가 Model에 명령
- public event Action<> OnHealthChanged : Model의 변경사항 알림
- OnHealthChanged?.Invoke(health) : View 업데이트
- View - Controller 간 의존성이 감소합니다.
- Controller가 View를 직접 제어하지 않아도 Model - View간 자동 동기화가 이루어집니다.
- 확장성 증가
- View가 여러 개여도, 동일한 Model Event를 구독하면 자동으로 업데이트 됩니다.
- 유지보수성 향상
- Model - View간 역할이 명확히 분리되므로, 각각 독릭접인 수정이 가능합니다.
- 개인적인 궁금점으로 조사해보았습니다.
MVC가 널리 사용된다면 MVP, MVVM은 왜 나온건지 궁금하였거든요.
결론은 MVC는 아직도 널리 사용된다고 합니다. 그 이유는 아래와 같은데요.
물론 단점도 존재합니다. 단점은 아래와 같습니다.
이 단점을 보완하기 위해 MVP , MVVM 패턴이 나온거라고 합니다.
개인적인 생각이지만 저는 MVC가 아직도 많이 사용되는 이유는 2번이 제일 클 것 같습니다..
이미 MVC로 개발하며 테스트도 끝나있고 여러차례 안정성이 보장된 방식을
변경하는게 쉽지는 않을 것 같거든요..

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