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>
97 lines
4.7 KiB
Markdown
97 lines
4.7 KiB
Markdown
---
|
|
kind: CASE
|
|
slug: analysis-finding-a06-f028
|
|
title: 소비자가 없는 fixture 셋
|
|
topic: multitenancy-isolation
|
|
project: clean-architecture-backend-template
|
|
status: 게시 전
|
|
sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916
|
|
rootTreeNode: case:analysis-finding-a06-f028
|
|
evidenceCapturedOn: 2026-09-01
|
|
assets:
|
|
- key: analysis-finding-a06-f028
|
|
file: ../../../final/evidence/rendered/analysis-finding-a06-f028.svg
|
|
evidence:
|
|
- ../../../final/evidence/raw/analysis-finding-a06-f028.txt
|
|
source:
|
|
- 원본 분석 절은 analysis/06-adapter-outbound-persistence-mongo.md#L1433 이다.
|
|
---
|
|
|
|
# 소비자가 없는 fixture 셋
|
|
|
|
테스트킷의 세 타입이 테스트와 테스트킷 양쪽 모두에서 소비자가 0 이다. 그중 하나는 서버를 통과하는 왕복 계약을 실행하도록 만들어진 것이고, 그 계약은 열거된 계약 목록에 들어 있다.
|
|
|
|
## 관계
|
|
|
|
- **계약 테스트는 어댑터가 실제로 돌리는 statement를 실행해야 한다**
|
|
왕복 계약이 존재하는 이유다.
|
|
- **release gate가 실제로 차단하는 것은 hermetic test 3개이고 이 리프용 CI workflow는 없다**
|
|
같은 리프의 검증 지형을 다룬 사례다.
|
|
- **Bean 애너테이션이 있다는 것은 조립 증거가 아니다**
|
|
타입의 존재와 사용을 나눠 세는 규칙이다.
|
|
|
|
## 문제
|
|
|
|
테스트킷은 계약을 실행할 도구를 담는다. 그 도구들이 실제로 쓰이는지 확인이 필요하다.
|
|
|
|
## 결론
|
|
|
|
소비자 계수에서 양쪽 모두 0 인 타입이 셋이다.
|
|
|
|
로컬 컨테이너 타입은 검색과 벡터 계약의 빠른 피드백용이다. 관련 보고 타입은 테스트 한 곳에서 쓰이지만 실제 컨테이너를 띄우는 곳은 없다.
|
|
|
|
청크 이동 제어기는 트래픽 중 청크 이동을 재현하는 유일한 장치다. 재조정 중 프로덕션 요청이 들어오는 상황을 만든다.
|
|
|
|
왕복 계약은 자바에서 BSON 으로 서버를 거쳐 원시 BSON 으로 다시 자바로 돌아오는 왕복을 검증한다. javadoc 이 그 이유를 적는다. 왕복의 절반은 아무것도 증명하지 않으며 가운데의 원시 BSON 만이 그것을 보여 준다.
|
|
|
|
셋째가 가장 무겁다.
|
|
|
|
계약 열거형이 골든 BSON 을 열거된 계약으로 두는데, 그 계약을 실행하도록 만들어진 타입에 호출자가 없다.
|
|
|
|
BSON 스냅숏과 그 단언 도우미는 쓰인다. 그래서 정규형 단언은 존재하지만 서버를 통과하는 왕복은 돌지 않는다.
|
|
|
|
그리고 그 차이가 정확히 이 클래스가 존재하는 이유다.
|
|
|
|
## 검증 환경
|
|
|
|
OpenJDK : 21.0.12
|
|
확인 방식 : 테스트킷 타입별 소비자 계수
|
|
소스 수정 : x
|
|
|
|
## 재현 조건
|
|
|
|
원문은 final/evidence/raw/138 계열에 있다.
|
|
|
|
1. 테스트킷의 타입 목록을 만든다.
|
|
2. 각 타입의 테스트와 테스트킷 소비자를 센다.
|
|
3. 소비자가 0 인 타입의 javadoc 을 읽는다.
|
|
4. 왕복 계약이 계약 열거형에 있는지 확인한다.
|
|
5. 정규형 단언 도우미가 쓰이는지 확인한다.
|
|
|
|
## 본문
|
|
|
|
<!-- body:start -->
|
|
|
|
`138-...` §8.1의 소비자 계수에서 test·testkit 양쪽 모두 0인 타입이 셋이다.
|
|
|
|
| 타입 | 무엇을 위한 것인가 |
|
|
|---|---|
|
|
| `MongoAtlasLocalContainer` | Atlas Local 컨테이너 — search·vector 계약의 빠른 피드백용. `MongoAtlasCapabilityContractSuite`(report 타입)는 test 1곳에서 쓰이지만, **실제 컨테이너를 띄우는 곳은 없다** |
|
|
| `MongoChunkMigrationController` | 트래픽 중 청크 이동 — "production hits during a rebalance"를 재현하는 유일한 장치 |
|
|
| `MongoRoundTripContract` | Java → BSON → **서버** → raw BSON → Java 왕복. javadoc: "Half a round trip proves nothing… only the raw BSON in the middle shows it" |
|
|
|
|
## test 와 testkit 양쪽에서 0 인 타입
|
|
|
|
:::evidence key="analysis-finding-a06-f028" alt="분석 문서 analysis/06-adapter-outbound-persistence-mongo.md 에서 이 기록의 근거 절을 그대로 잘라낸 15줄. 코드베이스를 측정한 것이 아니라 원본 판정이 무엇을 적었는지를 보여 준다." caption="analysis/06-adapter-outbound-persistence-mongo.md 발췌 — 15줄" zoom="true"
|
|
:::
|
|
|
|
## 셋째가 가장 무겁다
|
|
|
|
`MongoReleaseContract`의 형제인 `MongoReplicaSetContract`는 `GOLDEN_BSON`을 열거된 계약으로 두는데, 그 계약을 실행하도록 만들어진 타입에 호출자가 없다. `MongoBsonSnapshot`·`MongoBsonSnapshotAssert`는 쓰이므로 **정규형 단언은 존재하지만 서버를 통과하는 왕복은 돌지 않는다** — 그리고 그 차이가 정확히 이 클래스가 존재하는 이유다. P3.
|
|
|
|
## 확인하지 못한 것
|
|
|
|
왕복 계약을 실제로 실행해 원시 BSON 이 기대와 다른지 확인하지 않았다.
|
|
|
|
<!-- body:end -->
|