--- kind: QUESTION slug: messaging-reliability-api-f03 title: dual-write의 답이라고 선언한 진입점에 구현이 없다 topic: runtime-reachability-and-composition project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: open-question:messaging-reliability-api-f03 questionStatus: OPEN verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지 않았다 source: - analysis/messaging/messaging-reliability-api.md#L707 --- # dual-write의 답이라고 선언한 진입점에 구현이 없다 Outbox 절반이 "릴레이가 읽는 쪽" 만 배선돼 있고 "애플리케이션이 쓰는 쪽" 이 비어 있다. ## 관계 - **계약만 담는 leaf도 계약의 거절 조건은 자기 레인에서 검증한다** 같은 분석 리프에서 끌어낸 규칙이다. - **record의 `equals`를 좁히면 이유를 적는다** 같은 분석 리프에서 끌어낸 규칙이다. - **호출 컨텍스트가 계약이면 그 컨텍스트를 검증할 수단을 함께 정한다** 같은 분석 리프에서 끌어낸 규칙이다. ## 사실 ReliableMessagePublisher 가 구현 0, 참조 0 이다. git grep -n -E 'implements .*ReliableMessagePublisher' -- src 가 아무것도 돌려주지 않는다. javadoc 은 "This is the answer to the dual-write problem" 이라고 적는다. OutboxRepository.append 가 있으므로 outbox 에 행을 넣을 방법 자체가 없는 것은 아니다. 다만 그 포트는 저장소 계약이고, ReliableMessagePublisher 는 애플리케이션이 저장소를 직접 만지지 않게 하려고 존재한다. 애플리케이션은 ArchUnit 규칙 때문에 이 leaf 를 참조할 수 없다. 그래서 브리지 어댑터가 필요한데 그것이 없다. ## 미지수 두 outbox 모델 중 어느 쪽이 정본인가. 이 질문은 application-core 와 cross-scope 가 함께 답한다. ## 선택지 브리지 어댑터를 만든다 애플리케이션이 ArchUnit 규칙을 지키면서 이 진입점에 도달한다. 애플리케이션 outbox 모델을 정본으로 삼는다 이 인터페이스를 제거하거나 파생 프로젝트의 확장점임을 명시한다. ## 다음 검증 구현 부재는 evidence/raw/289 §B · §C · §D 로 확정된다. 어느 모델이 정본인가는 이 leaf 안에서 답해지지 않는다.