2.4 KiB
2.4 KiB
KBX v27 — T02 / T03 Golden Record Lifecycle
목표
T02/T03의 완성 기준을 단순 Form 렌더링이 아니라 레코드의 생성·수정·상태전이·동시성·감사·복구가 하나의 예측 가능한 UX 계약으로 닫히는 것으로 정의한다.
공통 Record Lifecycle
KbxRecordLifecycle은 다음을 동일 위치/순서로 표현한다.
- Version
- Optimistic Concurrency Conflict
- Workflow / 현재 상태 / 다음 가능 Action
- Audit Trail
KbxCommandBar는 allowedStatuses, requiresDirty, requiresClean, permissionByStatus, confirm을 해석한다. 상태가 허용되지 않는 Action은 임의 실행되지 않고 비활성 사유를 제공한다.
T02 — ERP-MST-ITEM-001
- 신규 상태: 입력 가능, 저장은
erp.item.create - 사용 상태: 입력 가능, 저장/사용중지는
erp.item.write - 사용중지 상태: Read-only
- Update/Deactivate는
version을 비교한다. - stale write는 409 conflict로 거부하고 사용자 입력을 보존한다.
- 최신값 재조회는 사용자의 명시적 Action으로만 수행한다.
- Write Model은
catalog.items+catalog.item_details; Grid 조회는erp_item_search_projection을 사용한다. - Write transaction 안에서 Audit + Outbox + Projection을 함께 갱신한다.
T03 — OMS-ORD-002
- 신규: 아직 DB 레코드가 없음
- 작성: 저장 가능, 주문확정 가능(단 Dirty이면 먼저 저장)
- 확정 이후: 일반 입력 Read-only
- 기존 주문은
/oms/orders/:orderId/edit에서 동일 Template으로 다시 연다. - 저장 충돌 시 내 화면과 최신 주요 필드 값을 비교한다.
- 주문확정은
Idempotency-Key=order-confirm:{orderId}:{version}으로 안전하게 재시도한다. - 확정 Transaction은 상태 + Version + Audit + Outbox + command receipt를 원자적으로 반영한다.
보안 경계
- 화면에서 Disabled/Readonly는 UX 표현이다.
- 신규 주문 등록:
oms.order.create - 작성 주문 수정:
oms.order.write - 주문 확정:
oms.order.confirm - Backend Permission과 Domain 상태 검증이 최종 방어선이다.
기술부채 방지
- 상태별 버튼 if/switch를 각 Page에 복제하지 않는다.
- Conflict UI를 화면별로 만들지 않는다.
- Audit을 JSON dump로 노출하지 않는다.
- Projection을 Write Source of Truth로 사용하지 않는다.
- 위험 Workflow의
confirm:true를 선언만 하고 무시하지 않는다.