Diagram Maker›Language Reference
📐

Language Reference

Full syntax — every block, field, and diagnostic code

언어 참조

Datro DSL(.dtro 파일)에 대한 전체 구문 참조입니다. 모든 블록 유형, 모든 필드, 모든 진단 코드가 모두 한곳에 있습니다.

23개 노드 유형엣지 종류 21종6개의 제약 동사WCAG 2.1 AA/AAA

매직헤더

모든 .dtro 파일 반드시 1행의 매직 헤더로 시작해야 합니다. 파서는 파일이 없거나 형식이 잘못된 경우 E100를 반환합니다.

DATRO
#!DATRO 1.0
필수 첫 번째 줄 - `1.0`는 현재 사양 버전입니다.

메타 블록

선택적 문서 수준 메타데이터입니다. 생략되면 I003 정보 힌트를 생성합니다. kind를 제외한 모든 필드는 선택적 문자열/배열입니다.

DATRO
#!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
}
FieldTypeRequiredDescription
titlestringNo사람이 읽을 수 있는 다이어그램 제목
versionstringNo다이어그램의 의미론적 버전
descriptionstringNo자유 텍스트 설명
authorstringNo작성자 이름 또는 이메일
ownerstringNo팀 또는 담당자
tagsstring[]No임의 분류 태그
slastringNo서비스 수준 목표(예: "99.9%"
criticalitystringNo중요도 계층: "P0" | "high" | "medium" | "low"
kindDiagramKind
"architecture""mindmap""state""sequence""algorithm"
No다이어그램 변형

노드 블록

다이어그램에서 엔터티를 선언합니다. 각 노드에는 고유한 ID, 렌더링된 모양과 기본 색상을 제어하는 ​​의미 체계 type, 메타데이터에 대한 선택적 attrs 블록이 있습니다.

DATRO
# 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" } }
FieldTypeRequiredDescription
ididentifierYes고유 노드 식별자 — 영숫자 + 밑줄
typeNodeType
"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의미 노드 카테고리
labelstringNo다이어그램에 표시된 디스플레이 텍스트
groupidentifierNo이 노드가 속한 그룹 ID(group.members 대체)
attrsAttrMapNo임의의 키-값 메타데이터 — 문자열, 숫자, 부울 또는 배열
ℹ️

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.

가장자리 블록

두 노드 간의 관계를 선언합니다. 가장자리 방향은 ->(방향성), <->(양방향) 또는 --(방향성 없음) 선언에 직접 기록됩니다.

DATRO
# 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 }
FieldTypeRequiredDescription
fromidentifierYes소스 노드 ID
directionEdgeDir
"->""<->""--"
Yes인라인으로 작성된 화살표 유형
toidentifierYes대상 노드 ID
kindEdgeKind
"http""grpc""graphql""websocket""tcp""udp""query""event""publish""subscribe""stream""call""read""write""deploys""monitors""depends""extends""implements""triggers""unknown"
No의미론적 관계 유형 - 색상 및 스타일을 결정합니다.
labelstringNo가장자리 선에 표시되는 짧은 텍스트
weightnumberNo상대적 트래픽 가중치 - 가장자리가 무거워지면 더 두꺼워집니다.
asyncbooleanNotrue일 때 가장자리는 점선으로 렌더링됩니다(Fire-and-forget).
attrsAttrMapNo임의의 메타데이터 - 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를 참조할 수 있습니다.

DATRO
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
}
FieldTypeRequiredDescription
ididentifierYes고유 그룹 식별자
labelstringNo하위 그래프 상자의 표시 레이블
membersidentifier[]No포함할 노드 또는 그룹 ID — node { group: X }보다 우선합니다.
attrsAttrMapNo임의의 메타데이터

구속조건 블록

유효성 검사기가 IR에 대해 평가하는 아키텍처 규칙을 선언합니다. 위반은 E501(또는 severity: warn인 경우 W501)을 생성합니다. rule 필드는 간결한 3토큰 문법을 사용합니다.

DATRO
# 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
}
FieldTypeRequiredDescription
idstringNo사람이 읽을 수 있는 선택적 규칙 식별자
rulestringYesSUBJECT VERB OBJECT — 아래 동사 표 참조
messagestringNo규칙 위반 시 진단에 표시되는 맞춤 메시지
severityConstraintSeverity
"error""warn"
No위반 시 진단 심각도

제약 동사

  • `!->` — 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를 사용하세요.

DATRO
# 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]
FieldTypeRequiredDescription
pathstringYes.dtro 파일에 대한 상대 또는 절대 경로
asidentifierNo네임스페이스 별칭 — 가져온 모든 ID에는 alias.id 접두사가 붙습니다.
exposeidentifier[]No화이트리스트 — 이 ID만 상위 IR에 병합됩니다.

레이아웃 블록

그래프를 정렬하는 방법에 대해 렌더러에 대한 힌트입니다. 모든 필드는 선택 사항입니다. 렌더러는 블록이 생략될 때 합리적인 기본값을 사용합니다.

DATRO
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
}
FieldTypeRequiredDescription
directionLayoutDirection
"LR""RL""TB""BT"
No그래프 흐름 방향
algoLayoutAlgo
"dagre""dot""elk""force""none"
No레이아웃 알고리즘
node_sepnumberNo동일한 순위의 인접한 노드 사이의 최소 픽셀
rank_sepnumberNo순위 간 최소 픽셀
marginnumberNo그래프 여백(픽셀)
cluster_paddingnumberNo그룹 경계 상자 내부의 추가 패딩

테마 블록

렌더링된 다이어그램의 시각적 모양을 제어합니다. palette는 노드 유형을 16진수 색상으로 매핑합니다. accessibility 하위 블록은 자동 WCAG 2.1 대비 검사를 활성화합니다.

DATRO
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를 재정의합니다. 각 하위 블록은 키를 속성 맵에 매핑합니다.

DATRO
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" }
  }
}
FieldTypeRequiredDescription
by_typeRecord<NodeType, StyleProps>No특정 유형의 모든 노드에 적용되는 스타일
by_idRecord<id, StyleProps>No특정 노드 ID에 적용되는 스타일 - 가장 높은 우선순위
by_edge_kindRecord<EdgeKind, StyleProps>No특정 종류의 모든 가장자리에 적용되는 스타일
by_edge_attrRecord<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로 돌아가세요.
오픈 다이어그램 메이커

전체 언어를 실시간으로 사용해 보세요. 위의 내용을 붙여넣고 즉시 확인하세요.

Schema v1 · Updated October 2026