game/prompt/46_shop_refactoring.md

2.0 KiB

46. 상점 시스템 리팩토링 및 예외 처리 (Shop System Refactoring & Error Handling)

1. 목표 (Goal)

  • BattleProvider에 집중된 상점 관련 로직을 ShopProvider로 분리하여 **관심사의 분리(Separation of Concerns)**를 실현합니다.
  • 아이템 획득(보상/구매) 시 인벤토리 가득 참이나 골드 부족 등의 예외 상황에 대해 명확한 에러 메시지(UI 피드백)를 제공합니다.

2. 구현 상세 (Implementation Details)

A. 상점 로직 분리 (ShopProvider)

  • 파일: lib/providers/shop_provider.dart 생성.
  • 이동된 기능:
    • generateShopItems: 스테이지 티어에 따른 상점 아이템 목록 생성.
    • rerollShopItems: 골드 소모 후 아이템 목록 갱신.
    • buyItem: 골드 차감 및 인벤토리 추가 로직.
  • 구조 변경:
    • BattleProvider는 더 이상 BuildContext를 직접 참조하거나 상점 상태를 관리하지 않습니다.
    • main.dart에서 ChangeNotifierProxyProvider를 사용하여 ShopProviderBattleProvider에 주입(Injection)합니다.

B. 예외 처리 및 UI 피드백

  • 반환값 변경 (bool):
    • BattleProvider.selectReward: 인벤토리 가득 찰 시 false 반환.
    • ShopProvider.buyItem: 골드 부족 또는 인벤토리 가득 찰 시 false 반환.
  • UI 반영 (BattleScreen, ShopUI):
    • 메서드가 false를 반환할 경우 ScaffoldMessenger를 통해 붉은색 SnackBar로 에러 메시지를 출력합니다.
    • 예: "Inventory is full! Cannot take item.", "Purchase failed! Check inventory or gold."

3. 결과 (Result)

  • 코드 품질: 거대해지던 BattleProvider의 책임을 분산시켜 유지보수성을 높였습니다.
  • 안정성: BattleProviderBuildContext 의존성을 제거하여 잠재적인 컨텍스트 관련 오류를 해결했습니다.
  • 사용자 경험: 아이템 획득 실패 시 명확한 피드백을 제공하여 답답함을 해소했습니다.