Files
document-haness/docs/clean-architecture-backend-template/final/evidence/raw/analysis-finding-a05-f010.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

85 lines
7.0 KiB
Plaintext

# 자동설정 주석이 코디네이터를 어떻게 설명하는가
JpaTransactionAutoConfiguration.java:28 *
JpaTransactionAutoConfiguration.java:29 * <p>Plain construction rather than Spring auto-configuration: this repository's composition root
JpaTransactionAutoConfiguration.java:30 * owns wiring, and an adapter leaf that auto-configured a transaction manager would silently
JpaTransactionAutoConfiguration.java:31 * replace one the application had deliberately chosen.
JpaTransactionAutoConfiguration.java:32 *
JpaTransactionAutoConfiguration.java:33 * <p>There is no declarative retry annotation any more. {@code @RetryableJpaTransaction} lived in
JpaTransactionAutoConfiguration.java:34 * the persistence leaf and documented itself as something an application service would put on its
JpaTransactionAutoConfiguration.java:35 * own methods — which application-core cannot do without importing an outbound adapter and
JpaTransactionAutoConfiguration.java:36 * inverting the dependency this architecture is built on. The canonical boundary is {@code
JpaTransactionAutoConfiguration.java:37 * PolicyTransactionPort.inTransaction(TransactionRequest, Supplier)}; the retry coordinator below
JpaTransactionAutoConfiguration.java:38 * is what implements it, not a second way to ask for the same thing.
JpaTransactionAutoConfiguration.java:39 */
JpaTransactionAutoConfiguration.java:40 public final class JpaTransactionAutoConfiguration {
JpaTransactionAutoConfiguration.java:41
JpaTransactionAutoConfiguration.java:42 /** How long a logical operation may keep retrying before the budget is spent regardless. */
JpaTransactionAutoConfiguration.java:43 public static final Duration DEFAULT_MAX_RETRY_ELAPSED = Duration.ofSeconds(30);
JpaTransactionAutoConfiguration.java:44
JpaTransactionAutoConfiguration.java:45 private final Clock clock;
JpaTransactionAutoConfiguration.java:46
JpaTransactionAutoConfiguration.java:47 public JpaTransactionAutoConfiguration(Clock clock) {
JpaTransactionAutoConfiguration.java:48 this.clock = Objects.requireNonNull(clock, "clock");
JpaTransactionAutoConfiguration.java:49 }
JpaTransactionAutoConfiguration.java:50
JpaTransactionAutoConfiguration.java:51 /**
JpaTransactionAutoConfiguration.java:52 * The commit-phase classifier the evidence-aware transaction manager is built with.
JpaTransactionAutoConfiguration.java:53 *
JpaTransactionAutoConfiguration.java:54 * <p>The manager itself is constructed inside the persistence leaf, through {@code
JpaTransactionAutoConfiguration.java:55 * EvidenceAwareJpaTransactionManager.standard(entityManagerFactory, clock)}. The composition root
# PolicyTransactionPort 를 구현한다고 선언한 클래스
adapter/outbound/persistence-jpa · main · SpringTransactionPort.java:31 public class SpringTransactionPort implements PolicyTransactionPort {
[자기시험] 없는 이름으로 같은 검색 : 0 개
[대조] implements TransactionPort : 21 개
# 그 구현체의 선언과 자바독
SpringTransactionPort.java:24
SpringTransactionPort.java:25 /**
SpringTransactionPort.java:26 * Spring-backed {@link PolicyTransactionPort}: one pre-built {@link TransactionTemplate} per mode,
SpringTransactionPort.java:27 * all pinned to {@link Isolation#READ_COMMITTED}. See README "transaction" for why the templates
SpringTransactionPort.java:28 * are pre-built (mutable-template race) and CLAUDE.md for the mode table.
SpringTransactionPort.java:29 */
SpringTransactionPort.java:30 @Component
SpringTransactionPort.java:31 public class SpringTransactionPort implements PolicyTransactionPort {
SpringTransactionPort.java:32
SpringTransactionPort.java:33 private final TransactionTemplate writeTemplate;
SpringTransactionPort.java:34 private final TransactionTemplate readTemplate;
SpringTransactionPort.java:35 private final TransactionTemplate requiresNewTemplate;
SpringTransactionPort.java:36 private final SpringPolicyTransactionPort policyExecutor;
SpringTransactionPort.java:37 private final PersistenceExceptionTranslator exceptionTranslator;
SpringTransactionPort.java:38
SpringTransactionPort.java:39 public SpringTransactionPort(PlatformTransactionManager transactionManager) {
SpringTransactionPort.java:40 this(
# 코디네이터와 런타임 빈이 무엇을 만드는가
JpaTransactionAutoConfiguration.java:43 public static final Duration DEFAULT_MAX_RETRY_ELAPSED = Duration.ofSeconds(30);
JpaTransactionAutoConfiguration.java:47 public JpaTransactionAutoConfiguration(Clock clock) {
JpaTransactionAutoConfiguration.java:61 public CommitFailureClassifier commitFailureClassifier() {
JpaTransactionAutoConfiguration.java:66 public SpringJpaTransactionExecutor transactionExecutor(
JpaTransactionAutoConfiguration.java:82 public SpringJpaTransactionExecutor transactionExecutor(
JpaTransactionAutoConfiguration.java:99 public FullTransactionRetryCoordinator retryCoordinator(
JpaTransactionAutoConfiguration.java:107 public FullTransactionRetryCoordinator retryCoordinator(
JpaTransactionAutoConfiguration.java:114 public RetrySleeper retrySleeper() {
# 두 스택을 부르는 자리
PolicyTransactionPort 를 참조하는 main 파일 : 4 개
FullTransactionRetryCoordinator 를 참조하는 main 파일 : 4 개
SpringJpaTransactionExecutor 를 참조하는 main 파일 : 4 개
SpringTransactionPort 를 참조하는 main 파일 : 4 개
PolicyTransactionPort 를 참조하는 main 파일 :
SpringPolicyTransactionPort.java
SpringTransactionPort.java
JpaTransactionAutoConfiguration.java
PolicyTransactionPort.java
# 문서 쪽 서술
docs/reviews/2026-08-14-jpa-module-code-review.md:31 5. application이 이미 사용하는 `PolicyTransactionPort`와 새 JPA executor/AOP 계약이 두 벌로 존재하고,
docs/reviews/2026-08-14-jpa-module-code-review.md:41 - `PolicyTransactionPort`를 application-facing transaction SSOT로 유지하고 병렬 transaction API를 더
docs/reviews/2026-08-14-jpa-module-code-review.md:119 | JPA-007 | P1 | High | transaction authority와 application contract가 두 벌 | `PolicyTransactionPort` 단일 facade로 통합 |
docs/reviews/2026-08-14-jpa-module-code-review.md:404 - application에는 `TransactionPort`, `PolicyTransactionPort`, `TransactionRequest`,
docs/reviews/2026-08-14-jpa-module-code-review.md:406 - live adapter인 `SpringTransactionPort.java:31-32`는 `@Component`이며 `PolicyTransactionPort`를
docs/reviews/2026-08-14-jpa-module-code-review.md:427 1. 템플릿의 canonical boundary를 `PolicyTransactionPort.inTransaction(TransactionRequest, Supplier)`로
docs/reviews/2026-08-14-jpa-module-code-review.md:442 - application unit에서 fake `PolicyTransactionPort`로 committed, determinate rollback, indeterminate,
docs/reviews/2026-08-14-jpa-module-code-review.md:1291 | application transaction 계약 두 벌 | Facade + Adapter | `PolicyTransactionPort` 구현 | application port 하나만 public, JPA engine은 internal |