C#/C#프로젝트

[TeamProject2] 기능 나열형 코드를 MVC 패턴으로 구조화

도도돋치 2025. 4. 28. 21:12
Contents 접기
728x90

TextRPG 프로젝트 초기 단계에서, 모든 기능이 하나의 메인 클래스 또는 절차적 코드에 집중되어 있었다.


맵 이동, 전투 시스템, 아이템 사용 등 주요 기능이 구분 없이 나열되었고 이로 인해 코드의 복잡성이 증가하고 유지보수성이 떨어지는 문제가 발생했다.

 

문제 상황

초기 개발 단계에서는 맵 이동, 전투, 아이템 사용 등 게임의 주요 기능이 한 파일 또는 몇 개의 클래스에 몰아넣어진 형태로 구현되었다.

 

이로 인해 다음과 같은 문제가 발생했다:

 

  • 코드가 한 파일에 집중되어 가독성이 떨어짐
  • 전투/아이템/플레이어 기능들이 명확히 분리되지 않고 얽혀 있음
  • 기능 추가 시 기존 코드에 직접 수정이 필요하여, 수정 범위가 넓어지고 오류 가능성 증가

 

원인 분석

  • 초기 설계 부재: 구조화 없이 빠른 개발에 초점을 맞춤
  • 단일 책임 원칙(SRP) 위반: 하나의 클래스가 여러 역할을 동시에 수행
  • 코드 의존성 증가: 데이터와 로직이 섞여서 독립적 관리 불가

 

해결 방법

이러한 문제를 해결하기 위해 MVC (Model-View-Controller) 패턴을 적용하여 구조를 리팩토링했다.

 

1. Model: 데이터와 로직 분리

  • Player, Monster, Item 클래스를 별도의 Model Layer로 분리
  • 모든 게임 데이터(플레이어 상태, 몬스터 HP 등)는 Model이 관리
public class Player
{
    public int Hp { get; private set; }
    public int Attack { get; private set; }
}

 

2. View: 화면 출력 담당

  • UI 출력 기능(Console.WriteLine 기반)을 UIManager 등 View 전용 클래스로 이동
  • 데이터는 View에 주입되고, View는 단순히 출력만 담당
public class UIManager
{
    public void ShowPlayerStatus(Player player)
    {
        Console.WriteLine($"HP: {player.Hp}");
    }
}

 

3. Controller: 흐름과 입력 제어

  • 플레이어 입력을 처리하고, 상태에 따라 Model을 업데이트
  • MonsterBattleManager, InventoryManager 등 컨트롤러 계층에서 입력/로직 제어 담당
public class MonsterBattleManager
{
    private Player player;
    private UIManager uiManager;

    public MonsterBattleManager(Player player, UIManager uiManager)
    {
        this.player = player;
        this.uiManager = uiManager;
    }

    public void StartBattle()
    {
        // 전투 로직 수행
        uiManager.ShowPlayerStatus(player);
    }
}

 

 

결과

  • 가독성 향상: Model, View, Controller가 명확히 구분되어 코드를 이해하고 추적하기 쉬워짐
  • 유지보수성 강화: 클래스들이 단일 책임을 가지게 되었고 기능 추가 시 관련 계층만 수정하면 되어 수정 범위가 명확해짐
  • 확장성 증가: 보스 전투, 스킬 시스템 등 새로운 기능을 기존 구조를 크게 수정하지 않고 추가 가능

 

 

얻은 교훈

  • 프로젝트 초기 단계에서도 구조적 설계는 필수적이다.
  • 기능이 많아질수록 객체별 기능 분리를 더욱 신경써야한다.
728x90