Stage 4 — 비즈니스 미니앱 CDF v2 마이그레이션 어댑터
개요
CrownyDoc 5트랙 중 비즈니스 미니앱(견적서/제안서/도면) 전용 JSON 포맷을 CDF v2 공통 데이터 모델로 양방향 변환하는 어댑터 레이어를 구현했다. 3종 JS 변환 함수 + 한선씨 RPN 검증 파일 5개 = 총 6개 파일 신규 생성.
무엇을 했는지
생성 파일 (6개, 1199줄)
| 파일 | 줄수 | 역할 |
|---|---|---|
견적서/한선씨/견적→cdf.rpn.한선 | 127 | 견적서 → CDF v2 수치 검증 (RPN 정통) |
제안서/한선씨/제안→cdf.rpn.한선 | 122 | 제안서 → CDF v2 수치 검증 (RPN 정통) |
도면/한선씨/도면→cdf.rpn.한선 | 130 | 도면 → CDF v2 수치 검증 (RPN 정통) |
lib/legacy-merge.js | 633 | 3종 양방향 변환기 (CommonJS + 브라우저 듀얼) |
lib/legacy-merge.한선 | 187 | legacy-merge.js 한선씨 동반 (RPN 정통) |
| (이 파일) docs/2026-05-27-stage4-cdf-v2-마이그레이션.md | — | 작업 문서 |
변환 규칙 요약
견적서 → CDF v2
- 공급자/공급받는자 →
__bizMeta - 공종 N개 → sheet 셀 N개 (공종셀1..N)
- 특기사항[] → text 셀 (불릿 리스트)
- 정산결과 → text 셀 (합계셀) +
__bizMeta.정산옵션 - 시냅스: 공종→합계
depend, 합계→특기reference - 광주은광교회 LED 기준: 원가합 18,645,720 → 공급가 18,640,000 → 부가세 1,864,000 → 합계 20,504,000
- 표지(키비주얼/한줄요약/기대효과3) → text 셀 (h1+요약+불릿)
- 본문[5절] 각 절 → text 셀; 절 내 표/일정 → sheet 셀 embed
- 총투자비(VAT 포함) 역산:
× 100 / 110→ 공급가액 확정 - 총 셀 8개, 시냅스 7개
- 도형 타입 정규화: 사각→rect, 선→line, 원→circle, 텍스트→text
- 전체 도형/연결/레이어/범례 → diagram 셀 1개
- BOM 있는 도형 →
__bizMeta.BOM[] - px→mm 변환: 캔버스 10000×7000mm, LED 3200×900mm (면적 28,800cm²)
- 참조 견적 링크 → 외부참조 시냅스 (
reference)
JS 변환기 API (lib/legacy-merge.js)
javascript// 전방 변환
CrownyLegacyMerge.quoteToCDF(quoteJson) // 견적서 → CDF v2
CrownyLegacyMerge.proposalToCDF(proposalJson) // 제안서 → CDF v2
CrownyLegacyMerge.diagramToCDF(diagramJson) // 도면 → CDF v2
// 역방향 변환
CrownyLegacyMerge.cdfToQuote(cdfV2) // CDF v2 → 견적서
CrownyLegacyMerge.cdfToProposal(cdfV2) // CDF v2 → 제안서
CrownyLegacyMerge.cdfToDiagram(cdfV2) // CDF v2 → 도면
// 일괄 마이그레이션
CrownyLegacyMerge.migrateAll({ 견적서: [...], 제안서: [...], 도면: [...] })
// → { processed: N, 견적서: M, 제안서: K, 도면: J, errors: [...] }
핵심 기술 이슈 해결
hanseonc_std 자연 반올림 보정: RPN VM은 뱅커스 라운딩(|r|≤|b|/2) 사용 → 절사 단위 1만 원 처리 시 올림 오류 발생. 해법:
원가합 10000 나눠 10000 곱해 →임시
임시 원가합 크다 @보정 만약
; 임시가 크면 한 단위 빼서 내림
도형 타입 정규화: 레거시 JSON의 한국어 타입(사각/선/원)을 CDF v2 영어(rect/line/circle/text)로 양방향 매핑. JS에서 Map 객체로 구현, 한선씨에서 숫자 코드(1=사각/2=선/3=원/4=텍스트)로 표현.
제안서 VAT 역산: 총투자비가 VAT 포함 금액일 때 → × 100 / 110 정수 RPN 연산으로 공급가액 확정.
관련 파일 경로
/Users/ef/CrownyDoc/lib/legacy-merge.js # JS 3종 양방향 변환기
/Users/ef/CrownyDoc/lib/legacy-merge.한선 # 한선씨 RPN 동반
/Users/ef/CrownyDoc/lib/cdf-v2-spec.md # CDF v2 스펙 (TypeScript 인터페이스)
/Users/ef/CrownyDoc/견적서/한선씨/견적→cdf.rpn.한선
/Users/ef/CrownyDoc/제안서/한선씨/제안→cdf.rpn.한선
/Users/ef/CrownyDoc/도면/한선씨/도면→cdf.rpn.한선
/Users/ef/CrownyDoc/견적서/data/교회LED표준.json # 테스트 입력 (6공종, 14항목)
/Users/ef/CrownyDoc/제안서/data/교회LED표준.json # 테스트 입력 (총투자비 20,504,000)
/Users/ef/CrownyDoc/도면/data/교회LED평면도.json # 테스트 입력 (4도형, BOM 1개)
잔여 이슈
- 한선씨 RPN 컴파일 미검증 —
hanseonc_std.toau실행 권한 불허로 3개.rpn.한선파일 실제 컴파일+실행 미완. 다음 세션에서:
bash cd /Users/ef/CrownyOS/crownyc
cat /Users/ef/CrownyDoc/견적서/한선씨/견적→cdf.rpn.한선 \
| ./crownyc run hanseonc_std.toau > /tmp/견적cdf.toau
./crownyc run /tmp/견적cdf.toau
- server-docs.js 연동 미완 —
GET /api/migrate?type=quote등 엔드포인트 추가 검토 가능 (다른 세션 담당) - INVENTORY.md 업데이트 필요 — Stage 4 어댑터 레이어 항목 추가 (다음 CrownyDoc 세션에서)
- 일괄 마이그레이션 테스트 —
migrateAll()Node.js 통합 테스트 미실행
Stage 현황
| Stage | 파일 | 상태 |
|---|---|---|
| Stage 0 | CDF v2 스펙 (lib/cdf-v2-spec.md) | ✓ 완료 |
| Stage 2 | 도형 라이브러리·레이어·그룹 (서브에이전트) | ✓ 완료 |
| Stage 3 | 트랙1·2 .cdf v2 호환 어댑터 (서브에이전트) | ✓ 완료 |
| Stage 4 | 비즈니스 미니앱 CDF v2 어댑터 | ✓ 이번 세션 |