본문으로 건너뛰기

TreeStructure

범용 트리 구조 — traversal/path/audit verdict 집계 (조직도/카� �고리/메뉴/단원 모두)

상태

항목
Layercore
TierL1
Statusreleased
Version1.0.0
가격Free (free)
**카�
�고리**Infrastructure

개요

개요

TreeStructure 는 multi-saas-kit 의 Layer 1 Core Plugin � 니다. ID + parent_id 로 구성된 모든 트리 구조 — 조직도 / 카� �고리 / 메뉴 / 교과 단원 / 댓글 chain — 의 traversal + path + audit verdict 집계를 도메인 무관 Pure 로 제공.

분리선 (ADR-039)

ADR-039 사례 7 — 기존 CurriculumStructure (exam.how Chapter 트리 출처) 일반화. tree traversal / path / verdict 집계는 100% 범용. AuditChecklist 6개 라벨 (scope_alignment 등) 만 교육 도메인 → config 외부화 로 SaaS 별 커스터마이징.

변경: namespace App\Plugins\CurriculumStructureApp\Plugins\TreeStructure, ChapterNodeTreeNode, ChapterTreeTraversalTreeTraversal, ChapterPathBuilderPathBuilder. AuditChecklist 의 6 라벨은 default 유지 (교육 SaaS 호환), config 으로 다른 도메인 ('compliance' / 'security' / 'product-quality' 등) 별 라벨 register 가능.

핵심 컴포넌트

TreeNode (DTO)

6개 필드: id, parent_id, name, depth, sort_order, slug. fromArray() / toArray().

TreeTraversal (Pure)

  • ancestors($all, $id) — root 우선 정렬된 부모 체인
  • children($all, $id) — 직접 자식 (sort_order asc)
  • siblings($all, $id) — 자기 자신 제외 형제
  • descendants($all, $id) — 모든 후손 (재귀 깊이우선)

PathBuilder (Pure)

트리 path 빌더. separator config 으로 변경 가능 (>, /, 등).

AuditVerdictAggregator (Pure)

여러 verdict 을 하나로 집계 — 우선순위 fail > warn > pass. config 으로 우선순위 변경 가능.

AuditChecklist (Pure constant)

Default 6 라벨 (교육 도메인). config 으로 외부화:

// config/tree-structure.php
'audit_checklist' => [
// commerce 도메인 예시
'inventory_balance' => '재고 균형',
'price_consistency' => '가격 일관성',
'category_overlap' => '카�
�고리 중복',
// ...
],

활용 시나리오

  • exam.how / academy.how: 교과 단원 트리 (대단원 → 중단원 → 레슨)
  • commerce: 카� �고리 트리 (전자제품 → 컴퓨터 → � �트북)
  • 관리자 메뉴 트리
  • 조직도 (회사 → 부서 → 팀)
  • 댓글 chain (이미 Thread plugin 이 1단계 한정 처리, TreeStructure 는 N단계)
  • 파일 시스� � (폴더 트리)

사용 예시

use App\Plugins\TreeStructure\Data\TreeNode;
use App\Plugins\TreeStructure\Services\{TreeTraversal, PathBuilder, AuditVerdictAggregator};

$nodes = Category::all()->map(fn ($c) => TreeNode::fromArray($c->toArray()))->all();

$ancestors = (new TreeTraversal)->ancestors($nodes, $catId);
$path = PathBuilder::fromConfig(config('tree-structure'))->build($nodes, $catId);
$verdict = AuditVerdictAggregator::fromConfig(config('tree-structure'))->aggregate(['pass', 'warn', 'fail']);
// → 'fail' (highest priority)

출처

exam.how ChapterStructureAuditService (562줄) → TreeStructure 일반화.

의존성

  • core: >=1.1.0

라이선스

MIT

데모


🛒 Plugin Store에서 보기: store.codebase.how/plugins/tree-structure