--- kind: CONCEPT slug: messaging-testkit-c06 title: 아는 척하지 않기 위해 던지는 자리와 삼키는 자리 topic: result-and-failure-algebra project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: concept:messaging-testkit-c06 evidenceCapturedOn: 2026-09-01 assets: - key: messaging-testkit-c06 file: ../../../final/evidence/rendered/messaging-testkit-c06.svg evidence: - ../../../final/evidence/raw/messaging-testkit-c06.txt source: - 원본 분석 절은 final/document.md#a19-messaging-testkit#L492 이다. module: messaging-testkit --- # 아는 척하지 않기 위해 던지는 자리와 삼키는 자리 이 리프의 실패 처리 원칙은 하나다: 모르는 것을 아는 척하지 않는다. 그 원칙이 어떤 자리에서는 예외를 던지는 방향으로, 다른 자리에서는 예외를 삼키는 방향으로 나타난다. ## 본문 이 리프의 실패 처리 원칙은 하나다: **모르는 것을 아는 척하지 않는다.** 같은 원칙이 어느 자리에서는 예외를 던지는 쪽으로, 다른 자리에서는 예외를 삼키는 쪽으로 나타난다. ## 등록되지 않은 어댑터와 기록 없는 커버리지 `CompatibilityMatrix.of("messaging-artemis")` 는 던지고(`anUnknownAdapterIsNotSilentlyTreatedAsSupported`), `matrix.coverageOf("messaging-artemis", …)` 는 `NOT_COVERED` 를 돌려준다(`aFaultThatWasNeverRecordedReadsAsUncoveredRatherThanPassing`). 전자는 "지원 목록에 없는 것을 지원인 척"을 막고, 후자는 "기록 없음"이 곧 "커버 안 됨"이라는 자연스러운 읽기다. ## DockerAvailability가 어떤 예외든 삼키는 이유 `Class.forName("org.testcontainers.DockerClientFactory")` 를 리플렉션으로 부르고 어떤 예외든 `false` 로 삼킨다(`:26-34`). 이 리프가 testcontainers 에 의존하지 않으면서 그 존재를 물어볼 수 있게 하는 유일한 방법이고, 결과를 `static final` 로 1회만 캐시한다. ## DockerAvailability 참조 위치 :::evidence key="messaging-testkit-c06" alt="코드베이스에서 DockerAvailability 를 검색한 출력 16줄. 이 기록이 세는 참조가 그 출력에 그대로 보인다." caption="DockerAvailability 코드베이스 검색 — 16줄 · exit 0" zoom="true" ::: ## 인증 레인만 가드 없이 실패한다 **"skip 은 성공이 아니다"** 라는 반대 규칙이 인증 레인에는 적용되어 있다. 일반 컨테이너 스위트는 `DockerAvailability` 로 skip 하고, 인증 레인만 **가드 없이 실패**한다. 대신 `test` 태그에서 빼서 노트북 빌드를 깨지 않는다. 두 규칙이 충돌하지 않게 배치되어 있다.