{ "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" }