# 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`를 사용하여 `ShopProvider`를 `BattleProvider`에 주입(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`의 책임을 분산시켜 유지보수성을 높였습니다. - **안정성:** `BattleProvider`의 `BuildContext` 의존성을 제거하여 잠재적인 컨텍스트 관련 오류를 해결했습니다. - **사용자 경험:** 아이템 획득 실패 시 명확한 피드백을 제공하여 답답함을 해소했습니다.