feat: 가상화 문서들 추가

This commit is contained in:
DongHyeonka
2026-09-10 08:54:05 +09:00
parent e9f6a93327
commit 43e1aadef0
695 changed files with 153404 additions and 12754 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,156 @@
{
"version": "1.1",
"title": "프로젝션은 엔티티 적재를 없앴지만 페이지당 자식 전량은 남긴다",
"question": "스칼라 프로젝션으로 바꾼 뒤에도 남아 있는 과조회는 무엇인가?",
"type": "data-flow",
"direction": "TB",
"audience": [
"조회 전략을 단계적으로 바꾸는 백엔드 개발자"
],
"summary": "자식 IN 조회가 페이지 부모의 하이라이트를 전부 가져오고 화면은 부모별 최신 몇 개만 쓴다.",
"alt": "페이지 부모에서 자식 IN 조회를 거쳐 자식 행 전량이 나오고, 화면이 그중 부모별 최신 몇 개만 쓰는 흐름. IN 조회 상자에는 엔티티 적재가 없다는 표시가 붙어 있다.",
"long_description": "페이지 부모의 키가 자식 IN 조회로 들어간다. 이 조회는 엔티티를 만들지 않지만 페이지 부모의 하이라이트를 전부 가져온다. 화면이 실제로 쓰는 것은 부모별 최신 몇 개뿐이라 가져온 자식 행과 쓰는 자식 행 사이에 차이가 남는다.",
"composition": {
"profile": "component-flow",
"diagram_only": true,
"reference_ids": [
"payment-event-flow"
],
"rationale": "부모 키에서 자식 조회를 거쳐 화면까지 값이 한 방향으로 흐르고, 그 경로의 마지막 구간에서만 양이 줄어드는 것이 이 절의 주장이다.",
"focus_node": "fetched-child-rows"
},
"groups": [],
"nodes": [
{
"id": "page-parents",
"label": "페이지 부모",
"kind": "source",
"role": "source",
"shape": "box",
"description": "첫 페이지에 실린 부모 행",
"evidence": [
{
"start_line": 1121,
"end_line": 1122
}
],
"assumption": false
},
{
"id": "child-in-query",
"label": "자식 IN 조회",
"kind": "service",
"role": "service",
"shape": "box",
"details": [
"엔티티 적재 없음"
],
"description": "스칼라 프로젝션으로 바꾼 자식 조회",
"evidence": [
{
"start_line": 1121,
"end_line": 1122
}
],
"assumption": false
},
{
"id": "fetched-child-rows",
"label": "자식 행 전량",
"kind": "store",
"role": "store",
"shape": "box",
"details": [
"페이지 부모 하이라이트 전량"
],
"emphasis": "primary",
"description": "IN 조회가 실제로 가져온 자식 행",
"evidence": [
{
"start_line": 1121,
"end_line": 1123
}
],
"assumption": false
},
{
"id": "screen-need",
"label": "화면 사용분",
"kind": "sink",
"role": "sink",
"shape": "box",
"details": [
"부모당 최신 몇 개"
],
"description": "화면 렌더링에 필요한 범위",
"evidence": [
{
"start_line": 1124,
"end_line": 1125
}
],
"assumption": false
}
],
"edges": [
{
"id": "keys-in",
"from": "page-parents",
"to": "child-in-query",
"label": "부모 키 IN",
"kind": "query",
"style": "solid",
"evidence": [
{
"start_line": 1121,
"end_line": 1122
}
],
"assumption": false
},
{
"id": "fetch-all",
"from": "child-in-query",
"to": "fetched-child-rows",
"label": "부모별 전량 반환",
"kind": "response",
"style": "solid",
"evidence": [
{
"start_line": 1121,
"end_line": 1123
}
],
"assumption": false
},
{
"id": "use-some",
"from": "fetched-child-rows",
"to": "screen-need",
"label": "부분 사용",
"kind": "transform",
"style": "dashed",
"evidence": [
{
"start_line": 1124,
"end_line": 1125
}
],
"assumption": false
}
],
"legend": [],
"metadata": {
"rationale": "엔티티 과적재가 사라진 자리와 아직 남은 과조회 자리를 한 경로 위에서 갈라 보여야 하므로 흐름으로 그린다."
},
"source_context": {
"document": "docs/n+1liner/final/document.md",
"document_sha256": "385ca44db5bf763cb1ff28a67d531d68876402b35d21dc54f2bc702e8bda0053",
"anchor": {
"kind": "heading",
"value": "12.6 프로젝션이 못 푸는 것 — 페이지당 전량",
"line": 1119
}
},
"id": "projection-row-over-fetch"
}