MVC 패턴이란?

박현민·2025년 5월 11일

게임서버

목록 보기
6/8

Model-View-Controller로 나누어 설계하는 방식

MVC 패턴이란?

MVC 패턴은 애플리케이션의 개발 영역을Model-View-Controller로 나누어 관리하는 디자인 패턴이다.

각각의 역할이 분리되어 있어, 유지보수가 용이하고, 중복 코드가 줄어들며,
개발자 간 협업
이 쉬워지는 장점이 있다.

MVC 각 구성 요소


1. 모델 (Model)

  • 데이터와 비즈니스 로직을 담당
  • 애플리케이션에서 사용하는 데이터를 관리하고, 이를 저장하거나 가져오는 역할을 한다.
  • 예를 들어, 데이터베이스에서 정보를 조회하거나 갱신하는 작업을 처리한다.

예시: 게시글의 제목, 내용, 작성일 등 데이터를 관리하는 클래스

2. 뷰 (View)

  • 사용자에게 보여지는 UI를 담당
  • 화면에 보여질 내용을 정의하며, 모델로부터 받은 데이터를 시각적으로 표현한다.
  • 사용자의 입력을 직접 처리하지 않고, 컨트롤러에 이벤트를 전달한다.

예시: HTML, XML, Unity에서의 UI Canvas 등

3. 컨트롤러 (Controller)

  • 사용자의 입력을 처리하고, 모델과 뷰를 연결
  • 사용자의 액션(클릭, 터치 등)을 받아 적절한 로직을 수행하고, 결과를 뷰에 전달한다.
  • 모델과 뷰 사이의 중간다리 역할을 한다.

예시: 버튼 클릭 시 데이터를 저장하거나 화면을 전환하는 로직

MVC 패턴의 장단점


장점

  1. 역할 분리로 인해 코드의 구조가 명확해지고 유지보수가 쉽다.
  2. UI와 로직의 분리로 디자이너와 개발자가 동시에 작업 가능하다.
  3. 로직만 따로 테스트할 수 있어 테스트의 용이성이 증가한다.
  4. 동일한 모델을 다른 뷰에서도 사용하는 등 재사용성이 증가한다.

단점

  1. 초기에 구조를 잡는데 어려움을 느낄 수 있다.
  2. 작은 규모의 프로젝트에서는 과한 설계가 될 수 있다.
  3. 각 컴포넌트 간의 연결이 많아지면 복잡도가 증가할 수 있다.

MVC 패턴 예제


ASP.NET Core 와 유니티를 사용하여, 플레이어의 데이터를 가져오는 예제를 보여줄 것이다.

Player.cs (Model)

namespace Server.Models;

public class Player
{
	public int Id { get; set; }
	public string Nickname { get; set; }
	public int Level { get; set; }
}

PlayerController.cs (Controller)

using Microsoft.AspNetCore.Mvc;
using GameServer.Models;

namespace Server.Controllers;

[ApiController]
[Route("api/[controller]")]
public class PlayerController : ControllerBase
{
	[HttpGet("{id}")]
	public IActionResult GetPlayer(int id)
	{
		// 임시로 보내는 플레이어 데이터
		var player = new Player
		{
			Id = id,
			Nickname = "Sean_mn",
			Level = 10
		};
		
		return Ok(player);
	}
}

PlayerFetcher.cs - 유니티에서 데이터를 가져오는 로직

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public PlayerFetcher : MonoBehaviour
{
	private void Start()
	{
		StartCoroutine(GetPlayerData(1));
	}
	
	private IEnumerator GetPlayerData(int id)
	{
		string url = $"http://localhost:5000/api/player/{id}";
		UnityWebRequest req = UnityWebRequest.Get(url);
		
		yield return req.SendWebRequest();
		
		if (req.result == UnityWebRequest.Result.Success)
    	{
	    	Debug.Log("플레이어 정보: " + req.downloadHandler.text);
		}
    	else
    	{
			Debug.LogError("에러: " + req.error);
    	}
}
profile
자라고 있는 게임개발자

0개의 댓글