Files
project-infra/presentation/diagrams/03-app-ca.drawio
T

117 lines
12 KiB
Plaintext

<mxfile host="app.diagrams.net" modified="2026-04-28T00:00:00.000Z" agent="Mozilla/5.0" version="24.0.0" type="device">
<diagram name="03-app-ca" id="ca">
<mxGraphModel dx="1600" dy="900" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="900" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="m-bootstrap" value="bootstrap (composition root · main · SecurityFilterChain)" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#DBEAFE;strokeColor=#1E40AF;strokeWidth=2;dashed=0;fontSize=13;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#1E40AF;align=left;verticalAlign=top;spacingLeft=12;spacingTop=8;" vertex="1" parent="1">
<mxGeometry x="60" y="120" width="980" height="600" as="geometry" />
</mxCell>
<mxCell id="m-presentation" value="presentation" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFE4E6;strokeColor=#BE123C;strokeWidth=2;fontSize=14;fontStyle=1;fontFamily=Pretendard,Helvetica;align=left;verticalAlign=top;spacingLeft=12;spacingTop=8;fontColor=#BE123C;" vertex="1" parent="1">
<mxGeometry x="100" y="180" width="430" height="120" as="geometry" />
</mxCell>
<mxCell id="m-presentation-rep" value="ApiResult&lt;T&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=13;fontFamily=monospace;fontColor=#7F1D1D;" vertex="1" parent="1">
<mxGeometry x="120" y="216" width="390" height="26" as="geometry" />
</mxCell>
<mxCell id="m-presentation-sub" value="REST controller · ExceptionHandler · ErrorCode 매핑" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=11;fontStyle=2;fontFamily=Pretendard,Helvetica;fontColor=#7F1D1D;" vertex="1" parent="1">
<mxGeometry x="120" y="248" width="390" height="40" as="geometry" />
</mxCell>
<mxCell id="m-infrastructure" value="infrastructure" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ECFDF5;strokeColor=#047857;strokeWidth=2;fontSize=14;fontStyle=1;fontFamily=Pretendard,Helvetica;align=left;verticalAlign=top;spacingLeft=12;spacingTop=8;fontColor=#047857;" vertex="1" parent="1">
<mxGeometry x="570" y="180" width="430" height="120" as="geometry" />
</mxCell>
<mxCell id="m-infrastructure-rep" value="JpaUserRepositoryAdapter" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=13;fontFamily=monospace;fontColor=#064E3B;" vertex="1" parent="1">
<mxGeometry x="590" y="216" width="390" height="26" as="geometry" />
</mxCell>
<mxCell id="m-infrastructure-sub" value="JPA · Flyway 마이그레이션 · 외부 시스템 어댑터" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=11;fontStyle=2;fontFamily=Pretendard,Helvetica;fontColor=#064E3B;" vertex="1" parent="1">
<mxGeometry x="590" y="248" width="390" height="40" as="geometry" />
</mxCell>
<mxCell id="m-application" value="application (use cases · ports)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F3E8FF;strokeColor=#5B21B6;strokeWidth=2;fontSize=14;fontStyle=1;fontFamily=Pretendard,Helvetica;align=left;verticalAlign=top;spacingLeft=12;spacingTop=8;fontColor=#5B21B6;" vertex="1" parent="1">
<mxGeometry x="180" y="380" width="780" height="120" as="geometry" />
</mxCell>
<mxCell id="m-application-rep" value="BusinessException · AuthErrorCode" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=13;fontFamily=monospace;fontColor=#3B0764;" vertex="1" parent="1">
<mxGeometry x="200" y="416" width="740" height="26" as="geometry" />
</mxCell>
<mxCell id="m-application-sub" value="Use Case 오케스트레이션 · 트랜잭션 경계 · audit 이벤트 발행" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=11;fontStyle=2;fontFamily=Pretendard,Helvetica;fontColor=#3B0764;" vertex="1" parent="1">
<mxGeometry x="200" y="448" width="740" height="40" as="geometry" />
</mxCell>
<mxCell id="m-domain" value="domain (Spring/Hibernate/JPA/servlet 의존 0)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FEF3C7;strokeColor=#B45309;strokeWidth=2;fontSize=14;fontStyle=1;fontFamily=Pretendard,Helvetica;align=left;verticalAlign=top;spacingLeft=12;spacingTop=8;fontColor=#B45309;" vertex="1" parent="1">
<mxGeometry x="280" y="580" width="580" height="120" as="geometry" />
</mxCell>
<mxCell id="m-domain-rep" value="User · DomainException" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=13;fontFamily=monospace;fontColor=#78350F;" vertex="1" parent="1">
<mxGeometry x="300" y="616" width="540" height="26" as="geometry" />
</mxCell>
<mxCell id="m-domain-sub" value="순수 비즈니스 모델 · 도메인 규칙 · 외부 의존성 0" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=11;fontStyle=2;fontFamily=Pretendard,Helvetica;fontColor=#78350F;" vertex="1" parent="1">
<mxGeometry x="300" y="648" width="540" height="40" as="geometry" />
</mxCell>
<mxCell id="dep1" style="endArrow=classic;html=1;strokeColor=#DC2626;strokeWidth=4;fontFamily=Pretendard,Helvetica;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.3;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="m-presentation" target="m-application">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="dep2" style="endArrow=classic;html=1;strokeColor=#DC2626;strokeWidth=4;fontFamily=Pretendard,Helvetica;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.7;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="m-infrastructure" target="m-application">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="dep3" style="endArrow=classic;html=1;strokeColor=#DC2626;strokeWidth=5;fontFamily=Pretendard,Helvetica;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="m-application" target="m-domain">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="dep-lbl" value="의존은 항상 안쪽으로" style="text;html=1;align=center;verticalAlign=middle;fontSize=12;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#DC2626;fillColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="900" y="528" width="160" height="22" as="geometry" />
</mxCell>
<mxCell id="archunit-title" value="ArchUnit 핵심 4 규칙" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=14;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#1F6FEB;" vertex="1" parent="1">
<mxGeometry x="1080" y="120" width="480" height="30" as="geometry" />
</mxCell>
<mxCell id="archunit-sub" value="LayerDependencyArchitectureTest · 자동 검증" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=11;fontStyle=2;fontFamily=Pretendard,Helvetica;fontColor=#57606A;" vertex="1" parent="1">
<mxGeometry x="1080" y="148" width="480" height="22" as="geometry" />
</mxCell>
<mxCell id="ar-h0" value="대상" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#F6F8FA;strokeColor=#D0D7DE;strokeWidth=1;fontSize=12;fontStyle=1;fontFamily=Pretendard,Helvetica;align=center;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="1080" y="180" width="160" height="36" as="geometry" />
</mxCell>
<mxCell id="ar-h1" value="금지하는 것" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#F6F8FA;strokeColor=#D0D7DE;strokeWidth=1;fontSize=12;fontStyle=1;fontFamily=Pretendard,Helvetica;align=center;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="1240" y="180" width="320" height="36" as="geometry" />
</mxCell>
<mxCell id="ar-r1c0" value="domain" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FEF3C7;strokeColor=#D0D7DE;strokeWidth=1;fontSize=12;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#78350F;align=center;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="1080" y="216" width="160" height="60" as="geometry" />
</mxCell>
<mxCell id="ar-r1c1" value="Spring · Hibernate · JPA · servlet" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#D0D7DE;strokeWidth=1;fontSize=12;fontFamily=monospace;align=center;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="1240" y="216" width="320" height="60" as="geometry" />
</mxCell>
<mxCell id="ar-r2c0" value="application" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#F3E8FF;strokeColor=#D0D7DE;strokeWidth=1;fontSize=12;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#3B0764;align=center;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="1080" y="276" width="160" height="60" as="geometry" />
</mxCell>
<mxCell id="ar-r2c1" value="presentation · infrastructure · Spring web" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#D0D7DE;strokeWidth=1;fontSize=12;fontFamily=monospace;align=center;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="1240" y="276" width="320" height="60" as="geometry" />
</mxCell>
<mxCell id="ar-r3c0" value="presentation" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFE4E6;strokeColor=#D0D7DE;strokeWidth=1;fontSize=12;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#7F1D1D;align=center;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="1080" y="336" width="160" height="60" as="geometry" />
</mxCell>
<mxCell id="ar-r3c1" value="domain · infrastructure" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#D0D7DE;strokeWidth=1;fontSize=12;fontFamily=monospace;align=center;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="1240" y="336" width="320" height="60" as="geometry" />
</mxCell>
<mxCell id="ar-r4c0" value="presentation" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFE4E6;strokeColor=#D0D7DE;strokeWidth=1;fontSize=12;fontStyle=1;fontFamily=Pretendard,Helvetica;fontColor=#7F1D1D;align=center;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="1080" y="396" width="160" height="60" as="geometry" />
</mxCell>
<mxCell id="ar-r4c1" value="SecurityContext · Authentication 직접 접근" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#D0D7DE;strokeWidth=1;fontSize=12;fontFamily=monospace;align=center;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="1240" y="396" width="320" height="60" as="geometry" />
</mxCell>
<mxCell id="archunit-note" value="나머지 4 규칙: ApiResult SLF4J 금지 · infrastructure @Transactional 금지 등" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;fontSize=11;fontFamily=Pretendard,Helvetica;fontColor=#57606A;fontStyle=2;" vertex="1" parent="1">
<mxGeometry x="1080" y="468" width="480" height="22" as="geometry" />
</mxCell>
<mxCell id="legend" value="bootstrap 박스가 다른 4 모듈을 감싸는 외곽 — composition root 만이 모든 모듈을 알아도 됨" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#1F6FEB;strokeWidth=1;dashed=1;fontSize=12;fontStyle=2;fontFamily=Pretendard,Helvetica;fontColor=#1E40AF;align=left;verticalAlign=middle;spacingLeft=14;" vertex="1" parent="1">
<mxGeometry x="1080" y="540" width="480" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>