- 계약 채택 — schema 2 → 4. 독자 질문, 후보 36건(PROMOTE 24 · MERGE_INTO 8 · KEEP_IN_SSOT 4), 종류별 칸, kind:slug 관계. 저장소 github-project/ca-tmpl @ 761384d (문서가 인용한 IT 7종이 그 커밋에 있다) - 재선별 결과 기존 24건이 전부 살아남았다. 측정이 Reference 안에 들어 있었지만 독립성 검사를 통과하지 못해 Case 로 빼지 않았다 - 평문 칸의 백틱 제거, 「기준선」을 실제 이름으로, frontmatter 에 source·sourceRevision - 리뷰 39건 반영 — 설명 뒤에 붙은 평가·예고·되풀이·독자 오해 가정을 지웠다. 사실을 담은 절반이 있는 문장은 평가만 뺐다 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
46 lines
3.1 KiB
XML
46 lines
3.1 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="660" height="230" viewBox="0 0 660 230" role="img" aria-labelledby="diagram-title diagram-description">
|
|
<title id="diagram-title">프로젝션은 엔티티 적재를 없애지만 자식 행수는 줄지 않는다</title>
|
|
<desc id="diagram-description">왼쪽 배치 방식은 페이지를 조회하면서 엔티티를 대량으로 하이드레이트한다. 가운데 프로젝션은 필요한 스칼라 값만 캐리어로 받아 엔티티를 만들지 않고 발행 쿼리도 상수로 고정한다. 다만 오른쪽처럼 자식 조회는 페이지 부모의 자식을 전부 가져오므로 행수는 줄지 않는다. 화면이 필요로 하는 것은 부모당 상위 몇 개뿐이다.</desc>
|
|
<defs>
|
|
<marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
<path d="M 0 0 L 10 5 L 0 10 z" />
|
|
</marker>
|
|
<pattern id="hatch" width="7" height="7" patternTransform="rotate(45)" patternUnits="userSpaceOnUse">
|
|
<line x1="0" y1="0" x2="0" y2="7" stroke="#9ca3af" stroke-width="3" />
|
|
</pattern>
|
|
<style>
|
|
:root { color-scheme: light; }
|
|
text { font-family: Inter, Pretendard, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; fill: #111827; }
|
|
.canvas { fill: #ffffff; }
|
|
.group-box { fill: #ffffff; stroke: #9ca3af; stroke-width: 1.4; stroke-dasharray: 7 5; }
|
|
.group-label-bg { fill: #ffffff; }
|
|
.group-label { font-size: 13px; font-weight: 650; fill: #374151; }
|
|
.edge { fill: none; stroke: #374151; stroke-width: 1.8; stroke-linejoin: round; stroke-linecap: round; marker-end: url(#arrow); }
|
|
.edge.dashed { stroke-dasharray: 7 5; }
|
|
.edge.primary { stroke: #2563eb; stroke-width: 2.2; }
|
|
.edge.muted { stroke: #9ca3af; }
|
|
.node { fill: #ffffff; stroke: #4b5563; stroke-width: 1.7; }
|
|
.node.primary { stroke: #2563eb; stroke-width: 2.4; }
|
|
.node.muted { stroke: #9ca3af; fill: #f9fafb; }
|
|
.node.marked { stroke: #4b5563; stroke-width: 2.4; stroke-dasharray: 5 4; }
|
|
.label { font-size: 14px; font-weight: 650; text-anchor: middle; }
|
|
.fill-kept { fill: #2563eb; stroke: none; }
|
|
.fill-drop { fill: url(#hatch); stroke: #9ca3af; stroke-width: 1; }
|
|
.fill-none { fill: #ffffff; stroke: #d1d5db; stroke-width: 1; }
|
|
</style>
|
|
</defs>
|
|
<rect class="canvas" width="660" height="230" />
|
|
<rect class="node " x="30" y="70" width="170" height="80" rx="7" />
|
|
<text class="label" x="115.0" y="115.0">엔티티 적재</text>
|
|
<rect class="node primary" x="245" y="60" width="170" height="100" rx="7" />
|
|
<text class="label" x="330.0" y="115.0">스칼라 프로젝션</text>
|
|
<rect class="node marked" x="460" y="70" width="170" height="80" rx="7" />
|
|
<text class="label" x="545.0" y="115.0">자식 행 전량</text>
|
|
<polyline class="edge primary" points="200,110 245,110" />
|
|
<polyline class="edge muted" points="415,110 460,110" />
|
|
<rect class="group-box" x="20" y="178" width="620" height="40" rx="9" />
|
|
<rect class="group-label-bg" x="34" y="169" width="135.6" height="18" />
|
|
<text class="group-label" x="40" y="182">적재는 사라지고 행수는 남는다</text>
|
|
</svg>
|