# 자동설정 주석이 코디네이터를 어떻게 설명하는가 JpaTransactionAutoConfiguration.java:28 * JpaTransactionAutoConfiguration.java:29 *

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 *

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 *

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 |