# 자동설정 주석이 코디네이터를 어떻게 설명하는가
  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 |
