# 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` 의존성을 제거하여 잠재적인 컨텍스트 관련 오류를 해결했습니다.
- **사용자 경험:** 아이템 획득 실패 시 명확한 피드백을 제공하여 답답함을 해소했습니다.
