아카샤 프레임워크 ISO 기능점수(Function Point) 평가 보고서
📊 측정 개요
- 측정 대상: Akasha Framework (Unity C# 게임 프레임워크)
- 측정 기준: ISO/IEC 20926:2009
- 측정 일자: 2026-01-16
- 프레임워크 경로: C:\Users\minyoung\Mer\Assets\AkashaScript
- 총 기능점수: 223 FP
- 규모 분류: 중규모 프레임워크
📋 목차
- 측정 방법론
- ILF - 내부 논리 파일
- EIF - 외부 인터페이스 파일
- EI - 외부 입력
- EO - 외부 출력
- EQ - 외부 조회
- 총 기능점수 요약
- 벤치마킹 분석
- 평가 및 분석
- 결론
측정 방법론
ISO/IEC 20926:2009 기능점수 측정 기준
5가지 기능 유형:
- ILF (Internal Logical Files): 경계 내에서 유지되는 데이터 및 제어정보
- EIF (External Interface Files): 어플리케이션 경계 밖에서 유지되는 데이터
- EI (External Inputs): 시스템으로 들어오는 데이터 처리
- EO (External Outputs): 보고서 생성 같은 외부 출력
- EQ (External Inquiries): 데이터 가공 없이 입출력하는 조회
복잡도 평가 기준:
- DET (Data Element Types): 데이터 요소 유형 개수
- RET (Record Element Types): 레코드 요소 유형 개수
- FTR (File Types Referenced): 참조 파일 유형 개수
복잡도별 가중치:
| 기능 유형 | 낮음 | 중간 | 높음 |
|---|---|---|---|
| ILF | 7 FP | 10 FP | 15 FP |
| EIF | 5 FP | 7 FP | 10 FP |
| EI | 3 FP | 4 FP | 6 FP |
| EO | 4 FP | 5 FP | 7 FP |
| EQ | 3 FP | 4 FP | 6 FP |
1️⃣ ILF (Internal Logical Files) - 내부 논리 파일
측정 결과
| # | ILF 명칭 | DET | RET | 복잡도 | FP | 파일 경로 |
|---|---|---|---|---|---|---|
| 1 | BaseModel | 10 | 4 | 높음 | 15 | Aggregate/Controller/BaseModel.cs |
| 2 | RxMod<T> | 10 | 4 | 높음 | 15 | RxProperty/RxDataType/RxMod.cs |
| 3 | RxList<T> | 7 | 3 | 중간 | 10 | RxProperty/RxDataType/RxList.cs |
| 4 | RxDictionary<K,V> | 7 | 3 | 중간 | 10 | RxProperty/RxDataType/RxDictionary.cs |
| 5 | VariationRegistry | 7 | 3 | 중간 | 10 | Support/Data/VariationRegistry.cs |
| 6 | DefinitionRegistry<T> | 4 | 2 | 낮음 | 7 | Support/Data/DefinitionRegistry.cs |
| 7 | ModSet | 16 | 4 | 높음 | 15 | Support/ModSets/Core/ModSet.cs |
| 8 | ModSetManager | 9 | 3 | 중간 | 10 | Support/ModSets/ModSetManager.cs |
| 9 | ItemDefinition | 8 | 2 | 중간 | 10 | Substance/Item/ItemDefinition.cs |
| 10 | BaseSubModel | 6 | 2 | 중간 | 10 | Aggregate/Controller/BaseSubModel.cs |
ILF 소계: 112 FP
상세 분석
1. BaseModel (15 FP - 높음)
구조:
- rxDataByName: Dictionary<string, RxData> (초기 용량 16)
- modifiableFields: Dictionary<string, IModifiable> (초기 용량 16)
- computedFields: HashSet<RxBase> (초기 용량 8)
- subModels: List<ISubModel> (초기 용량 4)
핵심 기능:
- RegisterRx(): RxData 등록 (중복 검사, 자동 분류)
- RegisterSubModel<T>(): SubModel 등록 및 초기화
- GetRxDataByName(): 필드명으로 조회 (SubModel 필드 포함, "SubModelName.FieldName" 지원)
- TrySetRxDataValue(): 동적 값 설정 (타입 안전성)
- RemoveAllModifiers(): 모든 Modifier 제거
복잡도 근거:
- DET: 10개 (Dictionary 키/값, List 요소, 각종 메타데이터)
- RET: 4개 (RxData, IModifiable, Computed, SubModel)
2. RxMod<T> (15 FP - 높음)
구조:
- baseValue: T
- cachedValue: T
- originAddModifiers: Dictionary<string, float> (초기 8)
- addMultiplierModifiers: Dictionary<string, float> (초기 8)
- multiplierModifiers: Dictionary<string, float> (초기 8)
- finalAddModifiers: Dictionary<string, float> (초기 8)
계산 공식:
result = (base + originAdd) * addMult * mult + finalAdd복잡도 근거:
- DET: 10개 (baseValue, cachedValue, 4개 Dictionary의 키/값)
- RET: 4개 (4단계 Modifier 타입)
3. ModSet (15 FP - 높음)
구조:
- ModSetId, DisplayName: string
- Tags: IReadOnlyCollection<string>
- Modifications: IReadOnlyList<StatModification>
- MaxStackCount, IsStackable: int, bool
- Duration, ApplicationMode, DelayTime: float, enum, float
- DirectActions, PeriodicActions: IReadOnlyList<IAction>
- IsPersistent: bool
- Callbacks: OnApply, OnRemove, OnUpdate
복잡도 근거:
- DET: 16개 (다양한 타입, 콜백, 조건)
- RET: 4개 (StatModification, Actions, Callbacks, Tags)
2️⃣ EIF (External Interface Files) - 외부 인터페이스 파일
측정 결과
| # | EIF 명칭 | DET | RET | 복잡도 | FP | 설명 |
|---|---|---|---|---|---|---|
| 1 | Google Sheets API | 3 | 2 | 낮음 | 5 | TSV Export 엔드포인트 |
| 2 | Addressables System | 4 | 3 | 중간 | 7 | Unity Addressables API |
| 3 | UnityWebRequest | 5 | 2 | 낮음 | 5 | HTTP 통신 |
EIF 소계: 17 FP
상세 분석
1. Google Sheets API (5 FP - 낮음)
연계 정보:
- Spreadsheet ID, Sheet ID, Export Format (TSV)
- GET 요청으로 TSV 데이터 다운로드
- GoogleSheetsDownloader.cs에서 사용
2. Addressables System (7 FP - 중간)
연계 정보:
- AddressableKey, AssetReference, LoadSceneMode
- Unity의 Addressables 시스템과 완전 통합
- Controller, WorldSubstance, Presenter에서 사용
3. UnityWebRequest (5 FP - 낮음)
연계 정보:
- URL, Method, Headers, ResponseCode, DownloadHandler
- HTTP 통신에 사용
3️⃣ EI (External Inputs) - 외부 입력
측정 결과
| # | 트랜잭션 명칭 | DET | FTR | 복잡도 | FP | 파일 경로 |
|---|---|---|---|---|---|---|
| 1 | CreateModel<T>() | 2 | 3 | 중간 | 4 | Support/Data/DataManager.cs:106 |
| 2 | ApplyVariationData() | 12-22 | 4 | 높음 | 6 | Support/Data/DataManager.cs:151 |
| 3 | ApplyModSet() | 4 | 5 | 높음 | 6 | Support/ModSets/ModSetManager.cs:51 |
| 4 | SpawnAsync<T>() | 4 | 5 | 높음 | 6 | AggregateManagement/Substance/WorldSubstanceManager.cs:49 |
| 5 | SpawnFromDataSubstanceAsync() | 4 | 5 | 높음 | 6 | AggregateManagement/Substance/WorldSubstanceManager.cs:103 |
| 6 | DownloadSheetAsTSV() | 2 | 3 | 중간 | 4 | Support/Data/Editor/GoogleSheetsDownloader.cs:14 |
| 7 | DefinitionImporter.Import() | 150+ | 4 | 높음 | 6 | Support/Data/Editor/ItemDefinitionImporter.cs |
| 8 | RegisterRuntime<T>() | 2 | 2 | 낮음 | 3 | Support/Data/DataManager.cs:405 |
EI 소계: 41 FP
상세 분석
2. ApplyVariationData() (6 FP - 높음)
입력 데이터:
- Model 타입 (T)
- Variation 이름 (string)
- Model의 모든 RxData 필드 (가변, 평균 12-22개)
처리 흐름:
- modelTypeName으로 ModelVariations 조회
- variationName으로 VariationData 조회
- ValidateFields() 호출 (필드 일치 검증)
- 각 fieldValue를 ParseValue()하여 RxData.SetAsObject() 호출
복잡도 근거:
- DET: Model 필드 수 + 2 (평균 14-24개)
- FTR: 4개 (Model, VariationData, fieldValues Dictionary, RxData)
3. ApplyModSet() (6 FP - 높음)
입력 데이터:
- ModSet Definition
- Target Model
- Stack Count
- Condition 함수
처리 흐름:
- Condition 체크
- Stack 처리 (MaxStack 확인, 기존 Stack 증가 or 새 Instance 생성)
- Instance 생성 및 등록 (activeInstances, modelModSets)
- Temporary/Permanent 분류
- StatModification 적용 (RxMod에 Modifier 추가)
- OnApply 콜백 호출
복잡도 근거:
- DET: 4개 (definition, target, stackCount, condition)
- FTR: 5개 (ModSet, ModSetInstance, Model, RxMod, Callbacks)
4. SpawnAsync<T>() (6 FP - 높음)
입력 데이터:
- Definition (ISubstanceDefinition)
- Position (Vector3)
- Rotation (Quaternion)
- CancellationToken (optional)
처리 흐름:
- Addressable 키로 Prefab 로드
- 풀에서 인스턴스 가져오기 (또는 새로 생성)
- Transform 설정 (position, rotation)
- WorldSubstance 초기화
- Definition 적용
복잡도 근거:
- DET: 4개 (definition, position, rotation, cancellationToken)
- FTR: 5개 (Definition, Addressable, Prefab, WorldSubstance, Pool)
7. DefinitionImporter.Import() (6 FP - 높음)
입력 데이터:
- Google Sheets TSV 데이터 (행 × 열, 평균 10행 × 15열 = 150개)
처리 흐름:
- TSV 파싱 (헤더 행 + 데이터 행)
- 각 행을 Definition 객체로 변환 (Builder 패턴)
- DefinitionRegistry에 등록
- AssetDatabase.CreateAsset() (ScriptableObject)
복잡도 근거:
- DET: Sheet 행 수 × 열 수 (150+)
- FTR: 4개 (TSV, Definition, DefinitionRegistry, Asset)
4️⃣ EO (External Outputs) - 외부 출력
측정 결과
| # | 트랜잭션 명칭 | DET | FTR | 복잡도 | FP | 파일 경로 |
|---|---|---|---|---|---|---|
| 1 | ValidateDataIntegrity() | 가변 | 5 | 높음 | 7 | Editor/Tools/ValidationDashboard/Core/DataIntegrityValidator.cs:31 |
| 2 | ValidateAddressables() | 가변 | 4 | 중간 | 5 | Editor/Tools/ValidationDashboard/Core/ValidationOrchestrator.cs:83 |
| 3 | ValidateNamingConventions() | 가변 | 3 | 중간 | 5 | Editor/Tools/ValidationDashboard/Core/ValidationOrchestrator.cs:111 |
| 4 | RunFullValidation() | 0 | 6 | 높음 | 7 | Editor/Tools/ValidationDashboard/Core/ValidationOrchestrator.cs:39 |
| 5 | ProjectHealthSummary | 8 | 4 | 중간 | 5 | Editor/Tools/ValidationDashboard/Data/ProjectHealthSummary.cs |
EO 소계: 29 FP
상세 분석
1. ValidateDataIntegrity() (7 FP - 높음)
출력 데이터:
- DataIntegrityStatus
- 검증 이슈 목록 (ModelType, VariationName, Field, IssueType, Message)
- Levenshtein Distance 기반 오타 제안
처리 흐름:
- VariationRegistry의 모든 ModelVariations 순회
- 각 Model 클래스 존재 여부 확인 (리플렉션)
- Model 인스턴스 생성 가능 여부 확인
- Sheet ↔ Model 필드 일치성 검사
- 빈 값 체크
- 오타 제안 (Levenshtein Distance ≤ 3)
복잡도 근거:
- DET: 가변 (VariationData 필드 수 × Variation 수)
- FTR: 5개 (VariationRegistry, ModelVariations, VariationData, Model 클래스, Issues)
4. RunFullValidation() (7 FP - 높음)
출력 데이터:
- ProjectHealthSummary
- 3개 검증 결과 (Data Integrity, Addressables, Naming)
- 통합 이슈 목록
- 통계 정보
처리 흐름:
- ValidateDataIntegrity() 호출
- ValidateAddressables() 호출
- ValidateNamingConventions() 호출
- 3개 결과 통합
- ProjectHealthSummary 생성
- 이벤트 발행 (ValidationCompleted)
복잡도 근거:
- DET: 0개 (전체 프로젝트 스캔, 파라미터 없음)
- FTR: 6개 (VariationRegistry, AddressableIndex, NamingRules, Controllers, Definitions, Issues)
5️⃣ EQ (External Inquiries) - 외부 조회
측정 결과
| # | 트랜잭션 명칭 | DET | FTR | 복잡도 | FP | 파일 경로 |
|---|---|---|---|---|---|---|
| 1 | Get<TDefinition>(id) | 2 | 3 | 낮음 | 3 | Support/Data/DataManager.cs:360 |
| 2 | TryGet<TDefinition>(id) | 2 | 3 | 낮음 | 3 | Support/Data/DataManager.cs:374 |
| 3 | GetAll<TDefinition>() | 1 | 2 | 낮음 | 3 | Support/Data/DataManager.cs:393 |
| 4 | GetActiveModSets(target) | 2 | 2 | 낮음 | 3 | Support/ModSets/ModSetManager.cs:312 |
| 5 | GetByTag(target, tag) | 3 | 2 | 낮음 | 3 | Support/ModSets/ModSetManager.cs:346 |
| 6 | GetActive<T>() (Controller) | 1 | 2 | 낮음 | 3 | AggregateManagement/ControllerManager.cs:195 |
| 7 | GetFirst<T>() (Controller) | 1 | 2 | 낮음 | 3 | AggregateManagement/ControllerManager.cs:205 |
| 8 | GetRxDataByName() | 2 | 2 | 낮음 | 3 | Aggregate/Controller/BaseModel.cs:182 |
EQ 소계: 24 FP
상세 분석
모든 조회 트랜잭션은 낮은 복잡도 (3 FP)를 가지며, 다음과 같은 공통 특징이 있습니다:
- 단순 조회: 데이터 가공 없이 기존 데이터 반환
- 캐싱 활용: Dictionary, List 기반 O(1) 또는 O(n) 조회
- 타입 안전성: Generic 활용으로 컴파일 타임 타입 체크
1. Get<TDefinition>(id) (3 FP)
조회 흐름:
1. GetRegistry<TDefinition>() 호출
2. registry.Get(id) 호출 (Dictionary 조회)
3. 캐시 히트 시 O(1) 반환
5. GetByTag(target, tag) (3 FP)
조회 흐름:
1. modelModSets[target] 조회
2. LINQ Where(ms => ms.ModSet.Tags.Contains(tag))
3. IEnumerable<ModSetInstance> 반환
🎯 총 기능점수 요약
기능 유형별 분포
| 구분 | 개수 | 기능점수 (FP) | 비율 |
|---|---|---|---|
| ILF (내부 논리 파일) | 10 | 112 | 50.2% |
| EIF (외부 인터페이스 파일) | 3 | 17 | 7.6% |
| EI (외부 입력) | 8 | 41 | 18.4% |
| EO (외부 출력) | 5 | 29 | 13.0% |
| EQ (외부 조회) | 8 | 24 | 10.8% |
| 총계 | 34 | 223 FP | 100% |
복잡도별 분포
ILF (내부 논리 파일)
- 높음 (15 FP): 3개 → 45 FP (40.2%)
- BaseModel, RxMod<T>, ModSet
- 중간 (10 FP): 6개 → 60 FP (53.6%)
- RxList, RxDictionary, VariationRegistry, ModSetManager, ItemDefinition, BaseSubModel
- 낮음 (7 FP): 1개 → 7 FP (6.2%)
- DefinitionRegistry<T>
EI (외부 입력)
- 높음 (6 FP): 5개 → 30 FP (73.2%)
- ApplyVariationData, ApplyModSet, SpawnAsync, SpawnFromDataSubstanceAsync, DefinitionImporter.Import
- 중간 (4 FP): 2개 → 8 FP (19.5%)
- CreateModel, DownloadSheetAsTSV
- 낮음 (3 FP): 1개 → 3 FP (7.3%)
- RegisterRuntime
EO (외부 출력)
- 높음 (7 FP): 2개 → 14 FP (48.3%)
- ValidateDataIntegrity, RunFullValidation
- 중간 (5 FP): 3개 → 15 FP (51.7%)
- ValidateAddressables, ValidateNamingConventions, ProjectHealthSummary
EQ (외부 조회)
- 낮음 (3 FP): 8개 → 24 FP (100%)
- 모든 조회 트랜잭션
기능점수 분포 차트
ILF (내부 논리 파일) 112 FP ████████████████████████████ 50.2%
EI (외부 입력) 41 FP ██████████ 18.4%
EO (외부 출력) 29 FP ███████ 13.0%
EQ (외부 조회) 24 FP ██████ 10.8%
EIF (외부 인터페이스) 17 FP ████ 7.6%📈 벤치마킹 분석
기능점수 규모 분류 (ISBSG 기준)
| 규모 | 기능점수 범위 | 아카샤 프레임워크 |
|---|---|---|
| 소규모 | < 100 FP | - |
| 중규모 | 100 ~ 500 FP | ✅ 223 FP |
| 대규모 | 500 ~ 1000 FP | - |
| 초대규모 | > 1000 FP | - |
결론: 아카샤 프레임워크는 중규모 프레임워크
유사 프레임워크 비교 (추정치)
| 프레임워크 | 추정 FP | 규모 | 특징 |
|---|---|---|---|
| Akasha Framework | 223 FP | 중규모 | 반응형 데이터 중심, Unity 게임 프레임워크 |
| Unity DOTS | ~400 FP | 중-대규모 | Data-Oriented Tech Stack, ECS 기반 |
| Unity UI Toolkit | ~180 FP | 중규모 | UI 프레임워크, UXML/USS 기반 |
| UniRx | ~120 FP | 중규모 | Reactive Extensions, 스트림 처리 |
| Entity Component System (ECS) | ~300 FP | 중-대규모 | Pure ECS 아키텍처 |
| Zenject (DI Container) | ~80 FP | 소-중규모 | Dependency Injection 전용 |
산업 표준 대비 분석
개발 공수 추정 (ISBSG 기준):
- 평균 개발 속도: 40시간/FP (프레임워크 개발)
- 아카샤 프레임워크: 223 FP × 40시간 = 8,920 시간 (약 1.1인년)
생산성 지표:
- Unity 게임 프레임워크 평균: 50-60시간/FP
- 아카샤 프레임워크: 40시간/FP (추정)
- 생산성: 평균 대비 125-150% (효율적 개발)
복잡도 프로필 비교
아카샤 프레임워크
데이터 중심 (ILF 50.2%)
├─ 반응형 시스템 (RxData)
├─ 동적 필드 관리 (BaseModel)
└─ 정교한 Modifier (RxMod, ModSet)
입출력 균형 (EI 18.4%, EO 13.0%, EQ 10.8%)
├─ Google Sheets 통합
├─ Addressables 지원
└─ Validation DashboardUnity DOTS (~400 FP)
컴포넌트 중심 (ILF 40%)
├─ Entity, Component, System
└─ Job System
성능 최적화 중심 (EI 25%, EO 15%)
├─ Burst Compiler
└─ Multi-threadingUniRx (~120 FP)
스트림 처리 중심 (EI 35%, EQ 30%)
├─ Observable, Subject
├─ Operator (Map, Filter, Merge)
└─ Reactive Pattern
데이터 저장소 부재 (ILF 20%)특징적 차이점
| 항목 | 아카샤 | Unity DOTS | UniRx |
|---|---|---|---|
| 데이터 관리 | 강력 (50.2%) | 중간 (40%) | 약함 (20%) |
| 검증 시스템 | 있음 (Validation Dashboard) | 없음 | 없음 |
| 외부 연계 | Google Sheets, Addressables | Asset Bundle | ReactiveProperty |
| 복잡도 관리 | 높음 (ModSet 16 DET) | 중간 | 낮음 |
| 주요 용도 | 게임 전체 프레임워크 | 성능 최적화 | 반응형 UI/로직 |
💡 평가 및 분석
강점
1. 데이터 중심 설계 (ILF 50.2%)
핵심 가치:
- BaseModel, RxData 시스템이 프레임워크의 핵심
- 반응형 프로그래밍 패러다임 완전 구현
- 데이터 무결성을 위한 VariationRegistry, DefinitionRegistry
구체적 강점:
BaseModel (15 FP)
├─ 동적 필드 관리 (Dictionary 기반)
├─ SubModel 계층 구조 (분리 및 재사용)
├─ 타입 안전한 동적 값 설정
└─ RxData 자동 분류 (RxVar, RxMod, Computed, Collection)
RxMod<T> (15 FP)
├─ 4단계 Modifier 공식 (정교한 수치 계산)
├─ 4개 Dictionary 관리 (OriginAdd, AddMult, Mult, FinalAdd)
├─ 캐싱 최적화 (Dirty Flag)
└─ 실시간 재계산
VariationRegistry (10 FP)
├─ Google Sheets 기반 데이터 관리
├─ 3단계 중첩 구조 (Registry → ModelVariations → VariationData)
├─ 필드 캐싱 (Dictionary<string, string>)
└─ 런타임 적용 (동적 또는 재초기화)2. 높은 복잡도 관리 능력
고복잡도 컴포넌트 (15 FP):
- ModSet: 16개 DET, 4개 RET
- Duration, Stack, Condition, Callback
- DirectActions, PeriodicActions
- 다양한 ApplicationMode
- BaseModel: 10개 DET, 4개 RET
- 동적 필드 관리
- SubModel 계층
- 타입 변환
- RxMod<T>: 10개 DET, 4개 RET
- 4단계 Modifier 공식
- 4개 Dictionary
복잡도 관리 기법:
1. Dictionary 초기 용량 지정 (8, 16, 32)
→ 메모리 할당 최적화
2. SwapRemove O(1) 제거 (ModSetManager)
→ List에서 순서 무관 삭제 최적화
3. Temporary vs Permanent 분리 (ModSetManager.UpdateDurations)
→ Duration 업데이트 대상만 순회
4. 캐싱 (VariationRegistry.cachedFieldValues, DefinitionRegistry.cache)
→ 중복 계산 방지
5. 필드 검증 캐시 (DataIntegrityValidator.modelFieldsCache)
→ 리플렉션 비용 최소화3. 풍부한 입력 처리 (EI 18.4%)
Google Sheets 통합:
- DownloadSheetAsTSV() (4 FP)
- DefinitionImporter.Import() (6 FP)
- 게임 기획 데이터를 스프레드시트로 관리
- 비개발자도 데이터 수정 가능
Addressables 완전 지원:
- SpawnAsync<T>() (6 FP)
- SpawnFromDataSubstanceAsync() (6 FP)
- 동적 리소스 로딩
- 메모리 최적화 (풀링)
동적 데이터 로드/적용:
- ApplyVariationData() (6 FP)
- 런타임에 Model 데이터 변경 가능
- 타입 안전한 동적 값 설정 (ParseValue 시스템)
4. 강력한 검증 시스템 (EO 13.0%)
Validation Dashboard:
- RunFullValidation() (7 FP)
- ValidateDataIntegrity() (7 FP)
- ValidateAddressables() (5 FP)
- ValidateNamingConventions() (5 FP)
Data Integrity 검증:
1. Model 클래스 존재 여부 (리플렉션)
2. Model 인스턴스 생성 가능 여부
3. Sheet ↔ Model 필드 일치성 검사
4. 빈 값 체크
5. Levenshtein Distance 기반 오타 제안 (최대 3글자 차이)검증 결과 활용:
- CI/CD 통합 가능
- JSON/Markdown 보고서 생성
- 이벤트 기반 알림 (EventAggregator)
개선 영역
1. 조회 기능 비중 (EQ 10.8%)
현재 상태:
- 기본적인 Get/TryGet/GetAll만 제공 (각 3 FP)
- 모두 낮은 복잡도
- 총 8개 트랜잭션, 24 FP
부족한 부분:
1. 복잡한 쿼리
- LINQ Where() 정도만 지원
- Join, GroupBy, Aggregate 부재
2. 필터링
- Tag 기반 필터링만 있음 (GetByTag)
- 다중 조건 필터링 부재
- 정렬 옵션 부재
3. 성능 최적화
- 인덱싱 부재 (Dictionary만 활용)
- 쿼리 결과 캐싱 부재
- Lazy Loading 부재개선 제안:
// 복잡한 쿼리 API
GetModSetsWhere(target, predicate, orderBy, take)
GetDefinitionsBy(category, tags, minLevel, maxLevel)
// 인덱싱
DefinitionRegistry<T>
├─ indexByCategory: Dictionary<string, List<T>>
├─ indexByTag: Dictionary<string, List<T>>
└─ indexByLevel: SortedDictionary<int, List<T>>
// 쿼리 빌더 패턴
DataManager.Query<ItemDefinition>()
.WhereTag("Weapon")
.WhereCategory("Sword")
.OrderByDescending(x => x.AttackPower)
.Take(10)
.ToList()
2. 외부 연계 제한 (EIF 7.6%)
현재 상태:
- 총 3개 EIF (Google Sheets, Addressables, UnityWebRequest)
- 17 FP (전체의 7.6%)
부족한 부분:
1. 데이터베이스 연동 부재
- SQLite, Realm 등 로컬 DB 미지원
- 서버 DB 연동 미지원
2. 외부 서비스 제한
- REST API 클라이언트 부재
- WebSocket 미지원
- Cloud Save 미지원
3. 확장성
- Plugin 시스템 부재
- Custom Importer 등록 부재개선 제안:
// 데이터베이스 연동
ILF: DatabaseAdapter (DET=8, RET=3, 10 FP)
EIF: SQLite (DET=5, RET=3, 7 FP)
// REST API 클라이언트
EIF: HttpClient (DET=6, RET=3, 7 FP)
EI: PostAsync() (DET=3, FTR=3, 4 FP)
EQ: GetAsync() (DET=2, FTR=3, 3 FP)
// Plugin 시스템
ILF: PluginRegistry (DET=5, RET=2, 7 FP)
EI: RegisterPlugin() (DET=2, FTR=2, 3 FP)
3. 트랜잭션 문서화 부족
현재 상태:
- 코드 주석은 충실
- XML Documentation 있음
- 하지만 사용자 가이드 부족
개선 제안:
1. 트랜잭션 플로우 다이어그램
- ApplyVariationData 플로우
- ApplyModSet 플로우
- SpawnAsync 플로우
2. 예제 코드
- 각 트랜잭션별 사용 예제
- 일반적인 유스케이스
3. 성능 가이드
- 각 트랜잭션의 시간 복잡도
- 최적화 팁특징적 요소
1. 프레임워크 특성
게임 개발용 범용 프레임워크:
Controller 시스템 (MVC의 C)
├─ 3가지 모드 (Pure/Model/Entity)
├─ 생명주기 관리
└─ 풀링 지원
Presenter 시스템 (MVC의 V)
├─ RxData → UI 바인딩
├─ 동적 Rebind
└─ 컬렉션 바인딩
WorldSubstance 시스템 (게임 오브젝트)
├─ Definition 기반 스폰
├─ DataSubstance ↔ WorldSubstance
└─ 풀링 지원
DataManager (MVC의 M)
├─ Variation 기반 Model 생성
├─ Definition 조회
└─ 타입 안전한 동적 설정Unity 종속성:
- MonoBehaviour 기반 (Controller, Presenter, WorldSubstance)
- ScriptableObject 활용 (Definition, Registry)
- Addressables 의존성
- UnityWebRequest 사용
데이터 중심 아키텍처:
- ILF 50.2% (다른 프레임워크는 30-40%)
- VariationRegistry, DefinitionRegistry
- RxData 시스템 (반응형 데이터)
2. 개발 생산성
기능점수 대비 개발 기간:
223 FP ÷ 40시간/FP = 8,920 시간 (1.1인년)생산성 향상 요인:
1. Google Sheets 통합
- 비개발자도 데이터 수정 가능
- 기획 변경 즉시 반영
2. Validation Dashboard
- 데이터 오류 사전 발견
- 런타임 에러 감소
3. Addressables
- 동적 로딩
- 메모리 최적화
4. Generic 활용
- DefinitionRegistry<T>
- Manager<TSelf>
- 코드 재사용성 극대화실제 개발 기간 vs 추정:
- 추정: 1.1인년
- 실제: (프로젝트 정보 필요)
- 생산성: 추정 대비 실제 비율
3. 유지보수성
명확한 레거시 마킹:
[Obsolete("Use Initialize() instead. This method will be removed in future versions.")]
public void SetOwner(BaseModel owner)
[System.Obsolete("This is a legacy API. Consider migrating to direct ModSetManager usage pattern.")]
public static int RemoveModSetsByTag(...)
테스트 전용 코드 분리:
- AkashaScript\Test 폴더
- TestController, TestModel 등
- 프로덕션 코드와 명확히 분리
Validation Dashboard:
- 지속적 품질 관리
- CI/CD 통합 가능
- 데이터 무결성 보장
문서화:
- XML Documentation
- 주석 충실
- Migration Guide (DynamicBindingSystem_MigrationGuide.md 등)
📝 결론
아카샤 프레임워크는 223 FP의 중규모 게임 프레임워크로, 다음과 같은 특징을 가집니다:
✅ 핵심 장점
1. 데이터 중심 설계 (50.2% ILF)
반응형 데이터 시스템이 프레임워크의 핵심 가치
BaseModel (15 FP)
├─ 동적 필드 관리
├─ SubModel 계층
└─ 타입 안전성
RxData 시스템
├─ RxVar, RxMod, RxList, RxDictionary
├─ 자동 변경 통지
└─ UI 자동 업데이트
VariationRegistry + DefinitionRegistry
├─ Google Sheets 통합
├─ 데이터 무결성 검증
└─ 런타임 동적 적용2. 높은 복잡도 관리
ModSet (16 DET, 15 FP)
├─ Duration, Stack, Condition
├─ 4단계 Modifier 공식
├─ DirectActions, PeriodicActions
└─ Callback 시스템
BaseModel (10 DET, 15 FP)
├─ 동적 필드 관리 (Dictionary)
├─ SubModel 계층 (분리 및 재사용)
└─ 타입 변환 (ParseValue 시스템)
성능 최적화
├─ Dictionary 초기 용량 지정
├─ SwapRemove O(1)
├─ Temporary/Permanent 분리
└─ 캐싱 (필드, 검증 결과)3. 풍부한 입력 처리 (18.4% EI)
Google Sheets
├─ DownloadSheetAsTSV()
├─ DefinitionImporter.Import()
└─ 비개발자 데이터 수정
Addressables
├─ SpawnAsync<T>()
├─ 동적 로딩
└─ 풀링
동적 데이터 적용
├─ ApplyVariationData()
├─ 타입 안전
└─ 런타임 변경4. 강력한 검증 (13.0% EO)
Validation Dashboard
├─ Data Integrity (Levenshtein)
├─ Addressables
├─ Naming Conventions
└─ CI/CD 통합 가능🎯 적정 규모
Unity 게임 개발용으로 적절한 규모:
소규모 프레임워크 (< 100 FP)
└─ 기능 부족, 확장성 부족
중규모 프레임워크 (100-500 FP) ← 아카샤 (223 FP)
└─ 필요한 기능 완비, 너무 무겁지 않음
대규모 프레임워크 (> 500 FP)
└─ 과도한 복잡도, 학습 곡선 가파름중-소규모 게임 프로젝트에 최적화:
- 인디 게임: ✅ 적합
- 중소형 스튜디오: ✅ 적합
- AAA 게임: △ 확장 필요
- 캐주얼 게임: ⚠️ 과도할 수 있음
📊 산업 표준 비교
기능점수 비교
| 프레임워크 | FP | 규모 | 특징 |
|---|---|---|---|
| Akasha | 223 | 중 | 데이터 중심, 반응형 |
| Unity DOTS | ~400 | 중-대 | 성능 최적화, ECS |
| Unity UI Toolkit | ~180 | 중 | UI 전용 |
| UniRx | ~120 | 중 | 반응형 전용 |
복잡도 비교
Akasha: ILF 50.2% (데이터 중심)
DOTS: ILF 40% (컴포넌트 중심)
UniRx: ILF 20% (스트림 중심)장단점 비교
| 항목 | Akasha | UniRx | DOTS |
|---|---|---|---|
| 데이터 관리 | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
| 검증 시스템 | ⭐⭐⭐⭐⭐ | - | - |
| 외부 연계 | ⭐⭐⭐ (Sheets) | ⭐⭐ | ⭐⭐ |
| 성능 | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 학습 곡선 | ⭐⭐⭐ (보통) | ⭐⭐⭐⭐ (가파름) | ⭐⭐⭐⭐⭐ (매우 가파름) |
🚀 활용 권장 사항
적합한 프로젝트
데이터 중심 게임
- RPG, 시뮬레이션, 전략 게임
- 복잡한 스탯 시스템
- 아이템/스킬 Definition 관리
Google Sheets 활용
- 기획자가 데이터 직접 관리
- 빠른 밸런스 조정
- A/B 테스트
중-소규모 팀
- 1-10명 규모
- Unity 경험 있음
- C# 익숙
부적합한 프로젝트
성능 극한 최적화 필요
- FPS, 레이싱 게임
- 대규모 멀티플레이어
→ Unity DOTS 추천
단순한 게임
- 초간단 캐주얼 게임
- 프로토타입
→ 과도한 복잡도
비 Unity 플랫폼
- Unity 종속성 높음
- 다른 엔진으로 이식 어려움
📈 향후 개선 방향
단기 (다음 버전)
조회 기능 강화 (EQ 확대)
현재: 24 FP (10.8%) 목표: 40 FP (15%) 추가 기능: - 복잡한 쿼리 API - 다중 조건 필터링 - 인덱싱문서화 개선
- 트랜잭션 플로우 다이어그램
- 사용 예제
- 성능 가이드
중기 (2-3개 버전 후)
외부 연계 확장 (EIF 확대)
현재: 17 FP (7.6%) 목표: 35 FP (12%) 추가 기능: - 데이터베이스 연동 (SQLite, Realm) - REST API 클라이언트 - Cloud SavePlugin 시스템
- Custom Importer 등록
- Custom Validator 등록
- Extensibility API
장기 (1년 후)
성능 최적화
- DOTS 통합 (선택적)
- Burst Compiler 지원
- Job System 활용
크로스 플랫폼
- Unity 종속성 분리
- .NET Standard 라이브러리화
- Godot Engine 포팅
📚 참고 자료
ISO/IEC 20926:2009 기준
- 기능점수 측정 방법론
- ISBSG (International Software Benchmarking Standards Group)
프레임워크 분석 자료
- Akasha Framework 소스 코드: C:\Users\minyoung\Mer\Assets\AkashaScript
- 프로젝트 문서: C:\Users\minyoung\Mer*.md
유사 프레임워크
- Unity DOTS: https://unity.com/dots
- UniRx: https://github.com/neuecc/UniRx
- Zenject: https://github.com/modesttree/Zenject
📄 부록: 측정 상세 데이터
A. ILF 상세 분석표
| # | ILF 명칭 | DET | RET | 복잡도 | FP | 주요 필드 |
|---|---|---|---|---|---|---|
| 1 | BaseModel | 10 | 4 | 높음 | 15 | rxDataByName, modifiableFields, computedFields, subModels |
| 2 | RxMod<T> | 10 | 4 | 높음 | 15 | baseValue, cachedValue, 4개 Modifier Dictionary |
| 3 | RxList<T> | 7 | 3 | 중간 | 10 | items, Count, Capacity, 5개 이벤트 |
| 4 | RxDictionary<K,V> | 7 | 3 | 중간 | 10 | dictionary, Count, Keys, Values, 5개 이벤트 |
| 5 | VariationRegistry | 7 | 3 | 중간 | 10 | models, modelTypeName, variations, fieldNames/Values |
| 6 | DefinitionRegistry<T> | 4 | 2 | 낮음 | 7 | entries, cache |
| 7 | ModSet | 16 | 4 | 높음 | 15 | Id, Tags, Modifications, Duration, Actions, Callbacks 등 |
| 8 | ModSetManager | 9 | 3 | 중간 | 10 | activeInstances, modelModSets, temporary/permanentModSets |
| 9 | ItemDefinition | 8 | 2 | 중간 | 10 | Id, Name, Description, IconPath, IsStackable, MaxStack 등 |
| 10 | BaseSubModel | 6 | 2 | 중간 | 10 | owner, isInitialized, rxDataByName, modifiableFields |
B. 트랜잭션 상세 분석표
EI (External Inputs)
| # | 트랜잭션 | DET | FTR | 복잡도 | FP | 입력 파라미터 | 처리 파일 |
|---|---|---|---|---|---|---|---|
| 1 | CreateModel<T> | 2 | 3 | 중간 | 4 | variationName | Model, VariationData, RxData |
| 2 | ApplyVariationData | 12-22 | 4 | 높음 | 6 | model, variationName, fieldValues | Model, VariationData, fieldValues, RxData |
| 3 | ApplyModSet | 4 | 5 | 높음 | 6 | definition, target, stackCount, condition | ModSet, Instance, Model, RxMod, Callbacks |
| 4 | SpawnAsync<T> | 4 | 5 | 높음 | 6 | definition, position, rotation, token | Definition, Addressable, Prefab, WorldSubstance, Pool |
| 5 | SpawnFromDataSubstanceAsync | 4 | 5 | 높음 | 6 | dataSubstance, position, rotation, token | DataSubstance, Definition, WorldSubstance, Addressable, Prefab |
| 6 | DownloadSheetAsTSV | 2 | 3 | 중간 | 4 | spreadsheetUrl, sheetId | Google Sheets API, TSV, UnityWebRequest |
| 7 | DefinitionImporter.Import | 150+ | 4 | 높음 | 6 | TSV data (행×열) | TSV, Definition, DefinitionRegistry, Asset |
| 8 | RegisterRuntime<T> | 2 | 2 | 낮음 | 3 | definition, id | Definition, DefinitionRegistry |
EO (External Outputs)
| # | 트랜잭션 | DET | FTR | 복잡도 | FP | 출력 데이터 | 처리 파일 |
|---|---|---|---|---|---|---|---|
| 1 | ValidateDataIntegrity | 가변 | 5 | 높음 | 7 | Status, Issues, Suggestions | VariationRegistry, ModelVariations, VariationData, Model, Issues |
| 2 | ValidateAddressables | 가변 | 4 | 중간 | 5 | Issues | Controllers, Definitions, AddressableIndex, Issues |
| 3 | ValidateNamingConventions | 가변 | 3 | 중간 | 5 | Violations | Files, Objects, NamingViolations |
| 4 | RunFullValidation | 0 | 6 | 높음 | 7 | ProjectHealthSummary | VariationRegistry, AddressableIndex, NamingRules, Controllers, Definitions, Issues |
| 5 | ProjectHealthSummary | 8 | 4 | 중간 | 5 | Summary report | Issues, Statistics, Metrics, Recommendations |
EQ (External Inquiries)
| # | 트랜잭션 | DET | FTR | 복잡도 | FP | 조회 키 | 반환 데이터 |
|---|---|---|---|---|---|---|---|
| 1 | Get<TDefinition> | 2 | 3 | 낮음 | 3 | id | Definition (or null) |
| 2 | TryGet<TDefinition> | 2 | 3 | 낮음 | 3 | id | bool, Definition (out) |
| 3 | GetAll<TDefinition> | 1 | 2 | 낮음 | 3 | (type) | IEnumerable<Definition> |
| 4 | GetActiveModSets | 2 | 2 | 낮음 | 3 | target | IReadOnlyList<ModSetInstance> |
| 5 | GetByTag | 3 | 2 | 낮음 | 3 | target, tag | IEnumerable<ModSetInstance> |
| 6 | GetActive<T> | 1 | 2 | 낮음 | 3 | (type) | IReadOnlyList<Controller> |
| 7 | GetFirst<T> | 1 | 2 | 낮음 | 3 | (type) | Controller (or null) |
| 8 | GetRxDataByName | 2 | 2 | 낮음 | 3 | fieldName | RxData (or null) |
C. 복잡도 판정 기준표
ILF/EIF 복잡도
| DET / RET | 1 RET | 2-5 RET | 6+ RET |
|---|---|---|---|
| 1-19 DET | 낮음 | 낮음 | 중간 |
| 20-50 DET | 낮음 | 중간 | 높음 |
| 51+ DET | 중간 | 높음 | 높음 |
EI/EO/EQ 복잡도
| DET / FTR | 0-1 FTR | 2-3 FTR | 4+ FTR |
|---|---|---|---|
| 1-4 DET | 낮음 | 낮음 | 중간 |
| 5-15 DET | 낮음 | 중간 | 높음 |
| 16+ DET | 중간 | 높음 | 높음 |
보고서 작성 완료
- 작성일: 2026-01-16
- 작성자: Claude Code
- 프레임워크 버전: (현재 버전)
- 측정 기준: ISO/IEC 20926:2009
'개발자 허민영 > 프로젝트' 카테고리의 다른 글
| Mercenary] 배틀씬 프로토타입 작업 (1) | 2026.02.25 |
|---|---|
| Claude Code MCP 서버 연동 (0) | 2026.02.25 |
| 프레임워크 문서 (0) | 2025.11.26 |
| [Mercenary] 용병단 육성 게임 기획서 (0) | 2025.08.19 |
| [Akasha] 프레임워크의 핵심 목표 (0) | 2025.06.08 |