--- kind: CONCEPT slug: messaging-admin-runtime-c05 title: 실패 사유가 저널에도 감사 이벤트에도 남지 않는다 topic: observability-models project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: concept:messaging-admin-runtime-c05 evidenceCapturedOn: 2026-09-01 assets: - key: messaging-admin-runtime-c05 file: ../../../final/evidence/rendered/messaging-admin-runtime-c05.svg evidence: - ../../../final/evidence/raw/messaging-admin-runtime-c05.txt source: - 원본 분석 절은 analysis/messaging/messaging-admin-runtime.md#L472 이다. module: messaging-admin-runtime --- # 실패 사유가 저널에도 감사 이벤트에도 남지 않는다 `attempt(...)` 가 모든 `RuntimeException` 을 삼키는 것은 근거가 있지만 대가도 있다. 감사 이벤트는 `failed` 개수만 담고, 어떤 메시지가 왜 실패했는지는 어디에도 기록되지 않는다. ## 본문 토폴로지 불일치가 두 곳에서 각각 보고된다. | 상황 | 처리 | 위치 | |---|---|---| | 토폴로지 불일치 (A) | `MessagingConfigurationException("TOPOLOGY_MISMATCH")` | `TopologyValidationReport:78` | | 토폴로지 불일치 (B) | `MessageTopologyException("TOPOLOGY_MISMATCH")` | `TopologyValidationRuntime:54` | 이 두 줄이 §12.3(a)의 요약이다 — 같은 코드 문자열, 다른 예외 타입, 다른 판정 규칙. ## RuntimeException 을 삼키는 자리 :::evidence key="messaging-admin-runtime-c05" alt="코드베이스에서 RuntimeException 를 검색한 출력 4줄. 이 기록이 세는 참조가 그 출력에 그대로 보인다." caption="RuntimeException 코드베이스 검색 — 4줄 · exit 0" zoom="true" ::: ## 삼킨 예외가 남기지 않는 것 `attempt(...)` 가 모든 `RuntimeException` 을 삼키는 것은 근거가 있지만 대가도 있다: 실패 사유가 어디에도 남지 않는다. 감사 이벤트는 `failed` 개수만 담고(`:135`), 어떤 메시지가 왜 실패했는지는 기록되지 않는다.