Files
document-haness/docs/clean-architecture-backend-template/final/evidence/rendered/a-validator-checking-the-wrong-datasource.svg
T
DongHyeonkaandClaude Opus 5 b2963105a8 docs(keycloak-session-store): import the session-storage lab as a new project
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>
2026-09-04 22:51:59 +09:00

260 lines
53 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="5540" viewBox="0 0 1200 5540" 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="5538" 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
J=src/app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/jpa
P=src/app-bootstra</tspan><tspan x="24" dy="22">p/src/main/java/dev/caskeleton/bootstrap/autoconfigure/persistencejpa
R=src/app-bootstrap/src/main/java/dev/caskeleton/b</tspan><tspan x="24" dy="22">ootstrap/runtime
T=src/app-bootstrap/src/test/java/dev/caskeleton/bootstrap/autoconfigure/jpa
strip() { sed -E &#x27;s#^src/[</tspan><tspan x="24" dy="22">^:]*/src/(main|test)/[^:]*/([^:/]+):([0-9]+):# \1 · \2:\3 #&#x27;; }
cut_range() { awk -v f=&quot;$2&quot; -v a=&quot;$3&quot; -v b=&quot;$4&quot; &#x27;NR&gt;=a</tspan><tspan x="24" dy="22"> &amp;&amp; NR&lt;=b {printf &quot; %s:%d %s\n&quot;, f, NR, $0}&#x27; &quot;$1&quot;; }
echo &quot;# 검증기 자바독이 적은 두 결함과 그 상쇄&quot;
cut_range $J/JpaD</tspan><tspan x="24" dy="22">ataSourceProfileValidator.java JpaDataSourceProfileValidator.java 11 19
echo
echo &quot;# 그 병렬 네임스페이스가 src 안에 남</tspan><tspan x="24" dy="22">아 있는 자리&quot;
git grep -n &#x27;app.jpa-platform.datasource&#x27; -- &#x27;src/**&#x27; | strip
echo &quot; src 밖에서 이 문자열을 쓰는 파일과 </tspan><tspan x="24" dy="22">줄 수 :&quot;
git grep -c &#x27;app.jpa-platform.datasource&#x27; | grep -v &#x27;^src/&#x27; | sed &#x27;s#^# #&#x27;
echo &quot; 그중 운영자용 표에 살아 </tspan><tspan x="24" dy="22">있는 줄 :&quot;
grep -n &#x27;app.jpa-platform.datasource&#x27; infra/jpa/postgres/README.md | cut -c1-150 | sed &#x27;s#^# infra/jpa/pos</tspan><tspan x="24" dy="22">tgres/README.md:#&#x27;
n=$(git grep -l &#x27;app.jpa-platform.datasource&#x27; -- &#x27;src/**/*.yml&#x27; &#x27;src/**/*.yaml&#x27; &#x27;src/**/*.properties&#x27;</tspan><tspan x="24" dy="22"> 2&gt;/dev/null | wc -l || true)
echo &quot; 설정 파일(yml·yaml·properties)에서 : $n 건&quot;
cm=$(git grep -n &#x27;app.jpa-platform.d</tspan><tspan x="24" dy="22">atasource&#x27; -- &#x27;src/**/*.java&#x27; | grep &#x27;/main/&#x27; | grep -cv &#x27;\* \|//&#x27; || true)
ct=$(git grep -n &#x27;app.jpa-platform.datasourc</tspan><tspan x="24" dy="22">e&#x27; -- &#x27;src/**/*.java&#x27; | grep &#x27;/test/&#x27; | grep -cv &#x27;\* \|//&#x27; || true)
echo &quot; 그중 주석이 아닌 줄 : main $cm 건 · test $c</tspan><tspan x="24" dy="22">t 건 (test 쪽은 회귀 테스트의 검색 문자열)&quot;
f=$(find src -name &#x27;JpaDataSourceSettings.java&#x27; -not -path &#x27;*/build/*&#x27; | wc </tspan><tspan x="24" dy="22">-l || true)
echo &quot; 그것을 바인딩하던 JpaDataSourceSettings 클래스 : $f 건&quot;
echo
echo &quot;# 옛 상한 검사 메서드 이름이 남</tspan><tspan x="24" dy="22">아 있는 자리&quot;
git grep -n &#x27;requirePoolBounds&#x27; -- &#x27;src/**/*.java&#x27; | strip
echo
echo &quot;# 지금 검증기가 읽는 것과 던지는 것</tspan><tspan x="24" dy="22">&quot;
cut_range $J/JpaDataSourceProfileValidator.java JpaDataSourceProfileValidator.java 50 66
echo
echo &quot;# validateResolve</tspan><tspan x="24" dy="22">d 를 부르는 자리 전부&quot;
git grep -n &#x27;validateResolved&#x27; -- &#x27;src/**/*.java&#x27; | grep -v &#x27;/JpaDataSourceProfileValidator.java:</tspan><tspan x="24" dy="22">&#x27; | strip
echo
echo &quot;# 그 호출자가 붙는 조건과 출하 기본값&quot;
awk &#x27;NR&gt;=56 &amp;&amp; NR&lt;=61 {printf &quot; PersistenceJpaRootAutoConf</tspan><tspan x="24" dy="22">iguration.java:%d %s\n&quot;, NR, $0}&#x27; $P/PersistenceJpaRootAutoConfiguration.java
grep -n &#x27;APP_PERSISTENCE_JPA_ENABLED&#x27; src/</tspan><tspan x="24" dy="22">app-bootstrap/src/main/resources/application.yml | head -1 | sed &#x27;s#^# application.yml:#&#x27;
echo
echo &quot;# 직접 생성의 이</tspan><tspan x="24" dy="22">유로 적힌 조건과, 그 조건의 현재 상태&quot;
awk &#x27;NR&gt;=95 &amp;&amp; NR&lt;=99 {printf &quot; PersistenceJpaRootAutoConfiguration.java:%d %s\n</tspan><tspan x="24" dy="22">&quot;, NR, $0}&#x27; $P/PersistenceJpaRootAutoConfiguration.java
awk &#x27;NR&gt;=57 &amp;&amp; NR&lt;=64 {printf &quot; JpaPlatformRuntimeAutoConfigura</tspan><tspan x="24" dy="22">tion.java:%d %s\n&quot;, NR, $0}&#x27; $J/JpaPlatformRuntimeAutoConfiguration.java
echo
echo &quot;# 그 호출자가 검증기를 어디서 얻는</tspan><tspan x="24" dy="22">&quot;
cut_range $P/PersistenceJpaRootAutoConfiguration.java PersistenceJpaRootAutoConfiguration.java 106 114
echo
echo &quot;#</tspan><tspan x="24" dy="22"> 이 타입을 빈으로 정의하는 자리와, 그 빈을 주입받는 코드&quot;
b=$(grep -c &#x27;@Bean&#x27; $J/JpaPlatformAutoConfiguration.java || tr</tspan><tspan x="24" dy="22">ue)
echo &quot; JpaPlatformAutoConfiguration 의 @Bean 개수 : $b&quot;
awk &#x27;NR==19 || NR==20 {printf &quot; JpaPlatformAutoConfigurat</tspan><tspan x="24" dy="22">ion.java:%d %s\n&quot;, NR, $0}&#x27; $J/JpaPlatformAutoConfiguration.java
cut_range $J/JpaPlatformAutoConfiguration.java JpaPlatf</tspan><tspan x="24" dy="22">ormAutoConfiguration.java 48 50
cut_range $J/JpaPlatformRuntimeAutoConfiguration.java JpaPlatformRuntimeAutoConfiguratio</tspan><tspan x="24" dy="22">n.java 111 117
hits=$(git grep -n &#x27;JpaDataSourceProfileValidator &#x27; -- &#x27;src/**/*.java&#x27; \
| grep &#x27;/main/&#x27; \
| grep -v </tspan><tspan x="24" dy="22">&#x27;public JpaDataSourceProfileValidator\|new JpaDataSourceProfileValidator\|final class&#x27; \
| grep -v &#x27;JpaDataSourceProfi</tspan><tspan x="24" dy="22">leValidator validator =&#x27; || true)
if [ -z &quot;$hits&quot; ]; then echo &quot; 파라미터나 필드로 받는 프로덕션 코드 : 0 건&quot;; else ech</tspan><tspan x="24" dy="22">o &quot;$hits&quot; | strip; fi
echo
echo &quot;# HikariPoolConstraintValidator 가 읽는 키와 그 빈, 그리고 풀 크기를 보는 다른 검증기&quot;</tspan><tspan x="24" dy="22">
grep -n &#x27;static final String .*_KEY = &quot;spring.datasource.hikari&#x27; $R/HikariPoolConstraintValidator.java \
| sed -E &#x27;s#</tspan><tspan x="24" dy="22">^([0-9]+): *# HikariPoolConstraintValidator.java:\1 #&#x27;
cut_range $R/RuntimeSafetyConfig.java RuntimeSafetyConfig.java </tspan><tspan x="24" dy="22">49 51
echo &quot; maximum-pool-size 와 minimum-idle 을 실제로 검사하는 곳 :&quot;
git grep -n &#x27;spring.datasource.hikari.maximum-p</tspan><tspan x="24" dy="22">ool-size\|spring.datasource.hikari.minimum-idle&#x27; -- &#x27;src/**/*.java&#x27; | grep &#x27;/main/&#x27; | strip
echo &quot; app-bootstrap 이 Hik</tspan><tspan x="24" dy="22">ariCP 를 선언하는 구성 :&quot;
grep -n &#x27;com.zaxxer:HikariCP&#x27; src/app-bootstrap/build.gradle | sed &#x27;s#^# build.gradle:#&#x27;
ec</tspan><tspan x="24" dy="22">ho &quot; 그런데 runtimeClasspath 를 풀어 보면 :&quot;
(cd src &amp;&amp; ./gradlew :app-bootstrap:dependencies --configuration runtimeCl</tspan><tspan x="24" dy="22">asspath --offline -q 2&gt;/dev/null | grep -i &#x27;HikariCP&#x27; | head -2 | sed &#x27;s#^# #&#x27;)
echo
echo &quot;# 그 부재를 고정하는 회귀</tspan><tspan x="24" dy="22"> 테스트&quot;
git grep -n &#x27;@DisplayName\|void the\|void an&#x27; -- &#x27;src/**/JpaResolvedDataSourceValidationTest.java&#x27; | strip
echo</tspan><tspan x="24" dy="22"> &quot; 그 테스트가 훑는 범위 :&quot;
awk &#x27;NR&gt;=115 &amp;&amp; NR&lt;=119 {printf &quot; JpaResolvedDataSourceValidationTest.java:%d %s\n&quot;, NR, $</tspan><tspan x="24" dy="22">0}&#x27; $T/JpaResolvedDataSourceValidationTest.java
echo &quot; 공허한 통과를 막는 단언과 주석 제거 :&quot;
cut_range $T/JpaResolvedD</tspan><tspan x="24" dy="22">ataSourceValidationTest.java JpaResolvedDataSourceValidationTest.java 47 60
</tspan></text>
<text x="24" y="1036" 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="1058" 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-03T12:44:22+00:00 · exit 0</tspan></text>
<line x1="24" y1="1072" x2="1176" y2="1072" stroke="#30363d"/>
<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"># 검증기 자바독이 적은 두 결함과 그 상쇄</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"> JpaDataSourceProfileValidator.java:11 * &lt;p&gt;It used to validate a different one. The bounds came from {@code JpaDataSourceSett</tspan><tspan x="24" dy="22">ings}, bound</tspan></text>
<text x="24" y="1178" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaDataSourceProfileValidator.java:12 * to {@code app.jpa-platform.datasource.*}, while the pool that serves requests is buil</tspan><tspan x="24" dy="22">t from</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"> JpaDataSourceProfileValidator.java:13 * {@code spring.datasource.hikari.*} — one pool with two descriptions, and a validator</tspan><tspan x="24" dy="22"> can pass</tspan></text>
<text x="24" y="1266" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaDataSourceProfileValidator.java:14 * against the description that is not in use.</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"> JpaDataSourceProfileValidator.java:15 *</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"> JpaDataSourceProfileValidator.java:16 * &lt;p&gt;Worse, the parallel namespace appeared in no shipped YAML and no row of the env-ke</tspan><tspan x="24" dy="22">y registry,</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"> JpaDataSourceProfileValidator.java:17 * so both of its fields were always null and {@code requirePoolBounds} would have throw</tspan><tspan x="24" dy="22">n on every</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"> JpaDataSourceProfileValidator.java:18 * deployment. Nothing called it, so nothing failed. Two defects that cancelled each oth</tspan><tspan x="24" dy="22">er out, and</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"> JpaDataSourceProfileValidator.java:19 * the reason the application started was the second one hiding the first.</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"></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"># 그 병렬 네임스페이스가 src 안에 남아 있는 자리</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"> main · NotificationSmtpProviderConfig.java:48 * app.jpa-platform.datasource.*} validated a pool that {@code spring.datasourc</tspan><tspan x="24" dy="22">e.hikari.*} had</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"> main · NotificationSmtpSettings.java:14 * paid for — {@code app.jpa-platform.datasource.*} validated a pool that {@code</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 · SmtpProviderRuntimeAssembler.java:40 * already paid for elsewhere — {@code app.jpa-platform.datasource.*} validated </tspan><tspan x="24" dy="22">a pool that {@code</tspan></text>
<text x="24" y="1618" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · JpaDataSourceProfileValidator.java:12 * to {@code app.jpa-platform.datasource.*}, while the pool that serves requests</tspan><tspan x="24" dy="22"> is built from</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"> test · JpaResolvedDataSourceValidationTest.java:22 * &lt;p&gt;{@code JpaDataSourceSettings} bound {@code app.jpa-platform.datasour</tspan><tspan x="24" dy="22">ce.*} while the pool that</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"> test · JpaResolvedDataSourceValidationTest.java:57 .filter(path -&gt; withoutJavaComments(read(path)).contains(&quot;app.</tspan><tspan x="24" dy="22">jpa-platform.datasource&quot;))</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 · KafkaMessagingAutoConfiguration.java:119 * repository has already paid for in {@code app.jpa-platform.datasource.*}</tspan><tspan x="24" dy="22">, and the</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"> src 밖에서 이 문자열을 쓰는 파일과 줄 수 :</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"> docs/study/postgresql-jpa-walkthrough.ko.md:1</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"> docs/superpowers/plans/2026-08-15-wave2-module-on-path.md:4</tspan></text>
<text x="24" y="1860" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> docs/superpowers/plans/evidence/2026-08-15-wave2-decisions.md:3</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"> docs/superpowers/specs/2026-08-15-five-adapter-runtime-remediation-review-design.md:1</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"> infra/jpa/postgres/README.md:1</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"> 그중 운영자용 표에 살아 있는 줄 :</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"> infra/jpa/postgres/README.md:18:| `max_connections` | The number `app.jpa-platform.datasource.maximum-pool-size` must be siz</tspan><tspan x="24" dy="22">ed against — across every instance, and allowing for </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"> 설정 파일(yml·yaml·properties)에서 : 0 건</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"> 그중 주석이 아닌 줄 : main 0 건 · test 1 건 (test 쪽은 회귀 테스트의 검색 문자열)</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"> 그것을 바인딩하던 JpaDataSourceSettings 클래스 : 0 건</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"></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"># 옛 상한 검사 메서드 이름이 남아 있는 자리</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"> main · JpaDataSourceProfileValidator.java:17 * so both of its fields were always null and {@code requirePoolBounds} would ha</tspan><tspan x="24" dy="22">ve thrown on every</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"> test · JpaResolvedDataSourceValidationTest.java:26 * of its fields were always null — and {@code requirePoolBounds} throws </tspan><tspan x="24" dy="22">on a null. Had anything</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"> test · JpaResolvedDataSourceValidationTest.java:29 * &lt;p&gt;Nothing did. {@code validateStable} and {@code requirePoolBounds} we</tspan><tspan x="24" dy="22">re reachable only from</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"></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"># 지금 검증기가 읽는 것과 던지는 것</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"> JpaDataSourceProfileValidator.java:50 public void validateResolved(DataSource dataSource, boolean requirePostgreSql) {</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"> JpaDataSourceProfileValidator.java:51 Objects.requireNonNull(dataSource, &quot;dataSource&quot;);</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"> JpaDataSourceProfileValidator.java:52 if (!requirePostgreSql) {</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"> JpaDataSourceProfileValidator.java:53 // Local development runs H2 by design, and PersistenceVendorProdSafetyValidator i</tspan><tspan x="24" dy="22">s what keeps</tspan></text>
<text x="24" y="2388" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaDataSourceProfileValidator.java:54 // that out of production. Demanding PostgreSQL here as well would refuse every la</tspan><tspan x="24" dy="22">ptop.</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"> JpaDataSourceProfileValidator.java:55 return;</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"> JpaDataSourceProfileValidator.java:56 }</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"> JpaDataSourceProfileValidator.java:57 try (Connection connection = dataSource.getConnection()) {</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"> JpaDataSourceProfileValidator.java:58 versionPolicy.requireStable(connection.getMetaData());</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"> JpaDataSourceProfileValidator.java:59 } catch (SQLException unreachable) {</tspan></text>
<text x="24" y="2542" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaDataSourceProfileValidator.java:60 throw new IllegalStateException(</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"> JpaDataSourceProfileValidator.java:61 &quot;could not open a connection to validate the datasource: &quot;</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"> JpaDataSourceProfileValidator.java:62 + unreachable.getMessage()</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"> JpaDataSourceProfileValidator.java:63 + &quot;. A context that starts without this check reports healthy and fails on</tspan><tspan x="24" dy="22"> whoever &quot;</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"> JpaDataSourceProfileValidator.java:64 + &quot;sends the first request.&quot;,</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"> JpaDataSourceProfileValidator.java:65 unreachable);</tspan></text>
<text x="24" y="2696" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaDataSourceProfileValidator.java:66 }</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"></tspan></text>
<text x="24" y="2740" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># validateResolved 를 부르는 자리 전부</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"> main · PersistenceJpaRootAutoConfiguration.java:113 return () -&gt; validator.validateResolved(dataSource, &quot;postgresql&quot;.equa</tspan><tspan x="24" dy="22">lsIgnoreCase(vendor));</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"> test · JpaResolvedDataSourceValidationTest.java:82 .validateResolved(pool, true))</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"> test · JpaResolvedDataSourceValidationTest.java:101 assertThatCode(() -&gt; validator.validateResolved(h2, false))</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"> test · JpaResolvedDataSourceValidationTest.java:104 assertThatThrownBy(() -&gt; validator.validateResolved(h2, true))</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"></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"># 그 호출자가 붙는 조건과 출하 기본값</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"> PersistenceJpaRootAutoConfiguration.java:56 @AutoConfiguration</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"> PersistenceJpaRootAutoConfiguration.java:57 @ConditionalOnProperty(</tspan></text>
<text x="24" y="2960" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PersistenceJpaRootAutoConfiguration.java:58 prefix = &quot;ca-skeleton.persistence-jpa&quot;,</tspan></text>
<text x="24" y="2982" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PersistenceJpaRootAutoConfiguration.java:59 name = &quot;enabled&quot;,</tspan></text>
<text x="24" y="3004" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PersistenceJpaRootAutoConfiguration.java:60 havingValue = &quot;true&quot;)</tspan></text>
<text x="24" y="3026" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PersistenceJpaRootAutoConfiguration.java:61 @Import({</tspan></text>
<text x="24" y="3048" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> application.yml:364: enabled: ${APP_PERSISTENCE_JPA_ENABLED:false}</tspan></text>
<text x="24" y="3070" 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="3092" 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="3114" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PersistenceJpaRootAutoConfiguration.java:95 * {@code @ConditionalOnBean(DataSource.class)} on a plain {@code @Configuration</tspan><tspan x="24" dy="22">} imported by this</tspan></text>
<text x="24" y="3158" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PersistenceJpaRootAutoConfiguration.java:96 * root — a condition evaluated during configuration-class parsing, before the </tspan><tspan x="24" dy="22">datasource bean</tspan></text>
<text x="24" y="3202" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PersistenceJpaRootAutoConfiguration.java:97 * definition is registered. That class therefore drops out silently in the real</tspan><tspan x="24" dy="22"> application,</tspan></text>
<text x="24" y="3246" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PersistenceJpaRootAutoConfiguration.java:98 * taking the whole JPA add-on layer with it. Depending on a bean from it would </tspan><tspan x="24" dy="22">make this check</tspan></text>
<text x="24" y="3290" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PersistenceJpaRootAutoConfiguration.java:99 * disappear for the same reason the thing it checks disappeared. The condition-</tspan><tspan x="24" dy="22">ordering defect is</tspan></text>
<text x="24" y="3334" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformRuntimeAutoConfiguration.java:57 * root, which already carries the master switch, so &quot;is there a datasource&quot; has b</tspan><tspan x="24" dy="22">een answered yes</tspan></text>
<text x="24" y="3378" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformRuntimeAutoConfiguration.java:58 * by the time it is parsed. A bean here that needs one takes it as a parameter, a</tspan><tspan x="24" dy="22">nd a missing</tspan></text>
<text x="24" y="3422" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformRuntimeAutoConfiguration.java:59 * datasource with the switch on is then a loud failure — which is the outcome th</tspan><tspan x="24" dy="22">at was wanted,</tspan></text>
<text x="24" y="3466" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformRuntimeAutoConfiguration.java:60 * rather than the layer vanishing.</tspan></text>
<text x="24" y="3488" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformRuntimeAutoConfiguration.java:61 */</tspan></text>
<text x="24" y="3510" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformRuntimeAutoConfiguration.java:62 @org.springframework.context.annotation.Configuration(proxyBeanMethods = false)</tspan></text>
<text x="24" y="3532" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformRuntimeAutoConfiguration.java:63 @ConditionalOnClass(DataSource.class)</tspan></text>
<text x="24" y="3554" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformRuntimeAutoConfiguration.java:64 @ConditionalOnProperty(prefix = &quot;app.jpa-platform&quot;, name = &quot;addons-enabled&quot;, match</tspan><tspan x="24" dy="22">IfMissing = true)</tspan></text>
<text x="24" y="3598" 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="3620" 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="3642" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PersistenceJpaRootAutoConfiguration.java:106 @Bean</tspan></text>
<text x="24" y="3664" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PersistenceJpaRootAutoConfiguration.java:107 public InitializingBean jpaResolvedDataSourceCheck(</tspan></text>
<text x="24" y="3686" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PersistenceJpaRootAutoConfiguration.java:108 DataSource dataSource, Environment environment) {</tspan></text>
<text x="24" y="3708" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PersistenceJpaRootAutoConfiguration.java:109 JpaDataSourceProfileValidator validator =</tspan></text>
<text x="24" y="3730" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PersistenceJpaRootAutoConfiguration.java:110 new JpaDataSourceProfileValidator(new PostgreSqlVersionPolicy());</tspan></text>
<text x="24" y="3752" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PersistenceJpaRootAutoConfiguration.java:111 String vendor =</tspan></text>
<text x="24" y="3774" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PersistenceJpaRootAutoConfiguration.java:112 environment.getProperty(PersistenceVendorSettings.VENDOR_PROPERTY, &quot;postg</tspan><tspan x="24" dy="22">resql&quot;).trim();</tspan></text>
<text x="24" y="3818" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PersistenceJpaRootAutoConfiguration.java:113 return () -&gt; validator.validateResolved(dataSource, &quot;postgresql&quot;.equalsIgnore</tspan><tspan x="24" dy="22">Case(vendor));</tspan></text>
<text x="24" y="3862" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> PersistenceJpaRootAutoConfiguration.java:114 }</tspan></text>
<text x="24" y="3884" 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="3906" 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="3928" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformAutoConfiguration 의 @Bean 개수 : 0</tspan></text>
<text x="24" y="3950" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformAutoConfiguration.java:19 * &lt;p&gt;Plain construction rather than Spring auto-configuration. This repository&#x27;s rule is</tspan><tspan x="24" dy="22"> that</tspan></text>
<text x="24" y="3994" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformAutoConfiguration.java:20 * {@code app-bootstrap} owns composition, and an adapter leaf that auto-configured itsel</tspan><tspan x="24" dy="22">f would</tspan></text>
<text x="24" y="4038" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformAutoConfiguration.java:48 /** The datasource product, version, and pool validator. */</tspan></text>
<text x="24" y="4060" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformAutoConfiguration.java:49 public JpaDataSourceProfileValidator dataSourceProfileValidator() {</tspan></text>
<text x="24" y="4082" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformAutoConfiguration.java:50 return new JpaDataSourceProfileValidator(new PostgreSqlVersionPolicy());</tspan></text>
<text x="24" y="4104" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformRuntimeAutoConfiguration.java:111 /** The datasource product, version and pool validator. */</tspan></text>
<text x="24" y="4126" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformRuntimeAutoConfiguration.java:112 @Bean</tspan></text>
<text x="24" y="4148" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformRuntimeAutoConfiguration.java:113 @ConditionalOnMissingBean</tspan></text>
<text x="24" y="4170" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformRuntimeAutoConfiguration.java:114 public JpaDataSourceProfileValidator jpaDataSourceProfileValidator(</tspan></text>
<text x="24" y="4192" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformRuntimeAutoConfiguration.java:115 JpaPlatformAutoConfiguration composition) {</tspan></text>
<text x="24" y="4214" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformRuntimeAutoConfiguration.java:116 return composition.dataSourceProfileValidator();</tspan></text>
<text x="24" y="4236" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaPlatformRuntimeAutoConfiguration.java:117 }</tspan></text>
<text x="24" y="4258" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 파라미터나 필드로 받는 프로덕션 코드 : 0 건</tspan></text>
<text x="24" y="4280" 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="4302" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># HikariPoolConstraintValidator 가 읽는 키와 그 빈, 그리고 풀 크기를 보는 다른 검증기</tspan></text>
<text x="24" y="4324" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> HikariPoolConstraintValidator.java:18 static final String CONNECTION_TIMEOUT_KEY = &quot;spring.datasource.hikari.connection-timeo</tspan><tspan x="24" dy="22">ut&quot;;</tspan></text>
<text x="24" y="4368" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> HikariPoolConstraintValidator.java:19 static final String VALIDATION_TIMEOUT_KEY = &quot;spring.datasource.hikari.validation-timeo</tspan><tspan x="24" dy="22">ut&quot;;</tspan></text>
<text x="24" y="4412" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> HikariPoolConstraintValidator.java:20 static final String KEEPALIVE_TIME_KEY = &quot;spring.datasource.hikari.keepalive-time&quot;;</tspan></text>
<text x="24" y="4434" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> HikariPoolConstraintValidator.java:21 static final String MAX_LIFETIME_KEY = &quot;spring.datasource.hikari.max-lifetime&quot;;</tspan></text>
<text x="24" y="4456" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> HikariPoolConstraintValidator.java:22 static final String LEAK_DETECTION_KEY = &quot;spring.datasource.hikari.leak-detection-thres</tspan><tspan x="24" dy="22">hold&quot;;</tspan></text>
<text x="24" y="4500" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> RuntimeSafetyConfig.java:49 @Bean</tspan></text>
<text x="24" y="4522" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> RuntimeSafetyConfig.java:50 HikariPoolConstraintValidator hikariPoolConstraintValidator(Environment environment) {</tspan></text>
<text x="24" y="4544" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> RuntimeSafetyConfig.java:51 return new HikariPoolConstraintValidator(environment);</tspan></text>
<text x="24" y="4566" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> maximum-pool-size 와 minimum-idle 을 실제로 검사하는 곳 :</tspan></text>
<text x="24" y="4588" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · RuntimeNumericBoundsValidator.java:22 &quot;spring.datasource.hikari.maximum-pool-size&quot;, &quot;APP_DATASOURCE_POOL</tspan><tspan x="24" dy="22">_MAX_SIZE&quot;, 1),</tspan></text>
<text x="24" y="4632" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · RuntimeNumericBoundsValidator.java:26 new Bound(&quot;spring.datasource.hikari.minimum-idle&quot;, &quot;APP_DATASOURCE_POO</tspan><tspan x="24" dy="22">L_MIN_IDLE&quot;, 0),</tspan></text>
<text x="24" y="4676" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> app-bootstrap 이 HikariCP 를 선언하는 구성 :</tspan></text>
<text x="24" y="4698" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> build.gradle:140: testImplementation &#x27;com.zaxxer:HikariCP&#x27;</tspan></text>
<text x="24" y="4720" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 그런데 runtimeClasspath 를 풀어 보면 :</tspan></text>
<text x="24" y="4742" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> | | | \--- com.zaxxer:HikariCP:7.0.2</tspan></text>
<text x="24" y="4764" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> +--- com.zaxxer:HikariCP:{strictly 7.0.2} -&gt; 7.0.2 (c)</tspan></text>
<text x="24" y="4786" 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="4808" 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="4830" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · JpaResolvedDataSourceValidationTest.java:45 @DisplayName(&quot;no production code binds the parallel namespace&quot;)</tspan></text>
<text x="24" y="4852" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · JpaResolvedDataSourceValidationTest.java:46 void theParallelNamespaceIsGone() {</tspan></text>
<text x="24" y="4874" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · JpaResolvedDataSourceValidationTest.java:70 @DisplayName(&quot;an unreachable database fails at startup, not at the first</tspan><tspan x="24" dy="22"> query&quot;)</tspan></text>
<text x="24" y="4918" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · JpaResolvedDataSourceValidationTest.java:71 void anUnreachableDatabaseFailsAtStartup() {</tspan></text>
<text x="24" y="4940" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · JpaResolvedDataSourceValidationTest.java:91 @DisplayName(&quot;the product check applies only where PostgreSQL is the sel</tspan><tspan x="24" dy="22">ected vendor&quot;)</tspan></text>
<text x="24" y="4984" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · JpaResolvedDataSourceValidationTest.java:92 void theProductCheckFollowsTheVendorSelector() {</tspan></text>
<text x="24" y="5006" 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="5028" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:115 private static Stream&lt;Path&gt; productionSources() {</tspan></text>
<text x="24" y="5050" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:116 Path root = repositoryRoot().resolve(&quot;src&quot;);</tspan></text>
<text x="24" y="5072" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:117 return Stream.of(&quot;app-bootstrap&quot;, &quot;adapter/outbound/persistence-jpa&quot;)</tspan></text>
<text x="24" y="5094" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:118 .map(root::resolve)</tspan></text>
<text x="24" y="5116" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:119 .filter(Files::isDirectory)</tspan></text>
<text x="24" y="5138" 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="5160" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:47 List&lt;Path&gt; sources = productionSources().toList();</tspan></text>
<text x="24" y="5182" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:48 </tspan></text>
<text x="24" y="5204" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:49 assertThat(sources)</tspan></text>
<text x="24" y="5226" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:50 .as(&quot;a scan that reached no source would report every binding as absent&quot;)</tspan></text>
<text x="24" y="5248" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:51 .isNotEmpty();</tspan></text>
<text x="24" y="5270" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:52 </tspan></text>
<text x="24" y="5292" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:53 // Comments are stripped: a sentence recording that the namespace was retired </tspan><tspan x="24" dy="22">is the opposite of</tspan></text>
<text x="24" y="5336" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:54 // the defect, which was a binder reading a namespace nothing supplied.</tspan></text>
<text x="24" y="5358" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:55 List&lt;String&gt; offenders =</tspan></text>
<text x="24" y="5380" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:56 sources.stream()</tspan></text>
<text x="24" y="5402" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:57 .filter(path -&gt; withoutJavaComments(read(path)).contains(&quot;app.jpa-plat</tspan><tspan x="24" dy="22">form.datasource&quot;))</tspan></text>
<text x="24" y="5446" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:58 .map(path -&gt; path.getFileName().toString())</tspan></text>
<text x="24" y="5468" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:59 .sorted()</tspan></text>
<text x="24" y="5490" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> JpaResolvedDataSourceValidationTest.java:60 .toList();</tspan></text>
</svg>