Language Reference
Full syntax — every block, field, and diagnostic code
언어 참조
Datro DSL(.dtro 파일)에 대한 전체 구문 참조입니다. 모든 블록 유형, 모든 필드, 모든 진단 코드가 모두 한곳에 있습니다.
매직헤더
모든 .dtro 파일 반드시 1행의 매직 헤더로 시작해야 합니다. 파서는 파일이 없거나 형식이 잘못된 경우 E100를 반환합니다.
#!DATRO 1.0메타 블록
선택적 문서 수준 메타데이터입니다. 생략되면 I003 정보 힌트를 생성합니다. kind를 제외한 모든 필드는 선택적 문자열/배열입니다.
#!DATRO 1.0
meta {
title: "Payment Service"
version: "2.1.0"
description: "Handles card and crypto charges"
author: "jane@example.com"
owner: "payments-team"
tags: ["payments", "critical"]
sla: "99.95%"
criticality: "P0"
kind: architecture
}| Field | Type | Required | Default | Description |
|---|---|---|---|---|
title | string | No | — | 사람이 읽을 수 있는 다이어그램 제목 |
version | string | No | — | 다이어그램의 의미론적 버전 |
description | string | No | — | 자유 텍스트 설명 |
author | string | No | — | 작성자 이름 또는 이메일 |
owner | string | No | — | 팀 또는 담당자 |
tags | string[] | No | — | 임의 분류 태그 |
sla | string | No | — | 서비스 수준 목표(예: "99.9%" |
criticality | string | No | — | 중요도 계층: "P0" | "high" | "medium" | "low" |
kind | DiagramKind "architecture""mindmap""state""sequence""algorithm" | No | architecture | 다이어그램 변형 |
노드 블록
다이어그램에서 엔터티를 선언합니다. 각 노드에는 고유한 ID, 렌더링된 모양과 기본 색상을 제어하는 의미 체계 type, 메타데이터에 대한 선택적 attrs 블록이 있습니다.
# Minimal
node api_gw { type: gateway label: "API Gateway" }
# With attrs block
node payment_svc {
type: service
label: "Payment Service"
attrs {
tech: "nestjs"
owner: "payments-team"
deprecated: false
sla: "99.95%"
}
}
# Inline attrs (alternative syntax)
node db { type: database label: "Payments DB" attrs { tech: "postgres" } }| Field | Type | Required | Default | Description |
|---|---|---|---|---|
id | identifier | Yes | — | 고유 노드 식별자 — 영숫자 + 밑줄 |
type | NodeType "service""database""queue""cache""gateway""user""actor""system""external""process""storage""function""broker""scheduler""load_balancer""cdn""dns""firewall""client""mobile""web""iot""unknown" | No | unknown | 의미 노드 카테고리 |
label | string | No | (node id) | 다이어그램에 표시된 디스플레이 텍스트 |
group | identifier | No | — | 이 노드가 속한 그룹 ID(group.members 대체) |
attrs | AttrMap | No | — | 임의의 키-값 메타데이터 — 문자열, 숫자, 부울 또는 배열 |
23개 노드 유형
모든 23개 값: service database queue cache gateway user actor system external process storage function broker scheduler load_balancer cdn dns firewall client mobile web iot unknown.
가장자리 블록
두 노드 간의 관계를 선언합니다. 가장자리 방향은 ->(방향성), <->(양방향) 또는 --(방향성 없음) 선언에 직접 기록됩니다.
# Minimal
edge api_gw -> payment_svc { kind: http }
# Full metadata
edge payment_svc -> stripe {
kind: http
label: "charge API"
weight: 2.0
async: false
attrs { sla: "200ms" }
}
# Bidirectional edge
edge cache <-> service { kind: read }
# Undirected edge
edge svc_a -- svc_b { kind: depends }| Field | Type | Required | Default | Description |
|---|---|---|---|---|
from | identifier | Yes | — | 소스 노드 ID |
direction | EdgeDir "->""<->""--" | Yes | — | 인라인으로 작성된 화살표 유형 |
to | identifier | Yes | — | 대상 노드 ID |
kind | EdgeKind "http""grpc""graphql""websocket""tcp""udp""query""event""publish""subscribe""stream""call""read""write""deploys""monitors""depends""extends""implements""triggers""unknown" | No | unknown | 의미론적 관계 유형 - 색상 및 스타일을 결정합니다. |
label | string | No | — | 가장자리 선에 표시되는 짧은 텍스트 |
weight | number | No | 1.0 | 상대적 트래픽 가중치 - 가장자리가 무거워지면 더 두꺼워집니다. |
async | boolean | No | false | true일 때 가장자리는 점선으로 렌더링됩니다(Fire-and-forget). |
attrs | AttrMap | No | — | 임의의 메타데이터 - JSON IR 및 도구 설명으로 전달됨 |
엣지 종류 21종
모든 21개 값: http grpc graphql websocket tcp udp query event publish subscribe stream call read write deploys monitors depends extends implements triggers unknown.
그룹 블록
관련 노드를 레이블이 지정된 하위 그래프 상자로 클러스터링합니다. 노드는 최대 하나의 그룹에 속할 수 있습니다. E403는 충돌 시 실행됩니다. 그룹은 중첩될 수 있습니다. 구성원 ID는 다른 그룹 ID를 참조할 수 있습니다.
group data_tier {
label: "Data Layer"
members: [payments_db, fraud_cache, audit_log]
attrs { compliance: "PCI-DSS" }
}
# Alternative: assign group on the node
node payments_db {
type: database
label: "Payments DB"
group: data_tier
}| Field | Type | Required | Default | Description |
|---|---|---|---|---|
id | identifier | Yes | — | 고유 그룹 식별자 |
label | string | No | (group id) | 하위 그래프 상자의 표시 레이블 |
members | identifier[] | No | [] | 포함할 노드 또는 그룹 ID — node { group: X }보다 우선합니다. |
attrs | AttrMap | No | — | 임의의 메타데이터 |
구속조건 블록
유효성 검사기가 IR에 대해 평가하는 아키텍처 규칙을 선언합니다. 위반은 E501(또는 severity: warn인 경우 W501)을 생성합니다. rule 필드는 간결한 3토큰 문법을 사용합니다.
# Prohibition: databases may not call external services
constraint {
id: "no-db-external"
rule: "database !-> external"
message: "Databases must not connect directly to external APIs"
severity: error
}
# Requirement: every gateway must connect to a service
constraint {
rule: "gateway -> service"
message: "Each gateway must route to at least one service"
severity: warn
}
# Membership: all databases must be in the data_tier group
constraint {
rule: "database in data_tier"
message: "All database nodes must belong to the data_tier group"
severity: error
}| Field | Type | Required | Default | Description |
|---|---|---|---|---|
id | string | No | — | 사람이 읽을 수 있는 선택적 규칙 식별자 |
rule | string | Yes | — | SUBJECT VERB OBJECT — 아래 동사 표 참조 |
message | string | No | — | 규칙 위반 시 진단에 표시되는 맞춤 메시지 |
severity | ConstraintSeverity "error""warn" | No | error | 위반 시 진단 심각도 |
제약 동사
- `!->` —
SUBJECT노드는OBJECT노드에 대한 방향성 간선을 가질 수 없습니다. - `->` — 모든
SUBJECT노드에는OBJECT노드로 향하는 간선이 하나 이상 있어야 합니다. - `!<->` —
SUBJECT및OBJECT노드 사이에는 양방향 에지가 존재할 수 없습니다. - `<->` — 모든
SUBJECT노드에는 일부OBJECT노드에 대한 양방향 에지가 있어야 합니다. - `in` — 모든
SUBJECT노드는OBJECT그룹의 구성원이어야 합니다. - `!in` —
SUBJECT노드는OBJECT그룹의 구성원이 될 수 없습니다.
주체 및 객체 토큰
각 토큰은 노드 유형(database, external, …), 그룹 ID(예: data_tier) 또는 *(모든 노드와 일치하는 와일드카드)일 수 있습니다.
수입 블록
여러 .dtro 파일에 걸쳐 큰 다이어그램을 분할합니다. 확인자는 검증 전에 가져온 IR을 상위 IR에 병합합니다. 네임스페이스에는 as를 사용하고 특정 ID를 화이트리스트에 추가하려면 expose를 사용하세요.
# Import everything from another .dtro file
import "auth.dtro"
# Import with a namespace alias — IDs become auth.user_service, etc.
import "auth.dtro" as auth
# Import only specific IDs (whitelist)
import "infra.dtro" as infra expose [load_balancer, cdn]| Field | Type | Required | Default | Description |
|---|---|---|---|---|
path | string | Yes | — | .dtro 파일에 대한 상대 또는 절대 경로 |
as | identifier | No | — | 네임스페이스 별칭 — 가져온 모든 ID에는 alias.id 접두사가 붙습니다. |
expose | identifier[] | No | — | 화이트리스트 — 이 ID만 상위 IR에 병합됩니다. |
레이아웃 블록
그래프를 정렬하는 방법에 대해 렌더러에 대한 힌트입니다. 모든 필드는 선택 사항입니다. 렌더러는 블록이 생략될 때 합리적인 기본값을 사용합니다.
layout {
direction: LR # LR | RL | TB | BT
algo: dagre # dagre | dot | elk | force | none
node_sep: 60 # px between nodes in the same rank
rank_sep: 120 # px between ranks
margin: 20 # graph margin in px
cluster_padding: 16 # padding inside group boxes
}| Field | Type | Required | Default | Description |
|---|---|---|---|---|
direction | LayoutDirection "LR""RL""TB""BT" | No | LR | 그래프 흐름 방향 |
algo | LayoutAlgo "dagre""dot""elk""force""none" | No | dagre | 레이아웃 알고리즘 |
node_sep | number | No | 60 | 동일한 순위의 인접한 노드 사이의 최소 픽셀 |
rank_sep | number | No | 120 | 순위 간 최소 픽셀 |
margin | number | No | 20 | 그래프 여백(픽셀) |
cluster_padding | number | No | 16 | 그룹 경계 상자 내부의 추가 패딩 |
테마 블록
렌더링된 다이어그램의 시각적 모양을 제어합니다. palette는 노드 유형을 16진수 색상으로 매핑합니다. accessibility 하위 블록은 자동 WCAG 2.1 대비 검사를 활성화합니다.
theme {
name: "Corporate"
palette {
service: "#D0E8FF"
database: "#FFE8C0"
gateway: "#FFD0D0"
queue: "#E8D0FF"
cache: "#C0FFE8"
external: "#F0F0F0"
background: "#FFFFFF"
}
typography {
font_family: "Inter, sans-serif"
node_font_size: 11
edge_font_size: 9
label_font_weight: "600"
}
accessibility {
min_contrast: AA # AA | AAA | none
max_label_length: 60
}
}자동 글꼴 색상
DOT 내보내기는 WCAG 2.1 상대 휘도 공식을 사용하여 각 노드 채우기에 대해 검정색 또는 흰색 텍스트를 자동으로 선택합니다. 별도의 텍스트 색상을 설정할 필요가 없습니다.
스타일 블록
테마 이후에 세분화된 요소별 재정의가 적용됩니다. 규칙 계단식 적용: by_id가 by_type를 재정의합니다. 각 하위 블록은 키를 속성 맵에 매핑합니다.
style {
# Override by node type
by_type {
database { fill: "#FFF3CD" stroke: "#E6A817" shape: cylinder }
external { fill: "#F8F9FA" stroke: "#6C757D" dash: true }
}
# Override individual node by id
by_id {
stripe { fill: "#635BFF" stroke: "#4B44CC" }
}
# Style edge kinds
by_edge_kind {
query { color: "#E6A817" width: 2 }
publish { color: "#198754" dash: true }
}
# Style edges that carry a boolean attr set to true
by_edge_attr {
async { dash: true color: "#ADB5BD" }
}
}| Field | Type | Required | Default | Description |
|---|---|---|---|---|
by_type | Record<NodeType, StyleProps> | No | — | 특정 유형의 모든 노드에 적용되는 스타일 |
by_id | Record<id, StyleProps> | No | — | 특정 노드 ID에 적용되는 스타일 - 가장 높은 우선순위 |
by_edge_kind | Record<EdgeKind, StyleProps> | No | — | 특정 종류의 모든 가장자리에 적용되는 스타일 |
by_edge_attr | Record<attrName, StyleProps> | No | — | 명명된 부울 속성이 true인 가장자리에 적용되는 스타일 |
진단 코드
모든 진단에는 code, severity, message 및 선택적 line:col 위치가 포함됩니다. 아래 표에는 툴체인이 내보낼 수 있는 모든 코드가 나열되어 있습니다.
오류(E×××)
- `E100` — 매직 헤더
#!DATRO 1.0가 없거나 형식이 잘못되었습니다. - `E201` — 중복 노드 ID
- `E202` — 노드가 알 수 없는 그룹 ID를 참조합니다.
- `E301` — 에지
from노드를 찾을 수 없습니다. - `E302` — 에지
to노드를 찾을 수 없습니다. - `E303` — 가장자리
weight는 음수입니다. - `E401` — 중복된 그룹 ID
- `E402` — 그룹
members이 알 수 없는 ID를 참조합니다. - `E403` — 노드가 둘 이상의 그룹에 할당됨
- `E404` — 원형 그룹 중첩이 감지되었습니다.
- `E500` — 제약 규칙에 구문 오류가 있습니다.
- `E501` — 제약 조건 규칙이 위반되었습니다(심각도는 제약 조건 자체
severity를 반영함).
경고(W×××)
- `W301` — 중복 가장자리(동일한 시작/끝/종류/레이블)
- `W501` — 제약 규칙이 알 수 없는 동사를 사용합니다.
- `W601` — 노드 레이블이
max_label_length을 초과합니다(기본값 80자). - `W602` — 테마 팔레트 색상이 WCAG AA 대비(4.5:1)보다 낮습니다.
- `W603` — 테마 팔레트 색상이 WCAG AAA 대비(7.0:1)보다 낮습니다.
정보 힌트(I×××)
- `I001` — 격리된 노드 — 연결된 가장자리가 없습니다.
- `I002` — 빈 그룹 — 선언된 멤버가 없습니다.
- `I003` —
meta블록 없음 — 문서화에 권장됨 - `I601` — 테마 팔레트가 정의되지 않음 — 대비 검사를 건너뛰었습니다.
다음 단계
- CLI Reference를 사용하여 명령줄에서 유효성을 검사하고 형식을 지정하고 내보냅니다.
- Markdown plugin를 사용하여 Markdown에 다이어그램을 포함합니다.
- 단계별 연습을 보려면 Quick Start로 돌아가세요.
전체 언어를 실시간으로 사용해 보세요. 위의 내용을 붙여넣고 즉시 확인하세요.