재우니의 블로그

대한민국, 광안대교, Korea

 

 

아래는 C#에서 Repository 패턴을 활용하여 StarCraft 게임을 구현한 예시 코드입니다. 이 예시 코드는 간단한 유닛(Unit) 관리 시스템을 포함하고 있습니다.

 

using System;
using System.Collections.Generic;

// 유닛 모델
class Unit
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Race { get; set; }
}

// Repository 인터페이스
interface IUnitRepository
{
    Unit GetById(int id);
    List<Unit> GetAll();
    void Add(Unit unit);
    void Update(Unit unit);
    void Delete(int id);
}

// Repository 구현체
class UnitRepository : IUnitRepository
{
    private List<Unit> units;

    public UnitRepository()
    {
        units = new List<Unit>();
    }

    public Unit GetById(int id)
    {
        return units.Find(unit => unit.Id == id);
    }

    public List<Unit> GetAll()
    {
        return units;
    }

    public void Add(Unit unit)
    {
        units.Add(unit);
    }

    public void Update(Unit unit)
    {
        Unit existingUnit = units.Find(u => u.Id == unit.Id);
        if (existingUnit != null)
        {
            existingUnit.Name = unit.Name;
            existingUnit.Race = unit.Race;
        }
    }

    public void Delete(int id)
    {
        units.RemoveAll(unit => unit.Id == id);
    }
}

// 유닛 서비스
class UnitService
{
    private IUnitRepository unitRepository;

    public UnitService(IUnitRepository repository)
    {
        unitRepository = repository;
    }

    public void CreateUnit(int id, string name, string race)
    {
        Unit newUnit = new Unit
        {
            Id = id,
            Name = name,
            Race = race
        };

        unitRepository.Add(newUnit);
        Console.WriteLine("유닛 생성 완료.");
    }

    public void UpdateUnit(int id, string name, string race)
    {
        Unit existingUnit = unitRepository.GetById(id);
        if (existingUnit != null)
        {
            existingUnit.Name = name;
            existingUnit.Race = race;
            unitRepository.Update(existingUnit);
            Console.WriteLine("유닛 업데이트 완료.");
        }
        else
        {
            Console.WriteLine("해당 ID의 유닛이 존재하지 않습니다.");
        }
    }

    public void DeleteUnit(int id)
    {
        unitRepository.Delete(id);
        Console.WriteLine("유닛 삭제 완료.");
    }

    public void ListAllUnits()
    {
        List<Unit> units = unitRepository.GetAll();

        Console.WriteLine("전체 유닛 목록:");
        foreach (Unit unit in units)
        {
            Console.WriteLine($"ID: {unit.Id}, 이름: {unit.Name}, 종족: {unit.Race}");
        }
    }
}

class Program
{
    static void Main()
    {
        IUnitRepository unitRepository = new UnitRepository();
        UnitService unitService = new UnitService(unitRepository);

        unitService.CreateUnit(1, "마린", "테란");
        unitService.CreateUnit(2, "저글링", "저그");
        unitService.CreateUnit(3, "질럿", "프로토스");

        unitService.ListAllUnits();

        unitService.UpdateUnit(2, "배틀크루저", "저그");

        unitService.ListAllUnits();

        unitService.DeleteUnit(3);

        unitService.ListAllUnits();
    }
}

 

 

위의 코드에서는 Unit 클래스를 정의하여 각 유닛의 속성을 나타냅니다. IUnitRepository 인터페이스는 유닛 관련 데이터 액세스 작업에 대한 메서드를 정의하고, UnitRepository 클래스는 해당 인터페이스를 구현하여 실제 데이터 저장소를 관리합니다. 여기서는 List<Unit>를 사용하여 간단한 메모리 기반 저장소를 구현했습니다.

 

UnitService 클래스는 유닛 관련 비즈니스 로직을 담고 있습니다. CreateUnit, UpdateUnit, DeleteUnit, ListAllUnits 등의 메서드를 통해 유닛을 생성, 업데이트, 삭제하고 전체 유닛 목록을 출력합니다.

 

Program 클래스에서는 UnitRepository 인스턴스를 생성하여 UnitService에 주입합니다. 그런 다음 UnitService를 통해 유닛을 생성, 업데이트, 삭제하고 목록을 출력합니다. 이 예시 코드에서는 몇 가지 유닛을 생성하고, 업데이트 및 삭제를 수행한 후 전체 유닛 목록을 표시하는 예시가 포함되어 있습니다.

 

 

 

 

 

장점:

  1. 데이터 액세스 로직과 비즈니스 로직을 분리: Repository 패턴을 사용하면 데이터 액세스 관련 코드를 분리하여 유지 보수 및 테스트를 용이하게 만들 수 있습니다. 비즈니스 로직은 Repository를 통해 데이터에 접근하고 변경하는데 집중할 수 있습니다.
  2. 데이터 액세스의 추상화: Repository는 데이터 저장소에 대한 추상화 계층을 제공하여 코드의 유연성을 높이고 데이터 저장소의 구체적인 구현 세부 사항에 대한 의존성을 낮출 수 있습니다.
  3. 재사용성과 확장성: Repository 패턴은 코드를 재사용하기 쉽게 만들어주고, 새로운 데이터 저장소 유형을 추가할 때도 변경 범위를 최소화하여 확장성을 갖춘 코드를 작성할 수 있습니다.

 

 

단점:

  1. 복잡성 추가: Repository 패턴은 추가적인 추상화 계층을 도입하기 때문에 일부 개발자에게는 복잡성을 증가시킬 수 있습니다. 작은 규모의 애플리케이션에는 과도한 추상화가 필요하지 않을 수 있습니다.
  2. 일부 성능 저하: Repository 패턴은 데이터 액세스를 위해 중간 계층을 도입하기 때문에 일부 성능 저하가 발생할 수 있습니다. 데이터 액세스 작업이 단순하고 직접적으로 수행되어야 하는 경우에는 Repository 패턴이 필요하지 않을 수 있습니다.

 

요약하기

 

Repository 패턴은 프로젝트의 규모와 요구 사항에 따라 적절하게 적용해야 합니다. 큰 규모의 프로젝트에서는 데이터 액세스 로직을 분리하고 확장성과 유지 보수성을 개선하기 위해 Repository 패턴을 고려할 가치가 있습니다. 그러나 작은 규모의 프로젝트에서는 단순한 데이터 액세스 코드만으로 충분할 수 있습니다.