ArchDB로 모듈식 스키마 엔지니어링: 템플릿, 패키지, 선언적 모델링
ArchDB는 .adb 파일로 데이터베이스 구조를 선언적으로 기술하여 Git 저장소에 통합할 수 있게 합니다. 템플릿은 감사 및 식별 필드의 중복을 제거하고, 패키지는 모놀리식을 독립적인 모듈로 분해합니다. 이 모델은 DDL, 문서, 다이어그램을 생성합니다. 이 접근 방식은 변경 검토와 ORM 동기화를 가속화합니다.
// Core.adb - 기본 템플릿
Package com.example.ecommerce.Core
Template IdentifiableUuid {
id uuid [pk, default: `gen_random_uuid()`]
}
Template Auditable {
created_at timestamp [not_null, default: `now()`]
created_by uuid [ref: > User.id, nullable]
updated_at timestamp [default: `now()`]
updated_by uuid [ref: > User.id, nullable]
indexes {
idx_created_at (created_at)
}
}
Template BusinessEntity extends IdentifiableUuid, Auditable {
version_no integer [default: 1]
status varchar(50) [default: 'active']
}
재사용성을 위한 템플릿
템플릿은 extends를 통해 구성되며, 필드와 인덱스를 상속합니다. BusinessEntity는 식별, 감사, 버전 관리를 결합합니다. 이를 User 테이블에 적용하면 모든 필드가 자동으로 추가됩니다:
- PK와 기본 생성기가 있는 UUID id
- 인덱스가 있는 created_at/updated_at 필드
- 낙관적 잠금을 위한 version_no
체크와 고유 인덱스는 테이블 수준에서 구성됩니다:
Table User extends BusinessEntity {
email varchar(255) [unique, not_null]
password_hash text [not_null]
checks {
`char_length(password_hash) >= 8`
}
}
논리적 그룹은 색상과 설명을 할당하여 문서화 시각화를 향상시킵니다.
패키지를 통한 모듈식 분해
각 .adb 파일은 import가 있는 별도의 패키지입니다. Product.adb는 Core.adb를 import하여 BusinessEntity를 확장합니다:
// Product.adb
Package com.example.ecommerce.Product
import "com.example.ecommerce.Core.adb" version 3.4.0
export Product as "com.example.ecommerce.Product" version 3.6.0
Table Product extends Core.BusinessEntity {
sku varchar(50) [unique, not_null]
price decimal(12, 2) [not_null]
stock_quantity integer [default: 0]
available_quantity integer [generated: `stock_quantity - reserved_quantity`]
checks {
`price >= cost_price`
`reserved_quantity <= stock_quantity`
}
}
생성된 필드는 데이터베이스 수준에서 계산됩니다. Relation은 M:N 관계를 설명합니다:
Relation ProductCategory {
Product.id <-> Category.id
}
Export 버전 관리(export ... version)는 모듈 호환성을 보장합니다.
| 장점 | 설명 |
|-----------|-------------|
| 독립성 | 모듈의 병렬 개발 |
| 버전 관리 | import를 위한 Git + 시맨틱 버전 관리 |
| 재사용성 | 라이브러리를 통해 배포되는 템플릿 |
고급 엔티티: 주문과 열거형
Order.adb는 Core와 Product를 import하여 도메인 유형을 추가합니다:
// Order.adb
import "com.example.ecommerce.Core.adb" version 3.4.0
import "com.example.ecommerce.Product.adb" version 3.6.0
Enum OrderStatus {
pending [note: "결제 대기 중"]
paid
shipped
cancelled
}
Table Order extends Core.BusinessEntity {
user_id uuid [ref: > Core.User.id]
status OrderStatus [default: 'pending']
total_amount decimal(12, 2) [not_null]
}
Enum은 필드 유형으로 통합됩니다. FK에 대한 연쇄 삭제(on_delete: cascade).
핵심 요약
- 선언적: 원하는 상태를 기술; 생성기가 DDL과 마이그레이션을 생성합니다.
- 모듈성: 패키지 + import/export로 독립적인 개발과 CI/CD를 가능하게 합니다.
- 템플릿: extends로 감사 필드, 소프트 삭제, 비즈니스 로직을 복사-붙여넣기 없이 구성합니다.
- 검증: 스키마 수준의 체크, 계산을 위한 생성된 필드.
- 문서화: note, Group, Metadata로 다이어그램과 README를 생성합니다.
실용적인 구현 팁
- Identifiable, Auditable, SoftDeletable 템플릿이 있는 기본 Core.adb를 생성합니다.
- 모놀리식을 도메인별(User, Product, Order)로 패키지로 분할합니다.
- 커밋 전 스키마 검증을 위한 Git 훅을 설정합니다.
- CI와 통합: DDL 생성, 스키마 테스트, 문서 업데이트.
- ORM용: .adb에서 엔티티를 생성하는 스크립트.
Metadata와 Project는 컨텍스트를 설정합니다: database: "postgresql", version, author.
— Editorial Team
아직 댓글이 없습니다.