--- kind: CONCEPT slug: adapter-outbound-persistence-jpa-c15 title: 한 번의 물리 시도만 담당하고 재시도는 하지 않는다 topic: transaction-and-consistency-models project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: concept:adapter-outbound-persistence-jpa-c15 evidenceCapturedOn: 2026-09-01 assets: - key: adapter-outbound-persistence-jpa-c15 file: ../../../final/evidence/rendered/adapter-outbound-persistence-jpa-c15.svg evidence: - ../../../final/evidence/raw/adapter-outbound-persistence-jpa-c15.txt source: - 원본 분석 절은 final/document.md#a05#L953 이다. module: adapter-outbound-persistence-jpa --- # 한 번의 물리 시도만 담당하고 재시도는 하지 않는다 `SpringJpaTransactionExecutor`는 attempt boundary를 소유하고 raw provider exception을 `JpaPersistenceException`으로 바꾸는 위치다. 자체 retry는 하지 않는다. ## 본문 이 executor는 한 번의 physical attempt만 담당한다. 자체 retry는 하지 않는다. ```text TransactionEvidenceContext.begin(...) -> TransactionTemplate.execute(work) -> success return or -> attempt boundary에서 failure translation -> translated runtime exception rethrow finally -> TransactionEvidenceScope close ``` ## SpringJpaTransactionExecutor 참조 위치 :::evidence key="adapter-outbound-persistence-jpa-c15" alt="코드베이스에서 SpringJpaTransactionExecutor 를 검색한 출력 26줄. 이 기록이 세는 참조가 그 출력에 그대로 보인다." caption="SpringJpaTransactionExecutor 코드베이스 검색 — 26줄 · exit 0" zoom="true" ::: ## 이 자리가 번역 지점인 이유 attempt boundary에서 operation, attempt number, elapsed time, reconciliation key를 알고 있으므로 raw provider exception을 `JpaPersistenceException`으로 변환하는 위치로 사용된다. vendor translator가 조립되면 PostgreSQL 40001/40P01 같은 structured SQLSTATE가 stable exception으로 바뀌어 coordinator가 처리할 수 있다.