11 KiB
수상한 잡화점 — NerdNavis.Framework 추출 대상 선별
🟢 2026-04-17 완료 실적 아카이브 — Tier 1 16/16 반영 종료
본 문서는 수상한 잡화점 소스에서 코어 프레임워크로 추출할 대상을 식별한 원 가이드로, Tier 1 기반 Core 4종 + Attribute 3종 + Util 6종 + Event 2종 + Container 3종 + Data 5종 = 총 19 파일·16 모듈 구현 완료 시점(2026-04-17)에 "완료 실적" 성격으로 전환됨. 각 추출 항목은 아래 본문에서 구현 위치 역참조로 연결됨 (📦 표기). 구현 상세는
코어코드/NerdNavis.Framework/CHANGELOG.md참조.차기 프로젝트에서 Tier 2(Addressable·UGUI·Security)·Tier 3(Network) 추가 추출 시 본 문서 구조(A/B/C/D 등급 분류·변형 포인트·네이밍 규칙)를 재사용 가능 (헌법 제1원칙 목표 2 원칙 A).
작성일: 2026-04-14 상위 문서:
01_아키텍처_개요_v1.md목적: 수상한 잡화점 Unity 프로젝트 코드에서 신규 코어로 편입할 범용 패턴 식별·분류 원칙: 코드·구조 참고는 가능, 네이밍은 재작성 필수 (PD님 확정) 주의: 수상한 잡화점 프로젝트에는 이 코어를 적용하지 않음. 추출은 다음 프로젝트에서 사용할 코어용.
1. 등급 분류
| 등급 | 의미 | 조치 |
|---|---|---|
| A. 즉시 추출 | 범용성 높음 + 의존성 최소 | 코어에 바로 재작성 편입 |
| B. 프레임워크 래핑 | 패턴은 범용, 단순화·제네릭화 필요 | 구조 참고 + 재설계 |
| C. 선별 추출 | 게임 로직과 범용 로직 혼재 | 범용 메서드만 분리 흡수 |
| D. 도메인 잔류 | 프로젝트 특수 개념 다수 | 코어 편입 제외, 프로젝트에 남김 |
2. 분류표 (13+개 대상 파일)
A. 즉시 추출 (6개)
| # | 원본 | 줄 수 | 신규 위치 | 변형 포인트 | 구현 상태 |
|---|---|---|---|---|---|
| 1 | My/MyCoroutine.cs |
52 | NerdNavis.Core.Coroutine.CoroutineRunner |
기존 NerdNavisCore CoroutineHandler와 통합, 일시정지·재시작·중복방지 1종 API |
✅ 2026-04-16 — 📦 Runtime/Core/Coroutine/CoroutineRunner.cs |
| 2 | My/CryptoUtil.cs |
86 | NerdNavis.Security.CryptoUtil (Tier 3 합류 시점) |
AES 키 하드코딩 제거 필수, ICryptoProvider 인터페이스 뒷받침, 키 주입 방식 |
⏸ Tier 3 대기 |
| 3 | Addressable/AddrHandleBase.cs |
102 | NerdNavis.Addressable.AddressableHandle<T> (Tier 2) |
참조 카운팅·Preload/Unload 정책 부가 | ⏸ Tier 2 대기 |
| 4 | Addressable/AddressableReleaseSelf.cs |
8 | NerdNavis.Addressable.AutoReleaseComponent (Tier 2) |
OnDestroy 훅 재작성, 주석처리 코드 제거 | ⏸ Tier 2 대기 |
| 5 | UGUI/Util/SafeArea.cs |
17 | NerdNavis.UI.Components.SafeAreaBorder |
기존 UIToolkit 버전과 병존, UGUI RectTransform 대응 | ⏸ Tier 2(UI) 대기 |
| 6 | Manager/ErrorLogHookManager.cs |
42 | NerdNavis.Core.Util.Log 내부 훅 |
Log 카테고리·필터와 통합, #if FGB_LIVE 같은 프로젝트 플래그 제거 |
✅ 2026-04-16 — 📦 Runtime/Core/Log/ 통합 |
B. 프레임워크 래핑 (2개)
| # | 원본 | 줄 수 | 신규 위치 | 변형 포인트 | 구현 상태 |
|---|---|---|---|---|---|
| 7 | Template/MonoBehaviourSingletonTemplate.cs |
30 | NerdNavis.Core.Patterns.MonoSingleton<T> |
4종 싱글톤(Sync/Async/Ready/Inner) 통합 (01문서 4-1 참조). MonoBehaviourSingletonuScrollViewMgr<T> 같은 변종 제거 |
✅ 2026-04-16 — 📦 Runtime/Core/Patterns/MonoSingleton.cs + ServiceLocator.cs |
| 8 | UGUI/BackKey/BackKeyAdd.cs |
67 | NerdNavis.UI.UGUI.BackKeyHandler |
BackKeyMgr 싱글톤 의존을 구독 패턴으로 재설계, 스택 기반 백키 처리 |
⏸ Tier 2(UI) 대기 |
🆕 2026-04-17 Tier 1 확장 구현 (본 원 가이드 범위 외 추가 추출)
Tier 1 완결을 위해 원 가이드에 없던 모듈 9종을 추가 설계·구현. 수상한잡화점 소스 역추적이 아닌 차기 프로젝트 범용성을 목적으로 한 신규 설계 (C11 범용성 원칙).
| 범주 | 모듈 | 구현 위치 | 근거 설계 |
|---|---|---|---|
| Attribute 3종 | ReadOnlyAttribute·ShowIfAttribute·ArrayTitleAttribute |
📦 Runtime/Core/Attribute/ |
인스펙터 UX 공통 패턴 |
| Util 6종 | EnumToInt(#12 일반화)·EnumEx·FormatEx·MathEx·KeyMaker·ValidationEx(#9 일반화) |
📦 Runtime/Core/Util/ |
박싱 회피 Unsafe.As<,>, : 구분자 표준, 순수 BCL |
| Event 2종 | EventBus·Raw/RawEventBus |
📦 Runtime/Core/Event/ |
04_Tier1_3종_상호작용_설계_v1.md §3 |
| Container 3종 | ObservableList·ObservableDictionary·ObservableQueue |
📦 Runtime/Core/Container/ |
기존 UniList·UniEventList·UniObserverList 3종 통합 대체, 세분화 이벤트 |
| Data 5종 | IDataRow·DataTable·DataTableSO·DataTableLoader·DataTableLoadedEvent |
📦 Runtime/Core/Data/ |
기존 MasterTableBase 재설계, 제네릭 키, RFC 4180 최소 CSV + JsonUtility |
테스트: NUnit 기반 총 19+ 파일 (Tests/Runtime/Core/{Attribute,Util,Event,Container,Data}/*Tests.cs).
C. 선별 추출 (4개 — 범용 메서드만 취함)
9. My/DSUtil.cs (1,406줄)
프로젝트 강결합(게임 테이블 참조, ObscuredTypes 의존, 게임 stage 로직)이 상당함. 범용 메서드만 흡수.
| 추출 후보 메서드 | 신규 위치 | 비고 |
|---|---|---|
CheckNull, Get_Clone, Format |
NerdNavis.Core.Util.ValidationEx / ObjectEx / FormatEx |
|
StringToEnum<T> |
NerdNavis.Core.Util.EnumEx |
캐시 적용 |
LogError 변종 |
NerdNavis.Core.Util.Log |
중앙 로거로 통합 |
| 제외 | GetStageInfo, ActorInfo류, 테이블 조회 |
수상한 잡화점 전용, 프로젝트 잔류 |
10. UGUI/Manager/uScrollViewMgr.cs + uScrollViewArrMgr.cs (합 116줄)
- 추출: 무한 스크롤 프레임워크 뼈대 (
Set_ScrollView<T>,ScrollTo) - 제거:
CardBase,DSUtil의존, 프로젝트 특화ClickCard/Select_Card - 신규 위치:
NerdNavis.UI.UGUI.InfiniteScrollView<T> - 변형: 제네릭 데이터 바인딩 인터페이스(
IScrollItem<T>)로 재설계
11. UGUI/Manager/UIAtlasMgr.cs (29줄)
- 추출:
Set(),Get_Sprite()스프라이트 아틀라스 관리 - 제거:
Get_EquipmentGrade_Sprite(),Get_CardGrade_Sprite()(게임 특수) - 신규 위치:
NerdNavis.UI.UGUI.SpriteAtlasRegistry
12. My/MyEnumToInt.cs (51줄)
- 추출: Enum → Int 캐싱 패턴 (박싱 회피)
- 신규 위치:
NerdNavis.Core.Util.EnumToInt<T> - 변형:
MyEnum구체 의존 제거, 제네릭 타입 파라미터로 일반화
D. 도메인 잔류 (추출 제외, 프로젝트에 남김)
| 원본 | 사유 |
|---|---|
My/MyEnum.cs (463줄) |
23개 enum 전부 수상한 잡화점 특수 (eStageNodeType, eStat, eStatusConditionsType 등). C11 오염, 코어 편입 금지 |
My/MyValue.cs (802줄) |
게임 테이블·스테이지 데이터 강결합. 프로젝트 설정값 모음 |
My/MyText.cs |
eStat/eElement 로컬라이제이션 — 게임 특수 |
UGUI/Common/GameUI.cs |
EffectMgr/MyValue 강결합, 게임 이펙트 로직 |
UGUI/Common/ControlUI.cs |
eControlUi 게임 특수 enum |
UGUI/Common/ScenarioUI.cs (43KB) |
시나리오 이벤트 시스템, 프로젝트 특화 |
UGUI/Common/TouchBlockUI.cs |
(재확인 필요 — 범용성 검토 후 추출 여부 재판정) |
3. 추출 시 공통 정리 원칙
3-1. 네이밍 규칙
My*접두사 전면 제거 (MyCoroutine→CoroutineRunner)u*소문자 시작 접두사 제거 (uScrollViewMgr→InfiniteScrollView)Mgr,_Mgr축약 → 풀 네임 (Mgr→Manager, 단 통용 시 유지 가능)_구분자 제거, PascalCase 준수 (Set_Coroutine→SetCoroutine)Regist*오탈자 →Register*- 기존
FilGoodBandits네임스페이스 모두 →NerdNavis.*로 재작성
3-2. 의존성 단절
- 수상한 잡화점 전용 enum/class 참조 전부 제거
ObscuredInt/ObscuredLong(ACTk) 참조는 선택 레이어로 재설계 (INumericProtection)- 테이블 조회(
table_*) 참조 제거, 데이터 추상 인터페이스(IDataTable)로 대체
3-3. 변형 방향
- 싱글톤 감소: 필요 최소 외에는 순수 클래스 + DI 패턴 친화로
- 이벤트 기반 통신:
EventBus적극 활용, 강결합 매니저 참조 회피 - 제네릭 우선:
UIAtlasMgr처럼 특정 도메인 하드코딩된 메서드는 제네릭 팩토리로 재설계
4. 추출 우선순위 (Tier 1 구현 순서 제안)
| 순번 | 추출 대상 | Tier | 이유 |
|---|---|---|---|
| 1 | MyCoroutine → CoroutineRunner | 1 | 다른 모듈이 의존하는 기반 |
| 2 | MonoBehaviourSingletonTemplate → MonoSingleton | 1 | 전반적으로 쓰임 |
| 3 | DSUtil 일부 → ValidationEx/ObjectEx/FormatEx/EnumEx | 1 | 유틸 기반 |
| 4 | MyEnumToInt → EnumToInt | 1 | 성능 유틸 |
| 5 | SafeArea (UGUI 버전) → SafeAreaBorder | 1 | UGUI 주력 방침 반영 |
| 6 | UIAtlasMgr → SpriteAtlasRegistry | 1 | UGUI 기본 인프라 |
| 7 | ErrorLogHookManager → Log 훅 통합 | 1 | 로깅 인프라 |
| 8 | BackKeyAdd → BackKeyHandler | 1 | UGUI 주력 관련 |
| 9 | uScrollView → InfiniteScrollView | 1 | 복잡도 중간 |
| 10 | AddrHandleBase → AddressableHandle | 2 | Addressable 모듈 |
| 11 | CryptoUtil → CryptoUtil (+ICryptoProvider) | 3 | 서버팀 합류 시점 |
5. 추출 후 수상한 잡화점 자체 정리 (별도 과제)
수상한 잡화점 프로젝트는 새 코어를 적용하지 않지만, 추출 과정에서 드러난 오염은 기록해 둠.
발견된 C11 관점 문제 (수상한 잡화점 내부)
- 네임스페이스 부재: 대부분 global namespace (SafeArea.cs만
FilGoodBandits) → 장기 리팩토링 대상 (우선순위 낮음, 기능에는 영향 없음) My*,u*접두사 혼재: 일관성 부족- 매니저 싱글톤 과다:
uScrollViewMgr,UIAtlasMgr,BackKeyMgr,EffectMgr,ProjectileMgr등 → 결합도 높음 - DSUtil 거대화(1,406줄): 유틸과 게임 로직이 혼재 → 장기 분해 대상
이 문제들은 이번 프로젝트에서 손대지 않음 (개발 중단 리스크). 추출 과정에서만 반영.
6. 다음 작업
| # | 작업 | 선행 조건 |
|---|---|---|
| 1 | PD님과 NAS Git 저장소 위치·접근 방식 협의 | 없음, 즉시 가능 |
| 2 | 패키지 스켈레톤 생성 (package.json, asmdef, 폴더 틀) |
저장소 위치 확정 |
| 3 | Tier 1 구현 시작 (위 4절 순번 1번부터) | 스켈레톤 완료 |
| 4 | 수상한 잡화점 개발 준비 (Phase 0-B/C) 재개 | Tier 1·2 진행 중 병행 가능 여부는 PD님 판단 |