Files
document-haness/docs/n+1liner/final/assets/diagrams/strategy-journey/strategy-journey.drawio
T

52 lines
5.8 KiB
XML
Executable File

<?xml version="1.0" encoding="UTF-8"?>
<mxfile host="app.diagrams.net" modified="2026-07-23T00:00:00.000Z" agent="techviz-harness" version="24.7.17" type="device">
<diagram id="strategy-journey" name="두 형제 문제는 Fetch Join에서 합류한 뒤 단계별 해법으로 최종 구조가 된다">
<mxGraphModel dx="1236" dy="421" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1236" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="n_requirements-model-baseline" value="요구사항·모델·기준선&lt;br/&gt;1 과제 요구사항&lt;br/&gt;2 도메인·데이터 모델&lt;br/&gt;3 최초 피드 조회" tooltip="전체 여정은 과제 요구사항에서 도메인·데이터 모델을 거쳐 최초 피드 조회 기준선으로 시작한다. | Evidence: L25-L25" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="70.0" y="165.5" width="150.0" height="105.0" as="geometry"/>
</mxCell>
<mxCell id="n_collection-n-plus-one" value="컬렉션 N+1 (N1)&lt;br/&gt;유형: 컬렉션 N+1&lt;br/&gt;발생: 기준선과 동시에&lt;br/&gt;관계: N2와 형제 문제&lt;br/&gt;진행: Fetch Join으로 합류" tooltip="기준선에서 N2와 동시에 나타나는 컬렉션 조회 문제다. | Evidence: L25-L25" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="383.5" y="60.0" width="167.0" height="122.0" as="geometry"/>
</mxCell>
<mxCell id="n_hidden-to-one-queries" value="User·Page 숨은 쿼리 (N2)&lt;br/&gt;유형: User·Page 숨은 쿼리&lt;br/&gt;발생: 기준선과 동시에&lt;br/&gt;관계: N1과 형제 문제&lt;br/&gt;진행: Fetch Join으로 합류" tooltip="기준선에서 N1과 동시에 나타나는 User·Page 연관의 숨은 쿼리 문제다. | Evidence: L25-L25" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="380.0" y="254.0" width="174.0" height="122.0" as="geometry"/>
</mxCell>
<mxCell id="n_fetch-join-failure" value="Fetch Join → 실패&lt;br/&gt;1 N1·N2 합류&lt;br/&gt;2 다중 컬렉션·페이징 실패" tooltip="N1과 N2가 Fetch Join 시도에서 합류한 뒤 다중 컬렉션·페이징 실패로 이어진다. | Evidence: L25-L25" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;strokeColor=#d97706;fillColor=#fffdf5;" vertex="1" parent="1">
<mxGeometry x="714.0" y="174.0" width="150.0" height="88.0" as="geometry"/>
</mxCell>
<mxCell id="n_improvement-chain" value="후속 개선 → 최종 구조&lt;br/&gt;1 Batch Fetch&lt;br/&gt;2 DTO Projection&lt;br/&gt;3 아이템별 Top-3&lt;br/&gt;4 Keyset Pagination&lt;br/&gt;5 가시성 조건 인덱싱&lt;br/&gt;6 최종 피드 조회 구조" tooltip="실패 뒤 다섯 조회 전략 단계가 명시된 순서로 발전해 최종 피드 조회 구조를 만든다. | Evidence: L25-L25" style="whiteSpace=wrap;html=1;rounded=1;strokeWidth=2;fontSize=14;fontStyle=1;fillColor=#ffffff;strokeColor=#2d4357;verticalAlign=middle;strokeColor=#2563eb;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="1024.0" y="140.0" width="167.0" height="156.0" as="geometry"/>
</mxCell>
<mxCell id="e_baseline-reveals-n1" value="기준선에서 갈라짐" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_requirements-model-baseline" target="n_collection-n-plus-one">
<mxGeometry relative="1" as="geometry">
<mxPoint x="325.8" y="165.0" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="e_baseline-reveals-n2" value="기준선에서 갈라짐" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_requirements-model-baseline" target="n_hidden-to-one-queries">
<mxGeometry relative="1" as="geometry">
<mxPoint x="324.0" y="271.0" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="e_failure-to-improvements" value="실패 뒤 단계별 개선" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_fetch-join-failure" target="n_improvement-chain">
<mxGeometry relative="1" as="geometry">
<mxPoint x="944.0" y="190.0" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="e_n1-joins-fetch-join" value="Fetch Join으로 합류" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_collection-n-plus-one" target="n_fetch-join-failure">
<mxGeometry relative="1" as="geometry">
<mxPoint x="656.2" y="165.0" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="e_n2-joins-fetch-join" value="Fetch Join으로 합류" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=2;endArrow=block;endFill=1;" edge="1" parent="1" source="n_hidden-to-one-queries" target="n_fetch-join-failure">
<mxGeometry relative="1" as="geometry">
<mxPoint x="658.0" y="271.0" as="offset"/>
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>