# 12. 메타시스템 — 수상한 잡화점 > **작성일**: 2026-04-17 > **작성자**: 개발팀장 > **상태**: v1 (초판, Phase 0-B 연계 문서) > **대상**: 세이브/로드 · 진행도 · 상점 · 성장(장비·각성·인장) · 시즌패스 · 탐험 · 출석 > **관련 문서**: `05_서버연동_현황_v1.md`, `09_카드시스템_아키텍처_v1.md`, `10_데이터로딩_구조_v1.md`, `11_UI아키텍처_v1.md` --- ## 1. 목적 (P18 §결정의 배경) 수상한 잡화점의 **비전투(메타) 시스템** 전체 계층을 식별하여: 1. 전투(08) · 카드(09) · 데이터(10) · UI(11)에 이은 Phase 0-B 최종 완결 2. 서버 역할 문서(05·PD 지시 #30·#31)와의 **메타 시스템 측 대응표** 제공 3. 차기 프로젝트 프레임워크 `NerdNavis.Save`·`NerdNavis.Economy` Tier 2 설계에 필요한 **실증 패턴** 공급 4. 기획 밸런싱·유저 경험 변경 시 **영향 범위 식별 SOT** ## 2. 메타시스템 전체 맵 ``` 메타시스템 = "전투 외 유저 진행·성장·경제 시스템" ┌─────────────────────────────────────────────────────────────┐ │ 클라이언트 로컬 상태 (Assets/Script/Info/) │ │ ├── ActorInfo — 캐릭터·영웅 상태 │ │ ├── InGameInfo — 인게임 진행 상태 │ │ ├── InappInfo — 인앱 결제 영수증·트랜잭션 │ │ ├── OptionInfo — 유저 옵션(사운드·언어·그래픽) │ │ ├── TitleInfo — 타이틀·공지 │ │ ├── ADInfo — 광고 상태 │ │ ├── SoundInfo, WebViewInfo, UtilInfo, Popup, NetWait │ │ └── (*.Info 단일 데이터 클래스 + 매니저 스타일) │ └─────────────────────────────────────────────────────────────┘ ↕ (마스터 테이블 조회, 10 문서) ┌─────────────────────────────────────────────────────────────┐ │ 서버 연동 (Assets/Script/Server/) │ │ ├── ServerClass.cs — 서버 응답/요청 DTO │ │ ├── ServerInfo.cs — 서버 상태·세션 관리 │ │ └── (PlayFab 전제, 05 문서 및 서버 지시서 v1.1/v1.2 참조) │ └─────────────────────────────────────────────────────────────┘ ↕ (UI 표시, 11 문서) ┌─────────────────────────────────────────────────────────────┐ │ UI 계층 (Assets/Script/UGUI/Lobby/) │ │ └── 본 문서 §4 각 시스템별 UI 매핑 │ └─────────────────────────────────────────────────────────────┘ ``` ## 3. 세이브/로드 구조 ### 3-1. 현 구조 (PlayFab 중심) - **원본**: PlayFab(`UserData`/`TitleData`/`PlayerStatistics`) — 서버 지시서 v1.1 §4·§5 기준 - **로컬 캐시**: `Info/*.Info` 각 클래스 내부에 필드 보존 + 필요 시 `PlayerPrefs` 부분 저장(옵션·로컬 전용) - **인코딩**: JSON(PlayFab 기본 직렬화) + `My/CryptoUtil.cs` 적용분은 일부 (세이브 전반 체계화 안 됨) ### 3-2. 약점·리스크 1. **SOT 분리 모호** — `*.Info` 클래스가 "런타임 상태 + 저장 대상" 이중 역할 2. **세이브 스키마 버전 관리 부재** — 필드 추가/제거 시 마이그레이션 전략 없음 3. **로컬/서버 동기화 타이밍이 호출부에 산재** — 조회 시마다 서버 호출 or 캐시 사용 판단 분산 ### 3-3. Tier 2 `NerdNavis.Save` 설계 반영 포인트 - `ISaveProvider` 인터페이스 (PlayerPrefs / JSON / 암호화 / 클라우드) - 버전 마이그레이션 훅(`IMigration`) 신설 - 세이브 대상 POCO와 런타임 상태 클래스 분리 (DTO 패턴) ## 4. 진행도 · 성장 · 경제 시스템 (영역별) ### 4-1. 영웅·카드·장비·각성·인장 (성장) | 시스템 | 클라 코드 위치 | UI 클러스터 | 마스터 테이블 | |--------|--------------|-----------|-------------| | 영웅 (Hero) | `Info/ActorInfo.cs` + 스킬·스펙 서브 | `Lobby/MainMenu/1_Hero/` | Hero, Skill, HeroSkill | | 카드 (Card) | 09 문서 런타임 모듈 + `Info/` | `Lobby/MainMenu/2_Card/` | Card, CardEffect | | 장비 (Equipment) | `Info/`·CatTrade 관련 | `Lobby/MainMenu/3_Equipment/`·`Lobby/CatTrade/CatTradeUI_Equipment.cs` | Equipment, EquipmentOption | | 미션 (Mission) | `Info/`·`CatTradeUI_MainMission` | `Lobby/MainMenu/4_Mission/`·`Lobby/CatTrade/CatTradeUI_MainMission.cs` | Mission, MissionReward | | 인장 (Seal) | CatTrade Seal 서브 | `Lobby/CatTrade/CatTradeUI_Seal.cs`·`GetSealUI.cs`·`SealRoulleteCard.cs`·`SealSlotScroller.cs` | Seal, SealOption | ### 4-2. 상점 (CatTrade — 고양이 상인) - **구조**: 단일 상인이 5개 카테고리(재화·장비·인장·메인 미션 + 공통 Goods) 통합 제공 - **UI 클러스터**: `Lobby/CatTrade/` 11개 스크립트 (로비 최대 클러스터, 11 문서 §6-2 참조) - **특수 로직**: - 인장 룰렛(`SealRoulleteCard`·`SealSlotScroller`): 슬롯머신 연출 — 확률 기반 획득 - 장비 구매 팝업(`CatTradeEquipmentBuyPopup`) + 기존 보유 장비 비교(`EquipmentTradeInvenCard`) ### 4-3. 탐험 (Explore — 스테이지 선택) - **구조**: 맵 → 스테이지 노드 선택 → 전투 진입 or 이벤트 - **UI 클러스터**: `Lobby/Explore/` 7개 스크립트 (11 문서 §6-3) - **저장 대상**: - 현재 탐험 지도 ID·해제된 노드 - 각 노드 클리어 여부·최고 스코어(3성 조건 달성) - 탐험 보상 수령 이력 - **P17 연계**: 스테이지별 ★ 조건 배치는 마스터 테이블(기획팀 `Stage`·`StarCondition`)에서 읽어 `ExploreUI_StageSelect`에 표시 ### 4-4. 시즌 패스 - **UI**: `Lobby/SeasonPass/SeasonPassUI.cs`·`SeasonPassCard.cs` - **저장 대상**: 현재 시즌 ID·시즌 진행도 경험치·무료/유료 트랙별 수령 레벨 - **서버 동기화 필요**: 시즌 교체·유료 트랙 결제 영수증 (PlayFab) ### 4-5. 출석 - **UI**: `Lobby/Attandance/AttandanceUI.cs`·`AttandanceCard.cs` - **저장 대상**: 현재 월/회차·연속 출석일·수령 이력 - **서버 시간 의존**: 날짜 조작 방지 위해 서버 시간 기준 (서버 지시서 §3 참고) ## 5. 재화·경제 시스템 ### 5-1. 재화 종류 - 수상한 잡화점은 **복수 재화 체계** (골드·다이아·이벤트 화폐·카드 조각 등) - 현 구조: `Info/*.Info` 내 변수 + 마스터 테이블 `Goods`·`Currency` 참조 추정 - 표시 UI: `Lobby/LobbyTopUI.cs` + `Lobby/MoneyCard.cs` + 인게임 `IngameTopUI.cs` ### 5-2. 획득 경로 - 전투 클리어(`Ingame/Result/StageClearRewards`) - 탐험 보상(`Lobby/Explore/ExploreRewardPopup`) - 상점 구매(`Lobby/CatTrade/MerchantBuyPopup` 포함) - 인앱 결제(`Info/InappInfo.cs` + PlayFab 영수증 검증) - 광고 시청(`Info/ADInfo.cs`) - 출석·시즌 패스 보상 ### 5-3. 차기 프로젝트 흡수 (`NerdNavis.Economy`) - `Goods` 범용 재화 모델 (타입·수량·최대치·오버플로 정책) — 01 설계안 §6-0 기정립 - 인벤토리·획득 이벤트 훅(`EventBus` 연동) - **본 프로젝트 특수 로직(재화 종류·상점 UX)은 흡수 불가** — 프레임워크는 "재화 모델 컨테이너"만 제공 ## 6. 서버 연동 상태 (05 문서 연계) ### 6-1. 현 서버 범위 (PlayFab) - 세션/인증 → `ServerInfo.cs` - 유저 데이터 로드/저장 → `ServerClass.cs` DTO 매핑 - 스테이지 결과 기록 → `Save_StageResult` API (서버 지시서 §6 샘플) - 인앱 영수증 검증 → PlayFab 영수증 검증 ### 6-2. 서버 역할 경계 (서버 지시서 §5·§6) - **클라 100% 책임**: 어뷰징 판정 (`is_abuse_flag`만 서버 전송, 경계값 보관·검증 안 함) - **서버 100% 책임**: 시간 기반 판정(출석·시즌 만료) · 영수증 검증 · 로그 집계 - **양쪽 책임**: 세이브 동기화 (클라 전송 + 서버 검증 최소 필터) ## 7. 메타시스템 의존성 그래프 (핵심 흐름) ``` 로그인 → Title_Mgr ↓ (서버 인증 → PlayFab) ServerInfo.Login → *.Info 다중 로드 ↓ (마스터 테이블 로드, 10 문서) DataCheckMgr·AddrResourceMgr ↓ LobbyUIManager.Initialize ├→ LobbyTopUI (재화 표시) ├→ MainMenu (영웅·카드·장비·미션 탭) ├→ CatTrade (상점 진입) ├→ Explore (탐험 진입) │ ↓ (스테이지 선택) │ IngameUIManager → 08 전투 FSM │ ↓ (전투 종료) │ StageClearRewards → *.Info 갱신 → ServerClass 전송 │ ↓ │ LobbyUIManager 복귀 ├→ SeasonPass / Attandance (보상 수령) └→ Option/WebView 등 ``` ## 8. 기획 연동 포인트 (밸런싱·UX 변경 영향 범위) | 기획 변경 범주 | 영향 메타 모듈 | |---------------|--------------| | 재화 밸런스 (획득량·환율) | `Info/*.Info` 재화 필드 + `LobbyTopUI`·`MoneyCard`·`IngameTopUI` + 상점 UI 전체 | | 성장 곡선 (장비 레벨·인장 등급) | `MainMenu_Equipment`·`CatTrade Seal 계열` + 마스터 테이블 `Equipment`·`Seal` | | 시즌 패스 트랙 구성 | `SeasonPassUI`·`SeasonPassCard` + 서버 시즌 ID 갱신 | | 출석 보상 트랙 | `AttandanceUI`·`AttandanceCard` + 서버 시간 의존 | | 탐험 맵 구조 (노드·분기) | `ExploreUI_Map`·`ExploreStageCard` + 마스터 `ExploreMap`·`Stage` | | 상점 가격·확률 (룰렛 등) | `CatTrade*` 전체 + 마스터 `Shop`·`Seal` | ## 9. 프레임워크 흡수 계획 (Tier 2 설계 반영) | 프레임워크 모듈 | 수상한 잡화점 출처 | 흡수 수준 | |--------------|------------------|---------| | `NerdNavis.Save.ISaveProvider` | 현 `*.Info` + PlayFab 호출 패턴 | 🟡 신규 인터페이스 (기존 구조는 참고만) | | `NerdNavis.Save.IMigration` | 없음 (부재 자체가 교훈) | 🔴 신규 설계 | | `NerdNavis.Economy.Goods` | `MoneyCard`·재화 Info 필드 | 🟢 구조 계승, 네이밍만 변경 | | `NerdNavis.Economy.Inventory` | 장비·인장·카드 목록 패턴 | 🟡 범용 컨테이너 추출 | | `NerdNavis.Network.IReceiptVerifier` | `Info/InappInfo.cs` + PlayFab 영수증 | 🟡 Tier 3 편입 (서버팀 합류 시점) | ## 10. 현 프로젝트에서의 차기 개선 안건 (차기 프로젝트 참고 자료) > 헌법 제1원칙 목표 2 원칙 B: 수상한 잡화점 인사이트를 차기 프로젝트 참고 자료로. 1. `*.Info` 단일 클래스에 "런타임 상태 + 직렬화 대상 + 서버 통신 DTO"를 모두 담는 구조는 차기 프로젝트에서 **반드시 분리** (DTO + 상태 + 리포지토리 3계층) 2. 세이브 버전 관리 부재 → 차기 프로젝트 `IMigration` 훅 필수 3. 서버/클라 동기화 타이밍이 호출부에 분산 → 차기 프로젝트는 **중앙 동기화 매니저** 도입 4. 재화 종류가 하드코딩(필드 단위) → 차기 프로젝트는 `Goods` 범용 모델 + 타입 enum 기반 Dictionary 저장 ## 11. 검증 방법 (P18 §검증) 1. 각 Info/Server/UGUI 파일 경로는 실제 Unity 프로젝트에서 실존 확인 완료 (작성 시 `ls` + `find` 실측) 2. `find` 기반으로 `PlayFab`·`SaveData`·`UserData` 키워드를 검색한 결과는 `ServerClass.cs`·`ServerInfo.cs`·`Info/` 6개 파일로 집중됨 — 본 문서 §2 구조와 일치 3. 마스터 테이블 이름은 10 문서(데이터 로딩) 및 서버 지시서 §6 샘플을 교차 참조하여 추정 (기획팀 테이블 정의 재확인 필요 표시) ## 12. 기각안 (P24 §기각안) - **기각안 A: 각 Info 클래스의 필드별 세이브 대상 분류표 작성** — 토큰 비용 + 프레임워크 흡수 대비 정보량 과다. 구조 수준 분류로 대체. 필요 시 Phase 0-C에서 세부 감사 - **기각안 B: 서버 API 전수 매핑** — 서버 지시서 v1.1/v1.2가 별도 SOT로 존재. 본 문서는 클라 메타 구조에 집중 - **기각안 C: 메타시스템 보안 취약점 감사** — `05_서버연동_현황_v1.md` Critical 3건이 이미 추적 중(#2 보류). 본 문서는 중복 분석 안 함 ## 부록 A. 변경 이력 - **v1 (2026-04-17)**: 초판. 개발팀장 Phase 0-B 최종 완결 작업(B-5)으로 작성. Unity 프로젝트 `Assets/Script/` 전수 `ls` + 키워드 `find` 실측 기반. 서버 지시서 v1.1/v1.2·05 문서·09·10·11 문서 교차 참조.