The keycloak project ended with four open questions that design could not
settle. A two-VM lab was built to answer them by measurement, and this is
that material: 26 experiments, 125 raw command outputs, 22 browser captures.
Follows the import procedure in README.md.
source/ the originating repository verbatim — 78 documents, 28 SVGs,
8 manifests, plus .source-revision recording the commit
final/ the SSOT
document.md 729 lines written from the 29 experiment documents, not
concatenated: what was predicted, what was measured, and
where the measurement itself was wrong
evidence/raw 125 outputs, flattened to <experiment>__<file> because
the originals collided (01-baseline.txt appeared three
times) and the audit only globs the top level
evidence/meta one per raw file; command and exitCode are null and the
README says why rather than inventing them
evidence/browser 22 captures
assets/ three diagrams through techviz
.techviz/ their VizSpecs
A separate project rather than an addition to keycloak: the B-layer answers
that project's four questions, but the A, C and D layers are about cluster
failure, SSO and operations, and one document.md should hold one subject.
The four question records there can point here through 관계.
Recorded rather than papered over: only three of the 28 diagrams were
remade. The repository forbids hand-drawn SVG and forbids titles inside the
canvas; all 28 originals carry both, so converting them is redrawing, not
reformatting. They stay in source/ and the gap is written into the document.
verify-pipeline.py passes. audit-records.py reports no issues.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
172 lines
29 KiB
XML
172 lines
29 KiB
XML
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="2988" viewBox="0 0 1200 2988" role="img">
|
|
<title>terminal evidence</title>
|
|
<desc>Terminal-style rendering generated from retained command output. Sensitive-looking values are redacted in the visual asset.</desc>
|
|
<rect x="1" y="1" width="1198" height="2986" rx="14" fill="#0d1117" stroke="#30363d"/>
|
|
<rect x="1" y="1" width="1198" height="44" rx="14" fill="#161b22"/>
|
|
<rect x="1" y="30" width="1198" height="14" fill="#161b22"/>
|
|
<circle cx="24" cy="22" r="6" fill="#ff5f57"/>
|
|
<circle cx="44" cy="22" r="6" fill="#febc2e"/>
|
|
<circle cx="64" cy="22" r="6" fill="#28c840"/>
|
|
<text x="92" y="27" fill="#8b949e" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace">terminal evidence</text>
|
|
<text x="24" y="68" fill="#c9d1d9" font-size="15" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">$ set -e
|
|
set -o pipefail
|
|
G=src/adapter/inbound/graphql/src/main/java/dev/caskeleton/adapter/inbound/graphql
|
|
strip() { se</tspan><tspan x="24" dy="22">d -E 's#^src/[^:]*/src/(main|test|testFixtures)/[^:]*/([^:/]+):([0-9]+):# \1 · \2:\3 #'; }
|
|
|
|
echo "# 이름 요구를 읽는 </tspan><tspan x="24" dy="22">세 클래스의 줄 수"
|
|
wc -l $G/execution/GraphQlOperationNamePolicy.java \
|
|
$G/runtime/GraphQlOperationSelectionHandle</tspan><tspan x="24" dy="22">r.java \
|
|
$G/http/GraphQlRequestEnvelopeValidator.java \
|
|
| sed -E 's#^ *([0-9]+) .*/([^/]+)$# \2 : \1 줄#' | gre</tspan><tspan x="24" dy="22">p -v total
|
|
|
|
echo
|
|
echo "# GraphQlOperationNamePolicy 를 자기 파일 밖에서 쓰는 자리"
|
|
git grep -n 'GraphQlOperationNamePoli</tspan><tspan x="24" dy="22">cy' -- 'src/**/*.java' \
|
|
| grep -v '/GraphQlOperationNamePolicy.java:' | strip
|
|
|
|
echo
|
|
echo "# GraphQlOperationNameInter</tspan><tspan x="24" dy="22">ceptor 를 자기 파일 밖에서 쓰는 자리"
|
|
git grep -n 'GraphQlOperationNameInterceptor' -- 'src/**/*.java' \
|
|
| grep -v '/G</tspan><tspan x="24" dy="22">raphQlOperationNameInterceptor.java:' | strip
|
|
|
|
echo
|
|
echo "# GraphQlRequestEnvelopeValidator 를 실제로 만드는 자리 전부"
|
|
</tspan><tspan x="24" dy="22">git grep -n 'GraphQlRequestEnvelopeValidator\.\(forPolicy\|maxVariablesBytes\)' -- 'src/**/*.java' \
|
|
| grep -v '/Graph</tspan><tspan x="24" dy="22">QlRequestEnvelopeValidator.java:' \
|
|
| sed -E 's#^src/[^:]*/src/([a-zA-Z]+)/[^:]*/([^:/]+):([0-9]+):.*# \1 · \2:\3#'
|
|
</tspan><tspan x="24" dy="22">
|
|
echo
|
|
echo "# namedOperationRequired 를 읽는 프로덕션 코드"
|
|
git grep -n 'policy.namedOperationRequired()\|namedOperation</tspan><tspan x="24" dy="22">Required &&' -- 'src/**/*.java' | strip
|
|
|
|
echo
|
|
echo "# GraphQlClientPolicy 인스턴스를 만드는 프로덕션 코드 전부"
|
|
git grep</tspan><tspan x="24" dy="22"> -n 'new GraphQlClientPolicy(\|GraphQlClientPolicy.defaults(' -- 'src/**/*.java' | grep '/main/' | strip
|
|
echo " 그 빈을</tspan><tspan x="24" dy="22"> 내놓는 자리 :"
|
|
awk 'NR>=300 && NR<=308 {printf " GraphQlPlatformAutoConfiguration.java:%d %s\n", NR, $0}' \
|
|
$G/autoc</tspan><tspan x="24" dy="22">onfigure/GraphQlPlatformAutoConfiguration.java
|
|
echo " defaults 가 마지막 세 성분에 넣는 값과 그 성분의 이름 :"
|
|
grep -n </tspan><tspan x="24" dy="22">'introspectionAllowed,$' $G/policy/GraphQlClientPolicy.java | tail -1 \
|
|
| sed -E 's#^([0-9]+):# 값 GraphQlClientPo</tspan><tspan x="24" dy="22">licy.java:\1 #'
|
|
grep -n '^ false,$\|^ false);$' $G/policy/GraphQlClientPolicy.java \
|
|
| sed -E 's#^([0-9]</tspan><tspan x="24" dy="22">+):# 값 GraphQlClientPolicy.java:\1 #'
|
|
grep -n 'boolean introspectionAllowed,\|boolean persistedOperationOnly,\|bool</tspan><tspan x="24" dy="22">ean namedOperationRequired)' $G/policy/GraphQlClientPolicy.java \
|
|
| sed -E 's#^([0-9]+):# 이름 GraphQlClientPolicy.</tspan><tspan x="24" dy="22">java:\1 #'
|
|
|
|
echo
|
|
echo "# 배선된 핸들러가 요청 경로에 오르는 사슬"
|
|
git grep -n 'new GraphQlOperationSelectionHandler(\|Gr</tspan><tspan x="24" dy="22">aphQlExecutionChain.stable(\|new GraphQlPlatformInstrumentation(' -- 'src/**/*.java' | grep '/main/' | strip
|
|
grep -n 'ch</tspan><tspan x="24" dy="22">ain.run(' $G/runtime/GraphQlPlatformInstrumentation.java \
|
|
| sed -E 's#^([0-9]+):# GraphQlPlatformInstrumentation.jav</tspan><tspan x="24" dy="22">a:\1 #'
|
|
echo " 그 사슬이 붙는 어댑터 자체의 조건 :"
|
|
grep -n 'ConditionalOnProperty' $G/autoconfigure/GraphQlRootAutoCon</tspan><tspan x="24" dy="22">figuration.java \
|
|
| sed -E 's#^([0-9]+):# GraphQlRootAutoConfiguration.java:\1 #'
|
|
|
|
echo
|
|
echo "# GraphQlRequestContext</tspan><tspan x="24" dy="22">.operationId 를 읽는 프로덕션 코드"
|
|
hits=$(git grep -n 'requestContext()\.operationId()' -- 'src/adapter/inbound/graphql</tspan><tspan x="24" dy="22">/**/*.java' | grep '/main/' || true)
|
|
if [ -z "$hits" ]; then echo " main 에서 0 건"; else echo "$hits" | strip; fi
|
|
echo</tspan><tspan x="24" dy="22"> " 참고 — 이 모듈 main 에서 operationId() 로 잡히는 둘은 별개 타입이다 :"
|
|
git grep -n '\.operationId()' -- 'src/adapte</tspan><tspan x="24" dy="22">r/inbound/graphql/**/*.java' | grep '/main/' | strip
|
|
|
|
echo
|
|
echo "# 미배선 정책이 이름을 검사하는 방식과 GraphQlOperation</tspan><tspan x="24" dy="22">Name.parse 의 계약"
|
|
awk 'NR>=54 && NR<=61 {printf " GraphQlOperationNamePolicy.java:%d %s\n", NR, $0}' \
|
|
$G/execution</tspan><tspan x="24" dy="22">/GraphQlOperationNamePolicy.java
|
|
awk 'NR>=37 && NR<=42 {printf " GraphQlOperationName.java:%d %s\n", NR, $0}' \
|
|
$G/ap</tspan><tspan x="24" dy="22">i/GraphQlOperationName.java
|
|
</tspan></text>
|
|
<text x="24" y="750" fill="#8b949e" font-size="13" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">cwd: /shared/codebase/clean-architecture-backend-template</tspan></text>
|
|
<text x="24" y="772" fill="#8b949e" font-size="13" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">time: 2026-09-03T09:18:12+00:00 · exit 0</tspan></text>
|
|
<line x1="24" y1="786" x2="1176" y2="786" stroke="#30363d"/>
|
|
<text x="24" y="826" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 이름 요구를 읽는 세 클래스의 줄 수</tspan></text>
|
|
<text x="24" y="848" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlOperationNamePolicy.java : 85 줄</tspan></text>
|
|
<text x="24" y="870" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlOperationSelectionHandler.java : 125 줄</tspan></text>
|
|
<text x="24" y="892" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlRequestEnvelopeValidator.java : 152 줄</tspan></text>
|
|
<text x="24" y="914" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="936" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># GraphQlOperationNamePolicy 를 자기 파일 밖에서 쓰는 자리</tspan></text>
|
|
<text x="24" y="958" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · GraphQlOperationNameInterceptor.java:17 private final GraphQlOperationNamePolicy policy;</tspan></text>
|
|
<text x="24" y="980" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · GraphQlOperationNameInterceptor.java:24 public GraphQlOperationNameInterceptor(GraphQlOperationNamePolicy policy) {</tspan></text>
|
|
<text x="24" y="1002" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · GraphQlOperationNamePolicyTest.java:14 class GraphQlOperationNamePolicyTest {</tspan></text>
|
|
<text x="24" y="1024" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · GraphQlOperationNamePolicyTest.java:18 var policy = GraphQlOperationNamePolicy.production();</tspan></text>
|
|
<text x="24" y="1046" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · GraphQlOperationNamePolicyTest.java:29 GraphQlOperationNamePolicy.local()</tspan></text>
|
|
<text x="24" y="1068" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · GraphQlOperationNamePolicyTest.java:40 GraphQlOperationNamePolicy.local()</tspan></text>
|
|
<text x="24" y="1090" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · GraphQlOperationNamePolicyTest.java:50 var policy = GraphQlOperationNamePolicy.production();</tspan></text>
|
|
<text x="24" y="1112" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · GraphQlOperationNamePolicyTest.java:68 var policy = GraphQlOperationNamePolicy.production();</tspan></text>
|
|
<text x="24" y="1134" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · GraphQlOperationNamePolicyTest.java:78 var policy = GraphQlOperationNamePolicy.production();</tspan></text>
|
|
<text x="24" y="1156" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · GraphQlOperationNamePolicyTest.java:94 var interceptor = new GraphQlOperationNameInterceptor(GraphQlOperationNameP</tspan><tspan x="24" dy="22">olicy.production());</tspan></text>
|
|
<text x="24" y="1200" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="1222" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># GraphQlOperationNameInterceptor 를 자기 파일 밖에서 쓰는 자리</tspan></text>
|
|
<text x="24" y="1244" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · GraphQlOperationNamePolicyTest.java:94 var interceptor = new GraphQlOperationNameInterceptor(GraphQlOperationNameP</tspan><tspan x="24" dy="22">olicy.production());</tspan></text>
|
|
<text x="24" y="1288" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="1310" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># GraphQlRequestEnvelopeValidator 를 실제로 만드는 자리 전부</tspan></text>
|
|
<text x="24" y="1332" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · GraphQlRequestBoundsTest.java:38</tspan></text>
|
|
<text x="24" y="1354" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · GraphQlRequestBoundsTest.java:50</tspan></text>
|
|
<text x="24" y="1376" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · GraphQlRequestEnvelopeValidatorTest.java:19</tspan></text>
|
|
<text x="24" y="1398" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · GraphQlRequestEnvelopeValidatorTest.java:30</tspan></text>
|
|
<text x="24" y="1420" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · GraphQlRequestEnvelopeValidatorTest.java:41</tspan></text>
|
|
<text x="24" y="1442" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · GraphQlRequestEnvelopeValidatorTest.java:77</tspan></text>
|
|
<text x="24" y="1464" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · GraphQlRequestEnvelopeValidatorTest.java:92</tspan></text>
|
|
<text x="24" y="1486" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · GraphQlRequestEnvelopeValidatorTest.java:101</tspan></text>
|
|
<text x="24" y="1508" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> testFixtures · GraphQlContractFixture.java:84</tspan></text>
|
|
<text x="24" y="1530" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="1552" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># namedOperationRequired 를 읽는 프로덕션 코드</tspan></text>
|
|
<text x="24" y="1574" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · GraphQlRequestEnvelopeValidator.java:63 policy.namedOperationRequired(),</tspan></text>
|
|
<text x="24" y="1596" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · GraphQlRequestEnvelopeValidator.java:134 if (namedOperationRequired && GraphQlOperationName.parse(envelope.operati</tspan><tspan x="24" dy="22">onName()).isEmpty()) {</tspan></text>
|
|
<text x="24" y="1640" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · GraphQlOperationSelectionHandler.java:74 if (policy.namedOperationRequired() && selected.getName() == null) {</tspan></text>
|
|
<text x="24" y="1662" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="1684" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># GraphQlClientPolicy 인스턴스를 만드는 프로덕션 코드 전부</tspan></text>
|
|
<text x="24" y="1706" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · GraphQlPlatformAutoConfiguration.java:303 return GraphQlClientPolicy.defaults(</tspan></text>
|
|
<text x="24" y="1728" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · GraphQlClientPolicy.java:85 public static GraphQlClientPolicy defaults(</tspan></text>
|
|
<text x="24" y="1750" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · GraphQlClientPolicy.java:87 return new GraphQlClientPolicy(</tspan></text>
|
|
<text x="24" y="1772" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 그 빈을 내놓는 자리 :</tspan></text>
|
|
<text x="24" y="1794" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlPlatformAutoConfiguration.java:300 @Bean</tspan></text>
|
|
<text x="24" y="1816" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlPlatformAutoConfiguration.java:301 @ConditionalOnMissingBean</tspan></text>
|
|
<text x="24" y="1838" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlPlatformAutoConfiguration.java:302 public GraphQlClientPolicy graphQlClientPolicy(GraphQlPlatformSettings properties)</tspan><tspan x="24" dy="22"> {</tspan></text>
|
|
<text x="24" y="1882" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlPlatformAutoConfiguration.java:303 return GraphQlClientPolicy.defaults(</tspan></text>
|
|
<text x="24" y="1904" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlPlatformAutoConfiguration.java:304 properties.limits().maximumPageSize(),</tspan></text>
|
|
<text x="24" y="1926" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlPlatformAutoConfiguration.java:305 properties.limits().maximumComplexity(),</tspan></text>
|
|
<text x="24" y="1948" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlPlatformAutoConfiguration.java:306 properties.console().introspectionEnabled());</tspan></text>
|
|
<text x="24" y="1970" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlPlatformAutoConfiguration.java:307 }</tspan></text>
|
|
<text x="24" y="1992" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlPlatformAutoConfiguration.java:308 </tspan></text>
|
|
<text x="24" y="2014" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> defaults 가 마지막 세 성분에 넣는 값과 그 성분의 이름 :</tspan></text>
|
|
<text x="24" y="2036" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 값 GraphQlClientPolicy.java:101 introspectionAllowed,</tspan></text>
|
|
<text x="24" y="2058" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 값 GraphQlClientPolicy.java:102 false,</tspan></text>
|
|
<text x="24" y="2080" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 값 GraphQlClientPolicy.java:103 false);</tspan></text>
|
|
<text x="24" y="2102" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 이름 GraphQlClientPolicy.java:49 boolean introspectionAllowed,</tspan></text>
|
|
<text x="24" y="2124" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 이름 GraphQlClientPolicy.java:50 boolean persistedOperationOnly,</tspan></text>
|
|
<text x="24" y="2146" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 이름 GraphQlClientPolicy.java:51 boolean namedOperationRequired) {</tspan></text>
|
|
<text x="24" y="2168" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="2190" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 배선된 핸들러가 요청 경로에 오르는 사슬</tspan></text>
|
|
<text x="24" y="2212" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · GraphQlPlatformAutoConfiguration.java:403 return GraphQlExecutionChain.stable(</tspan></text>
|
|
<text x="24" y="2234" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · GraphQlPlatformAutoConfiguration.java:404 new GraphQlOperationSelectionHandler(clientPolicy),</tspan></text>
|
|
<text x="24" y="2256" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · GraphQlPlatformAutoConfiguration.java:420 return new GraphQlPlatformInstrumentation(chain);</tspan></text>
|
|
<text x="24" y="2278" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · GraphQlExecutionChain.java:43 public static GraphQlExecutionChain stable(</tspan></text>
|
|
<text x="24" y="2300" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlPlatformInstrumentation.java:81 chain.run(</tspan></text>
|
|
<text x="24" y="2322" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 그 사슬이 붙는 어댑터 자체의 조건 :</tspan></text>
|
|
<text x="24" y="2344" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlRootAutoConfiguration.java:4 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;</tspan></text>
|
|
<text x="24" y="2366" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlRootAutoConfiguration.java:21 @ConditionalOnProperty(prefix = "backend.graphql", name = "enabled", havingValue = "true"</tspan><tspan x="24" dy="22">)</tspan></text>
|
|
<text x="24" y="2410" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="2432" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># GraphQlRequestContext.operationId 를 읽는 프로덕션 코드</tspan></text>
|
|
<text x="24" y="2454" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main 에서 0 건</tspan></text>
|
|
<text x="24" y="2476" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 참고 — 이 모듈 main 에서 operationId() 로 잡히는 둘은 별개 타입이다 :</tspan></text>
|
|
<text x="24" y="2498" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · GraphQlPersistedOperationAdminService.java:68 command.operationId(),</tspan></text>
|
|
<text x="24" y="2520" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · GraphQlPersistedOperationInterceptor.java:50 GraphQlPersistedOperation operation = lookup.require(request.operatio</tspan><tspan x="24" dy="22">nId());</tspan></text>
|
|
<text x="24" y="2564" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="2586" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 미배선 정책이 이름을 검사하는 방식과 GraphQlOperationName.parse 의 계약</tspan></text>
|
|
<text x="24" y="2608" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlOperationNamePolicy.java:54 if (namedRequired && !selection.named()) {</tspan></text>
|
|
<text x="24" y="2630" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlOperationNamePolicy.java:55 throw new GraphQlAnonymousOperationException("named operation required");</tspan></text>
|
|
<text x="24" y="2652" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlOperationNamePolicy.java:56 }</tspan></text>
|
|
<text x="24" y="2674" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlOperationNamePolicy.java:57 if (selection.named() && GraphQlOperationName.parse(selection.operationName()).isEmpty(</tspan><tspan x="24" dy="22">)) {</tspan></text>
|
|
<text x="24" y="2718" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlOperationNamePolicy.java:58 // Validates the bounded naming pattern; an unbounded name would defeat the reason fo</tspan><tspan x="24" dy="22">r</tspan></text>
|
|
<text x="24" y="2762" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlOperationNamePolicy.java:59 // requiring one at all.</tspan></text>
|
|
<text x="24" y="2784" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlOperationNamePolicy.java:60 throw new GraphQlAnonymousOperationException("named operation required");</tspan></text>
|
|
<text x="24" y="2806" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlOperationNamePolicy.java:61 }</tspan></text>
|
|
<text x="24" y="2828" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlOperationName.java:37 public static Optional<GraphQlOperationName> parse(String candidate) {</tspan></text>
|
|
<text x="24" y="2850" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlOperationName.java:38 if (candidate == null || candidate.isBlank()) {</tspan></text>
|
|
<text x="24" y="2872" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlOperationName.java:39 return Optional.empty();</tspan></text>
|
|
<text x="24" y="2894" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlOperationName.java:40 }</tspan></text>
|
|
<text x="24" y="2916" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlOperationName.java:41 return Optional.of(new GraphQlOperationName(candidate));</tspan></text>
|
|
<text x="24" y="2938" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlOperationName.java:42 }</tspan></text>
|
|
</svg>
|