본문 바로가기
게임 개발 일지/내일배움캠프 TIL

[Unity] MVC 모델

by 빛하_ 2024. 2. 14.
기술면접 대비하기 #12

 

MVC 모델이란?

MVC 모델이란 디자인 패턴의 일종으로, 프로젝트의 구성 요소를 Model, View, Controller 세 가지로 구분한 패턴이다.

사용자가 controller를 조작하면 controller는 model을 통해서 데이터를 가져오고 그 정보를 바탕으로 시각적인 표현을 담당하는 View를 제어해서 사용자에게 전달한다. 사용자는 controller를 통해 또 다른 정보를 입력시킨다. 

 

모델은 프로그램의 정보, 데이터를 나타낸다. 데이터베이스, 상수값, 초기화값, 변수 등을 담고 있으며 이런 정보를 가공하는 역할도 맡는다. 모델은 사용자가 사용하길 원하는 모든 데이터를 가지고 있어야 한다. 또한 뷰나 컨트롤러에 대해 어떤 정보도 담지 않아야 한다. 모델이 뷰나 컨트롤러의 값을 참조하거나 속성에 접근할 수 있어서는 안 된다는 뜻이다. 그리고 모델의 정보가 변경되면 이벤트 등을 통해 누군가에게 전달해야 하며, 누군가 모델을 변경하도록 요청한다면 이를 수신하여 처리할 수 있어야 한다. 모델은 재사용이 가능해야 하고 다른 인터페이스에서도 변하지 않아야 한다.

 

뷰는 input text, 체크박스 등과 같은 사용자 인터페이스 요소이다. 데이터와 객체의 입력과 출력을 담당한다. 뷰는 모델이 가지고 있는 정보를 따로 저장해서는 안 된다. 화면에 글자를 표시하기 위해 모델이 가지고 있는 정보를 전달받는데, 이를 유지하기 위해 뷰 내부에 저장하면 안 된다. 명령을 받으면 화면에 표시하기만 하고 출력에 필요한 정보들은 저장하지 않아야 한다. 뷰는 데이터를 받으면 화면에 표시하는 역할만 하기 때문에 모델이나 컨트롤러의 정보를 몰라야 한다. 또한 모델과 같이 변경이 일어났을 때 누군가에게 알려주고, 누군가 변경시킨다면 모델에 전달해 변경을 통지할 수 있도록 구현해야 한다. 재사용이 가능해야 하며, 다른 정보를 표현하기 쉽도록 설계해야 한다.

 

컨트롤러는 인터페이스 요소를 서로 이어주는 역할이다. 사용자가 데이터를 클릭하고 수정하는 것에 대한 이벤트를 처리하는 부분이다. 컨트롤러는 모델과 뷰에 대해 알고 있어야 한다. 모델과 뷰는 변경을 외부로 알리고 변경을 수신하는 방법만 알고 있으므로 이를 관리하기 위해 컨트롤러는 모델과 뷰에 대한 정보를 알고 있어야 한다. 또한 모델이나 뷰의 변경 통지를 받으면 이를 해석해 각각의 구성요소에 통지하는 역할을 한다. 따라서 프로그램의 주요 로직을 컨트롤러가 담당하게 된다. 

 

MVC 패턴을 사용하는 이유는 시각적 처리, 내부 데이터 처리, 그리고 둘을 제어하는 컨트롤러가 각각의 역할에만 집중할 수 있기 때문이다. 맡은 역할만 잘 수행하도록 코드를 작성하면 되기 때문에 기능 구현의 효율성이 높아진다. 역할을 분리해 구현한다면 유지보수, 확장성, 유연성이 증가하고 중복 코딩을 최소화할 수 있다. 

 

// Model
[Serializable]
public class PlayerData
{
    public string playerName;
    public int playerScore;
}

// Controller
public class PlayerController : MonoBehaviour
{
    public PlayerData playerData; // Model

    void Start()
    {
        // 초기화 또는 로드 등의 로직 수행
        InitializePlayer();
    }

    void InitializePlayer()
    {
        // 예시: 플레이어 데이터 초기화
        playerData = new PlayerData();
        playerData.playerName = "Player1";
        playerData.playerScore = 0;

        // 데이터 업데이트
        UpdateView();
    }

    void UpdateView()
    {
        // 뷰 업데이트 로직
        Debug.Log($"Player Name: {playerData.playerName}, Score: {playerData.playerScore}");
    }
}

// View
public class PlayerView : MonoBehaviour
{
    // Unity UI 요소 또는 다른 뷰 요소들이 여기에 정의될 수 있음
}

// Example of how to use the MVC components in Unity
public class GameController : MonoBehaviour
{
    public PlayerController playerController; // Controller
    public PlayerView playerView; // View

    void Start()
    {
        // 컨트롤러 및 뷰 초기화
        playerController = new PlayerController();
        playerView = new PlayerView();

        // 뷰에 대한 참조 설정 (실제로는 Unity UI와 같은 것들을 할당해야 함)
        // playerView.SetPlayerController(playerController);

        // 게임 시작 시 컨트롤러에서 데이터 초기화
        playerController.Start();
    }
}

댓글