{ "version": "1.1", "id": "record-kind-fanout", "title": "새 CONCEPT 종류가 세 영역의 손 목록으로 퍼진 구조", "question": "CONCEPT 하나를 추가했는데 왜 계약·백엔드·프론트엔드 여러 위치를 동시에 고쳐야 했는가?", "type": "dependency", "direction": "LR", "audience": [ "프론트엔드 개발자", "백엔드 개발자", "계약 설계자" ], "summary": "종류를 손으로 나열한 코드가 여러 영역에 흩어져 있어 CONCEPT 하나가 프론트엔드 9곳, 백엔드 1곳, 계약 3곳에서 따로 빠졌다.", "alt": "새 CONCEPT 노드에서 프론트엔드 손 목록, 백엔드 손 목록, 계약 enum 세 갈래로 퍼지는 팬아웃 그림. 각 갈래에는 실제 누락 건수 9, 1, 3이 적혀 있다.", "long_description": "왼쪽의 새 CONCEPT가 세 갈래로 퍼진다. 프론트엔드에는 게이트웨이 분기, 매퍼, 필터 같은 손 목록이 아홉 곳 있었고, 백엔드에는 PublicSql.pathOf 한 곳이 빠졌다. 계약에는 CatalogEntry.kind, ResolvedRelation.targetKind, RelatedEntry.type 세 enum 누락이 있었다. 아래 본문 표가 열세 위치를 정확히 나열하고, 그림은 왜 한 종류 변경이 세 영역으로 퍼졌는지만 보여 준다.", "source_context": { "document": "docs/TechLog/final/document.md", "document_sha256": "c3a7de37b778fff7b6ea555a3ad7338c91c6fb15d685e7734f89472b4924d955", "anchor": { "kind": "heading", "value": "3. 손으로 나열한 목록이 새 종류를 삼킨다", "line": 311 } }, "composition": { "profile": "component-flow", "diagram_only": true, "reference_ids": [ "payment-event-flow" ], "rationale": "정확한 열세 위치는 이미 표가 있으므로, 그림은 새 종류 하나에서 계약·백엔드·프론트엔드로 퍼지는 의존 방향만 보여 준다.", "focus_node": "concept" }, "groups": [], "nodes": [ { "id": "concept", "label": "CONCEPT", "kind": "message", "role": "source", "details": [ "새 Record Kind" ], "evidence": [ { "start_line": 316, "end_line": 331 } ], "assumption": false, "emphasis": "primary" }, { "id": "frontend", "label": "Frontend 손 목록", "kind": "component", "role": "service", "details": [ "9곳", "gateway · mapper · filter" ], "evidence": [ { "start_line": 335, "end_line": 345 } ], "assumption": false }, { "id": "backend", "label": "Backend 손 목록", "kind": "component", "role": "service", "details": [ "1곳", "PublicSql.pathOf" ], "evidence": [ { "start_line": 345, "end_line": 349 } ], "assumption": false }, { "id": "contract", "label": "Contract enums", "kind": "component", "role": "sink", "details": [ "3곳", "CatalogEntry.kind", "ResolvedRelation.targetKind", "RelatedEntry.type" ], "evidence": [ { "start_line": 346, "end_line": 352 } ], "assumption": false } ], "edges": [ { "id": "to-frontend", "from": "concept", "to": "frontend", "label": "kind 추가", "kind": "data", "evidence": [ { "start_line": 330, "end_line": 345 } ], "assumption": false }, { "id": "to-backend", "from": "concept", "to": "backend", "label": "kind 추가", "kind": "data", "evidence": [ { "start_line": 345, "end_line": 349 } ], "assumption": false }, { "id": "to-contract", "from": "concept", "to": "contract", "label": "enum 추가", "kind": "data", "evidence": [ { "start_line": 346, "end_line": 352 } ], "assumption": false } ], "legend": [], "metadata": { "rationale": "13개의 동일한 카드 대신 세 영역으로만 묶는다. 정확한 누락 위치와 증상은 본문 표가 유지한다." } }