--- kind: CONCEPT slug: messaging-core-api-c06 title: 예외 클래스로 분기하지 않아도 되게 만든 기반 타입 topic: delivery-and-settlement-models project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: concept:messaging-core-api-c06 evidenceCapturedOn: 2026-09-01 assets: - key: messaging-core-api-c06 file: ../../../final/evidence/rendered/messaging-core-api-c06.svg evidence: - ../../../final/evidence/raw/messaging-core-api-c06.txt source: - 원본 분석 절은 analysis/messaging/messaging-core-api.md#L419 이다. module: messaging-core-api --- # 예외 클래스로 분기하지 않아도 되게 만든 기반 타입 MessagingException(abstract) → 23개 구체 예외. 기반 타입이 FailureDescriptor를 갖고 category()·retryable()를 위임한다. ## 본문 `MessagingException`(abstract) → 23개 구체 예외. 기반 타입이 `FailureDescriptor`를 갖고 `category()`·`retryable()`를 위임한다. javadoc이 목적을 적는다 — "a caller catching the base type can still classify and route the failure without matching on exception classes." ## MessagingException 참조 위치 :::evidence key="messaging-core-api-c06" alt="코드베이스에서 MessagingException 를 검색한 출력 36줄. 이 기록이 세는 참조가 그 출력에 그대로 보인다." caption="MessagingException 코드베이스 검색 — 36줄 · exit 0" zoom="true" ::: ## 23개 중 12개가 leaf 밖에서 참조되지 않는다 `evidence/raw/269` §B — 12개 전부 `git grep` exit=1. §12.1에서 다룬다. ## 조용한 강등을 막는 문장들 `MessagingCapabilityUnavailableException` javadoc — "Downgrading replication evidence to a bare ack, or ordered delivery to unordered, produces a system that looks healthy right up to the moment the guarantee actually mattered." `MessageBackpressureException` javadoc — "Blocking the caller until a slot frees turns producer-side saturation into thread exhaustion in the calling application, which is a far worse failure than a fast rejection." 그리고 "Nothing was transmitted when this is thrown, so the message has no ambiguity."