feat: add notification production capability

This commit is contained in:
donghyeon-ka
2026-07-31 23:48:58 +09:00
parent b3add0162d
commit ec4bf105c4
199 changed files with 23589 additions and 122 deletions
@@ -17,6 +17,19 @@ readOnly 를 바꿔 쓰면 같은 빈을 공유하는 동시 요청 사이에 ra
사라지고, 각 모드를 따로 감사(audit)할 수 있다. 세 템플릿 모두 isolation 을 `READ_COMMITTED`
로 고정한다(모드표는 CLAUDE.md §TransactionPort implementation contract).
### 왜 `inRootWrite`가 별도 템플릿이나 `NEVER` propagation을 만들지 않나
`inRootWrite`의 실행 속성은 `inWrite`와 같은 `WRITE + REQUIRED + READ_COMMITTED`라 기존
write template을 재사용한다. 차이는 실행 전 precondition이다.
`TransactionSynchronizationManager.isActualTransactionActive()``true`이면 action과
`PlatformTransactionManager`를 호출하기 전에
`NestedRootTransactionRejectedException`으로 fail-fast한다. `REQUIRES_NEW`로 suspend해서
"root처럼 보이게" 하지 않으므로 호출자 transaction과 독립 commit되는 silent 의미 변경이 없다.
`TransactionTemplate.execute`는 commit까지 성공한 다음 값을 반환한다. 따라서
`inRootWrite`의 결과는 post-commit에만 호출자에게 보이고, commit 실패는 값 대신 원래 transaction
예외로 전파된다. 이 보장은 action이 외부 객체를 직접 변경하는 것을 되돌리는 보상이 아니라,
경계의 반환값을 성공으로 노출하지 않는 계약이다.
## audit — `AuditableEntity` / `AuditContextPort` / `DomainContextAuditContextPort`
### 캡처 메커니즘 — Manual explicit-set (D1 현재 스켈레톤 기본값)