ADR-003 후속 아키텍처 결정 추가
All checks were successful
Publish ParaWiki / build-and-deploy (push) Successful in 29s

12개 주제 병렬 조사 기반 결정 통합:
UI(Leptos+wgpu), IFC(ifc-lite-core), CI/CD(Gitea+GH 미러),
USD(Codeless schema), Alignment 단계 도입, WASM plugin 3단계,
Feature 카탈로그, FEM(MIDAS), LOD 300, 리본 12탭,
선택/필터, 설정 3계층 모델.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
minsung
2026-04-14 16:42:06 +09:00
parent 20761ca795
commit d90ef2cfe1
2 changed files with 293 additions and 0 deletions

View File

@@ -0,0 +1,292 @@
---
id: ADR-003
title: cimery 후속 아키텍처 결정 — UI·IFC·CI/CD·USD·Alignment·Plugin·Feature 카탈로그·FEM·LOD·UX
status: accepted
date: 2026-04-14
related-wiki:
- "[[특징 형상 기반 모델링 FBM]]"
- "[[증분형 갱신 알고리즘 LPG]]"
- "[[선형 GIS 기반 좌표계]]"
- "[[PCE 파라메트릭 변경 엔진]]"
- "[[Revit 조립 단위 분류]]"
related-adr:
- "[[ADR-001-tech-stack]]"
- "[[ADR-002-feature-dsl]]"
principles: [비패밀리, 증분, 선형-GIS]
---
# ADR-003 — cimery 후속 아키텍처 결정 (12개 주제)
## 결정 요약표
| # | 주제 | 결정 |
|---|---|---|
| A1 | UI 프레임워크 | **Leptos** (UI) + `<canvas>`**wgpu** (3D 뷰포트) |
| A2 | IFC 라이브러리 | **이원 전략** — 런타임 `ifc-lite-core`, 검증 `IfcOpenShell` |
| A3 | 빌드·배포 파이프라인 | **하이브리드 B** — Gitea 메인 CI, GitHub Actions 미러로 Win/macOS 빌드·서명. 중기 Cloudflare R2/Worker |
| A4 | USD 스키마 매핑 | **Codeless USD Applied API Schema** (`CimeryBridgeAPI` 등) + IFC alias 이중 태깅 |
| A5 | LandXML·IFC Alignment import | **단계 도입** — MVP 자체 포맷만 / v1.1 LandXML 자체 파서 / v2 IFC 4.3 |
| A6 | WASM plugin 승격 | **3단계** — MVP 내부 모듈 / v2 **Extism** / v3 **Component Model (WIT)** |
| B7+B8 | Feature 카탈로그 + 파라미터 | Must 6 (거더·슬래브·교각·교대·받침·선형) / Should 3 / Won't 철근·사장·현수 |
| B9 | FEM 연동 | **하이브리드 단계** — MVP MIDAS Civil NX API export / v2 IFC SAV 2.0 / v3 간이 빔·프레임 내장 |
| B10 | LOD·렌더 | **BIM LOD 300 고정** + graphics LOD = discrete 2단 + 동적 tessellation. v2 meshlet. |
| C11 | 리본·패널 레이아웃 | **12탭 구성** (Home·Alignment·Structure·Feature·Site&GIS·Annotate·Analyze·Construction·Insert·View·Manage·Modify) + contextual 탭 |
| C12 | 선택·필터 | Category = **Feature kind**. cimery 고유: 선형 스테이션 선택·규칙 선택·영향권 하이라이트 |
| C13 | 사용자 설정 | **VS Code 3계층 모델** (Default→User→Project→Project.local) JSON. 좌표계·tolerance는 Project 잠금 |
---
## A1. UI 프레임워크 — Leptos + wgpu
**결정:** UI 셸은 **Leptos**, 3D 뷰포트는 `<canvas>`**wgpu** 직접 렌더.
**근거**
- Tauri v2는 본질상 WebView 기반 → Leptos 하나로 PWA·Tauri 양쪽 커버. 자산·패키징 단일화.
- Revit식 복잡 UI(리본·도킹·트리·속성창·IME·접근성)는 HTML/CSS 생태계 재사용이 현실적. egui의 immediate mode는 커스텀 위젯 비용 누적.
- Leptos의 **fine-grained reactivity**는 [[증분형 갱신 알고리즘 LPG]]의 부분 전파 모델과 정합.
- egui(이미 wgpu 통합 강점)도 고려했으나 **다국어·리본·속성창 밀도·Tauri/PWA 공유** 면에서 열세.
**기각:** Yew(VDOM 오버헤드·둔화), Dioxus(후보지만 Leptos 우위), egui(위 이유).
---
## A2. IFC 라이브러리 — 이원 전략
**결정:**
- **런타임(Rust+WASM):** `ifc-lite-core` (louistrue) — IFC4X3 스키마 876 엔티티, IFC5/IFCX 알파, WASM 일급 타깃.
- **검증·참조 구현(개발 파이프라인 전용):** `IfcOpenShell`.
**근거**
- `ifc_rs`는 알파·정체, Alignment/Bridge 미지원.
- IfcOpenShell LGPL은 WASM 배포에 까다로워 런타임 의존 비권장.
- 어댑터 레이어로 감싸 단일 유지보수자 리스크 격리 — 향후 교체 가능.
---
## A3. 빌드·배포 파이프라인 — 하이브리드 B
**결정:**
- **단기(MVP~v1):** Gitea Actions가 main CI(소스·PR·웹 배포), **GitHub Actions 미러**가 Windows/macOS Tauri 빌드·서명·릴리스 담당. 자동업데이트는 GitHub Releases 호스팅 `latest.json`.
- **중기:** Cloudflare **R2 + Worker**로 아티팩트·업데이터 엔드포인트를 자체 인프라로 회수.
**구성 요소**
- **Tauri v2 updater:** Ed25519 키쌍, `.sig` + `latest.json`, 개인키는 CI 시크릿.
- **Windows 서명:** **Azure Trusted Signing** 우선 (EV 하드웨어 토큰 불필요).
- **macOS 서명:** Apple Developer ID + notarization.
- **채널:** `nightly` / `beta` / `stable` = Git 태그 prefix + 별도 `latest-{channel}.json`.
- **웹(PWA):** 기존 Cloudflare Pages 확장 — `cimery-web.pages.dev`.
**기각:** Pure Gitea(macOS 러너·matrix 제약 부담), CrabNebula Cloud(벤더 락인, MVP 불필요).
---
## A4. USD 스키마 매핑 — Codeless Applied API Schema
**결정:** cimery 고유 개념을 **codeless USD applied API schema**로 정의하고, IR → USD evaluator가 Prim 단위 증분 export.
**핵심 매핑 (초안)**
| cimery Feature | USD Prim | Applied API |
|---|---|---|
| Alignment | `UsdGeomBasisCurves` | `CimeryAlignmentAPI` (stations·designSpeed·cantRef) |
| Bridge | `Xform` (`kind=assembly`) | `CimeryBridgeAPI` |
| Girder | `Xform` + child `Mesh` | `CimeryGirderAPI` (sectionType·spanLength·materialGrade) |
| Pier / Abutment | `Xform` + `Mesh` | `CimeryPierAPI` / `CimeryAbutmentAPI` |
| Bearing | `Xform` + `Mesh`, v2 `UsdPhysicsJoint` | `CimeryBearingAPI` |
| Deck Slab | `Mesh` | `CimeryDeckAPI` |
| Material | `UsdShade.Material` + MDL + UsdPreviewSurface | — |
| Coord / GIS | Root `Xform` | `CimeryGeoRefAPI` (EPSG·origin·rotation) |
**규칙**
- **이중 태깅:** 같은 Prim에 `CimeryGirderAPI` + `IfcGirder` 커스텀 속성 동시 적용 → AOUSD·IFC5 공식 스키마 등장 시 1-shot alias/migration.
- **Alignment 3층 보존:** 평면·종단·편경사를 sibling prims(`/Align/Horizontal`·`/Vertical`·`/Cant`)로 분리 `over`.
- **Assembly + Payload:** Bridge = `assembly`, Girder = `component`. 대형 모델은 payload로 lazy load.
- **파라메트릭 종속은 USD에 내보내지 않음** — derived geometry만. 규칙은 DSL IR에 유지 (ADR-002 재확인).
---
## A5. LandXML · IFC 4.3 Alignment import — 단계 도입
**결정:**
- **MVP (v0.1):** import 미구현. **자체 JSON 포맷만** 공식 입력 (ADR-002 R).
- **v1.1:** **LandXML 자체 파서** (`quick-xml` 기반). 범위: `<Alignment><CoordGeom>` 수평 + `<Profile>` 종단. 스파이럴은 polyline tessellation 수용.
- **v2:** **IFC 4.3 Alignment**`ifc-lite-core`(A2) 활용, 부족 시 fork. 수평·종단·캔트만 매핑.
**근거**
- 거더교 본질은 **내부 파라미터 복잡도**(ADR-002 배경) — 선형 입력 품질이 MVP 차별점 아님.
- IFC 4.3 Alignment 실무 라운드트립 2026년 아직 미성숙(Civil 3D·OpenRoads 모두 부분 지원).
- LandXML이 실무 교환 빈도·자체 구현 부담에서 우위.
---
## A6. WASM plugin 승격 — 3단계 경로
**결정:**
1. **MVP~v1:** 내부 Rust 모듈. WASM 승격 보류. IR/DSL 안정화 선행.
2. **v2:** **Extism** 얇은 래퍼 (`cimery-plugin` crate). Feature trait → Extism host 함수 매핑. `#[param(...)]` 메타를 WIT 유사 스키마로 export. Tauri + PWA 듀얼 (`webxtism`).
3. **v3:** **Component Model + WIT** 마이그레이션. `GeomKernel`·`Feature` 인터페이스 표준화. ABI 레이어만 교체.
**승격 게이팅 기준 (셋 다 충족 전엔 내부 모듈 유지)**
- (a) 써드파티/사내 별도 팀이 Feature 공급 실수요 발생
- (b) 핵심 Feature 10개 이상 안정화
- (c) salsa query 경계와 plugin 경계 일치
---
## B7+B8. Feature 카탈로그 + 파라미터 구조
### MoSCoW 우선순위
| 우선순위 | Feature |
|---|---|
| **Must (MVP v1)** | Girder · Deck Slab · Pier · Abutment · Bearing · **Alignment**(입력) |
| **Should (v1.1)** | Cross Beam / Diaphragm · Expansion Joint · Parapet / Barrier |
| **Could (v2)** | Pile Cap / Foundation · Approach Slab · Drainage · Sign Mount |
| **Won't (v3+)** | **Rebar / Tendon** · Cable-stay · Suspension · Arch · Truss · Moveable |
### Must Feature 파라미터 (발췌)
**Girder:** `alignment_ref`, `station_start/end`, `offset_from_alignment`, `section_type` (PSC_I·PSC_U·Steel_Box·Steel_Plate_I), `section` (composite: height·flange·web·haunch 등), `camber`, `material`, `count_per_span`, `spacing`.
**Deck Slab:** `alignment_ref`, `station_start/end`, `width_left/right`, `thickness`, `haunch_depth`, `cross_slope`, `overhang_left/right`.
**Pier:** `station`, `skew_angle`, `type` (Wall·Single_Column·Multi_Column·Hammerhead·Portal), `column_count/spacing`, `column_section`, `height`, `cap_beam` (composite), `foundation_level`.
**Abutment:** `station`, `skew_angle`, `type` (Reverse_T·Counterfort·Wall·Semi_Integral·Integral), `parapet_wall`, `breast_wall`, `wing_wall_left/right`, `footing`, `bearing_seat_level`.
**Bearing:** `station`, `girder_ref`, `support_ref`, `type` (Elastomeric·Pot·Spherical·Rocker·Fixed·Expansion_Uni/Bi), `capacity_vertical/horizontal`, `plan_dimension_x/y`, `total_height`, `anchor_bolt`, `installation_level`.
단위: 구조물 `Mm`, 선형 `M` (ADR-002 C).
---
## B9. FEM 연동 — 하이브리드 단계
**결정:**
- **MVP (v1):** **MIDAS Civil NX API** 한방향 export. 국내 설계자 즉시 채택 가능. cimery = 모델링, MIDAS = 해석의 역할 분담.
- **v2:** **IFC 4.3 Structural Analysis View 2.0** export 병행. Robot·SOFiSTiK·Dlubal 커버. `AnalysisExport` trait 추상화.
- **v3+:** **간이 빔·프레임 내장 solver** (`fenris` + `diffsol`). 실시간 피드백(자중 처짐 등)용. 본격 해석은 외부 위임 유지.
**근거**
- [[PCE 파라메트릭 변경 엔진|PCE]] 교훈: 변환 지점이 많을수록 파라메트릭 논리가 죽음. 내장이 이상적이나 MVP 리스크 과대.
- Rust FEM 생태계(2026-04)는 연구/2D 수준, 교량 실무용 성숙도 부족.
- MIDAS는 Python/Grasshopper 연동 사례 풍부, HTTP/FFI로 호출 가능.
---
## B10. LOD · 렌더 전략
**결정:**
- **BIM LOD:** **MVP = LOD 300 고정** (설계자 인도·수량 산출 가능). LOD 350/400은 v2, 철근은 v2+.
- **Graphics LOD:** **discrete 2단 (근·원) + 동적 tessellation (편집 Feature만 고해상도)** 하이브리드.
- **컬링·인스턴싱:** Frustum culling + per-Feature instancing(동일 세그먼트 거더). `UsdGeomBasisCurves`가 아닌 인스턴스는 LRS station 기반 인스턴스 버퍼.
- **클리핑:** WebGPU `clip-distances` 기반 단면(section) — 교량 종단 단면 필수 UX.
- **메모리:** Memory64(Chrome) 전제로 웹 4GB+ 확보. 원본 B-rep은 데스크톱만 상주, 웹은 tessellated mesh + Feature 메타만.
- **v2:** meshlet (Nanite-like) 파이프라인. 교량 군·도심 회랑 단위.
**기각:** MVP에서 meshlet 전면 도입 (`nanite-webgpu` 가능성 입증되나 `atomic<u64>` 미지원·SW raster 복잡도로 MVP 부담).
---
## C11. 리본·패널 레이아웃
### 기본 워크스페이스
```
┌── QAT + 앱 메뉴 + Info Center ────────────────────┐
├── Ribbon (탭 + 패널) ────────────────────────────┤
├Properties (좌상) ─┬── Drawing Area ──┬─(도구)────┤
├Project Browser │ ViewCube(우상) │ │
├─(좌하) │ Nav Bar │ │
└── View Control Bar + Status Bar ────────────────┘
```
### 리본 탭 12개
| 순서 | 탭 | 용도 |
|---|---|---|
| 1 | **Home** | Select · Create · Modify 시작 허브 |
| 2 | **Alignment** | 선형·프로파일·측점·단면 |
| 3 | **Structure** | Girder · Pier · Abutment · Deck · Bearing |
| 4 | **Feature** | FBM 피처 라이브러리 · Place · DSL Editor |
| 5 | **Site & GIS** | 지형 · CRS · GIS import · Geo-reference |
| 6 | **Annotate** | 치수 · 태그 · 텍스트 · 심볼 |
| 7 | **Analyze** | 수량 · 간섭 · 리포트 |
| 8 | **Construction** | 단계 · 공정 · 4D · Shop Drawing · (Rebar v2) |
| 9 | **Insert** | IFC/LandXML link · CAD import · Point cloud |
| 10 | **View** | 2D/3D 뷰 · Sheet · Visibility |
| 11 | **Manage** | Project Info · Units · Standards · Shared Params |
| 12 | **Modify** | (contextual; 항상 맨 오른쪽) Clipboard · Geometry · Modify |
**contextual 탭:** Civil 3D식. 거더 선택 → "Modify | Girder" 탭이 Modify 오른쪽에 자동 활성화.
**단축키 관습 유지:** Esc·VG·WT·ZE·SD 등 2글자 키인, 탭 더블클릭 → 리본 최소화.
---
## C12. 선택 · 필터 개념
### Revit ↔ cimery 대응
| Revit | cimery | 비고 |
|---|---|---|
| Element | **Feature instance** (IR 노드) | 규칙 결과물 |
| Category | **Feature kind** (Rust 타입) | `#[param]` 메타에서 자동 추출 |
| Type(패밀리 타입) | **Feature template** (struct + 파라미터 세트) | CSV 라운드트립 단위 |
| Tab 호버 순환 | composite 트리 상하 순환 (2단 결정적) | 그래프 금지 → 모호성 0 |
| Selection Filter (수동) | **Named selection set** (JSON) | Git diff 가능 |
| Rule-based Filter | **Parameter predicate** (`flange_thickness > 180mm`) | 타입 안전 질의 |
| View Filter | **View preset** (filter + 오버라이드, TOML) | AI·diff 친화 |
| Temporary Hide / Isolate | 동일 UX | 세션 한정 |
### cimery 고유 확장
1. **선형 기반 선택** — "스테이션 120180 m 구간의 모든 Girder".
2. **규칙 선택** — 생성 규칙 자체를 selector로 재사용.
3. **영향권 하이라이트** — salsa 의존성 그래프로 "이 파라미터 변경 시 무효화될 Feature" 시각화.
4. **Tab 범위 명시** — 2단 계층이므로 `instance ↔ composite parent` 2상태 토글.
---
## C13. 사용자 설정 — VS Code 3계층 모델
### 저장 레이아웃
```
~/.cimery/settings.json # User (전역, 장비별)
~/.cimery/keybindings.json # 키맵 분리
<project>/.cimery/settings.json # Project (Git 커밋)
<project>/.cimery/settings.local.json # 개인 override, .gitignore
```
**병합 순서:** Default ← User ← Project ← Project.local.
### 허용/제한 범주
| 범주 | 스코프 | 허용도 |
|---|---|---|
| 키맵 | User | 완전 허용 (Revit 기본값 + override) |
| 휠 방향·감도 | User | 허용 (반전 토글 + 계수 0.254.0) |
| 테마·언어·폰트·UI 스케일 | User | 허용 |
| 최근 파일·창 레이아웃 | User (state) | 자동 저장 |
| **표시 단위** | Project 기본 + User override | 설계 일관성 |
| 좌표계·선형 CRS·LRS | **Project 전용 (잠금)** | 데이터 무결성 |
| tolerance · snap | **Project 전용 (잠금)** | 재현성·솔버 결과 |
| 자동저장 주기 | User | 허용 |
| 텔레메트리 · 업데이트 채널 | User (global only) | 워크스페이스 override 금지 |
### 안전장치
- UI에 Project 전용 항목 잠금 표시.
- 키맵 충돌 검출기 (Revit 기본값 덮어쓸 때 경고).
- `"$schema"` · `"version"` 필드 초기부터 포함(마이그레이션 대비).
---
## 후속 결정 필요
- [ ] 첫 Feature 엔드-투-엔드 프로토타입 (Girder · DSL → IR → 기하 → USD)
- [ ] Revit 조작 관습 표 `raw/tools/revit/` 수집
- [ ] IFC 5 + USD 전환 자료 `raw/standards/` 수집 (ADR-002에서 이미 예정)
- [ ] MIDAS Civil NX API 접근 권한·개발 키
- [ ] WASM plugin 승격 게이팅 기준 달성 시점 감시
## 검토 시점
- 첫 Girder 엔드-투-엔드 동작 시 ADR 전체 재검토.
- AOUSD AECO 스펙 발표(2026~27 예상) 시 A4 재검토.
- Component Model 브라우저 성숙(~2027-2028) 시 A6 v3 승격.
- IFC 4.3 Alignment 실무 라운드트립 성숙 시 A5 조기 도입.