{ "version": "1.1", "id": "value-boundaries", "title": "공개 화면 한 줄까지 값이 지나는 열한 개의 경계 — 다섯 묶음", "question": "공개 화면 한 줄의 값은 어느 경계를 순서대로 지나며, 그중 어디까지가 백엔드이고 어디부터가 프론트엔드인가?", "type": "data-flow", "direction": "LR", "audience": [ "백엔드 개발자", "프론트엔드 개발자", "아키텍처 검토자" ], "summary": "열한 개의 경계를 지나는 자리별로 묶으면 저장 둘, 백엔드 조립 넷, 전선 하나, 프론트엔드 조립 셋, 화면 하나다.", "alt": "저장·백엔드 조립·HTTP envelope·프론트엔드 조립·화면 다섯 묶음을 tech-log-backend·전선·tech-log-frontend 세 구역으로 나눠 이은 흐름도. 묶음마다 그 안에 든 경계 수가 2·4·1·3·1 로 적혀 있다.", "long_description": "왼쪽에서 오른쪽으로 읽는다. tech-log-backend 구역에 저장 묶음과 백엔드 조립 묶음이 있고 각각 경계 둘과 넷을 담는다. 전선 구역에는 HTTP envelope 하나가 있다. tech-log-frontend 구역에는 프론트엔드 조립 묶음과 화면 컴포넌트가 있고 각각 경계 셋과 하나다. 다 더하면 열한 개이고, 각 경계의 이름은 그림 위 목록에 있다.", "source_context": { "document": "document.md", "document_sha256": "93b9fec4884efa0e6231de07dc27e2b0ac36c9052d3720e28d102d9747ac4f8f", "anchor": { "kind": "marker", "value": "value-boundaries", "line": 82 } }, "composition": { "profile": "component-flow", "diagram_only": true, "reference_ids": [ "payment-event-flow" ], "rationale": "본문 1.2 절은 값이 PostgreSQL 테이블에서 화면 컴포넌트까지 한 방향으로 지나는 사슬을 나열한다. directed data path 이므로 component-flow 다. 자동 선택이 고른 세 후보(ports-adapters, comparison, two-zone-pipeline)는 사슬 안에 있는 어댑터·포트·계약이라는 낱말에 반응한 것이고, 본문이 묻는 것은 코어를 둘러싼 의존 방향도 선택지 비교도 아니다. two-zone-pipeline 은 구역마다 2열 격자로 놓아 열한 단계 사슬이 되돌아 꺾이고 lint 가 edge-through-node 로 막았다. 소유 경계는 group 으로 남긴다." }, "groups": [ { "id": "backend", "label": "tech-log-backend", "kind": "system", "role": "zone", "evidence": [ { "start_line": 50, "end_line": 52 } ], "assumption": false }, { "id": "wire", "label": "전선 (HTTP)", "kind": "network", "role": "zone", "evidence": [ { "start_line": 75, "end_line": 75 } ], "assumption": false }, { "id": "frontend", "label": "tech-log-frontend", "kind": "system", "role": "zone", "evidence": [ { "start_line": 54, "end_line": 56 } ], "assumption": false } ], "nodes": [ { "id": "store", "label": "저장", "kind": "database", "shape": "box", "role": "store", "group": "backend", "details": [ "경계 2" ], "description": "값이 출발하는 두 자리.", "evidence": [ { "start_line": 69, "end_line": 70 } ], "assumption": false }, { "id": "backend-assembly", "label": "백엔드 조립", "kind": "service", "role": "service", "group": "backend", "details": [ "경계 4" ], "emphasis": "warning", "description": "조회 결과가 응답 모양이 되기까지의 네 자리.", "evidence": [ { "start_line": 71, "end_line": 74 } ], "assumption": false }, { "id": "http-envelope", "label": "HTTP envelope", "kind": "message", "role": "transfer", "group": "wire", "description": "두 저장소를 잇는 전선.", "evidence": [ { "start_line": 75, "end_line": 75 } ], "assumption": false, "details": [ "경계 1" ] }, { "id": "frontend-assembly", "label": "프론트엔드 조립", "kind": "service", "role": "service", "group": "frontend", "details": [ "경계 3" ], "description": "응답이 화면이 쓰는 모양이 되기까지의 세 자리.", "evidence": [ { "start_line": 76, "end_line": 78 } ], "assumption": false }, { "id": "screen", "label": "화면 컴포넌트", "kind": "component", "role": "sink", "group": "frontend", "description": "값이 도착해 한 줄로 그려지는 자리.", "evidence": [ { "start_line": 79, "end_line": 79 }, { "start_line": 66, "end_line": 66 } ], "assumption": false, "details": [ "경계 1" ] } ], "edges": [ { "id": "g1", "from": "store", "to": "backend-assembly", "label": "SQL 조회", "kind": "data", "style": "solid", "evidence": [ { "start_line": 70, "end_line": 71 } ], "assumption": false }, { "id": "g2", "from": "backend-assembly", "to": "http-envelope", "label": "HTTP 응답", "kind": "data", "style": "solid", "evidence": [ { "start_line": 74, "end_line": 75 } ], "assumption": false }, { "id": "g3", "from": "http-envelope", "to": "frontend-assembly", "label": "HTTP 수신", "kind": "data", "style": "solid", "evidence": [ { "start_line": 75, "end_line": 76 } ], "assumption": false }, { "id": "g4", "from": "frontend-assembly", "to": "screen", "label": "화면 한 줄", "kind": "data", "style": "solid", "evidence": [ { "start_line": 78, "end_line": 79 } ], "assumption": false } ], "legend": [], "metadata": { "rationale": "각 경계의 이름은 바로 위 목록이 이미 순서대로 적는다. 그림은 그 열한 개가 어느 소유 구역에 몇 개씩 놓이는지만 담는다.", "profile_deviation": "techviz references 가 고른 후보 밖의 프로필이다. 후보 셋으로는 사슬을 그릴 수 없어 component-flow 로 갔고 lint 는 0 error 로 통과했다.", "layout_note": "LR 로 둔다. TB 는 aspect-ratio 경고를 없애지만 그룹 이름이 잘리고(tech-log-fro) 오른쪽이 비어, 읽기에는 LR 이 낫다. 남는 경고는 advisory 다." } }