Files
document-haness/docs/clean-architecture-backend-template/final/evidence/raw/a06-f020-tls-stable.txt
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

70 lines
4.2 KiB
Plaintext

# 팩토리의 javadoc 이 자기가 무엇을 고치려고 만들어졌는지 적는다
* The one place the typed profile becomes the settings the driver is built from (MNG-INT-002).
*
* <p>The profile, the credential resolver, the TLS and Stable-API flags and the pool and timeout
* policy all existed and were all unit-tested. None of them reached a {@link MongoClientSettings}:
* the values were checked as intermediate objects and whatever the driver ended up configured with
* was decided elsewhere, by defaults nobody had chosen. A policy that nothing applies reads exactly
* like a policy that is applied — the tests pass, the record is populated, and the client connects
* with a three-second timeout it inherited from the driver rather than the two the profile states.
# 저장소 전체에서 그 타입과 자격증명 해석기를 언급하는 곳
./docs/reviews/2026-08-14-mongodb-module-code-review.md:688:1. `MongoCredentialResolver` port는 secret reference만 받고 value는 client factory의 최소 scope에서만
./docs/superpowers/plans/evidence/2026-08-15-wave6-final/task6-p0-reconciliation.md:144:nowhere. It is mapped — `MongoClientSettingsFactory` calls `.uuidRepresentation(...)`. Verified
./docs/architecture/mongo-api-surface.txt:172:dev.caskeleton.adapter.outbound.mongo.client.MongoClientSettingsFactory
./docs/architecture/mongo-api-surface.txt:322:dev.caskeleton.adapter.outbound.mongo.security.MongoCredentialResolver
CLAUDE.md:106:`secret://` reference and `MongoCredentialResolver` is the only thing that turns one into a
# 프로파일 검증이 production 에 요구하는 것
if (production && !tlsRequired) {
throw MongoOperationRejectedException.of(
"config.tls",
"a production MongoDB profile requires TLS; the flag existed and nothing checked it, so a"
+ " deployment could carry tls-required=false and still be called production");
}
# 그 검증이 켜지려면 무엇이 있어야 하나
return () -> {
if (properties.profiles().isEmpty()) {
return;
}
if (probe.getIfAvailable() == null) {
throw new IllegalStateException(
"the Mongo platform has configured profiles but no MongoTopologyProbe bean, so the "
+ "startup validator has nothing to ask about the server: supply a probe built from "
+ "the live data-plane client, or remove the platform profiles. Starting without one "
+ "means the topology, the Stable API level and the credential's real capabilities "
+ "are checked by nothing — silently, because the check was conditioned on the very "
+ "bean whose absence it should report.");
}
# 출하 설정이 이 모듈 아래 노출하는 키
365: persistence-mongo:
367- enabled: ${APP_PERSISTENCE_MONGO_ENABLED:false}
370- active-profile: ${APP_PERSISTENCE_MONGO_ACTIVE_PROFILE:}
# platform.profiles 를 넣는 곳 전수 : 0
# 이 리프가 이미 쓰는 배선 수단
34- /** The customizer Boot applies when it builds the client. */
35- @Bean
36- @ConditionalOnBean(MeterRegistry.class)
37- @ConditionalOnMissingBean(name = "mongoDriverObservabilityCustomizer")
38: public MongoClientSettingsBuilderCustomizer mongoDriverObservabilityCustomizer(
# 프로덕션에서 그 수단을 등록하는 곳 전수 : 1
# 이 경계를 보는 시험이 있는가
/**
* The typed profile reaches the settings the driver is actually built from (MNG-INT-002).
*
* <p>The profile, the credential resolver, the TLS and Stable-API flags and the pool and timeout
* policy all existed and were all unit-tested. None of them was connected to a {@code
* MongoClientSettings}: the values were checked as intermediate objects, and whatever the driver
* ended up configured with was decided elsewhere. A policy that nothing applies is a policy that
* reads as applied.
*
# TLS 레인 시험이 쓰는 클라이언트
security/MongoTlsLaneTest.java-135- MongoClientSettings.builder()
security/MongoTlsLaneTest.java-136- .applyConnectionString(new ConnectionString(connectionString))
security/MongoTlsLaneTest.java:137: .applyToSslSettings(ssl -> ssl.enabled(true).context(trustOnly(authorityPem)))