--- kind: CONCEPT slug: adapter-outbound-cache-redis-c04 title: 대칭 검사기 자신을 검사하는 메타 테스트가 있다 topic: admission-budget-and-backpressure project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: concept:adapter-outbound-cache-redis-c04 evidenceCapturedOn: 2026-09-01 assets: - key: adapter-outbound-cache-redis-c04 file: ../../../final/evidence/rendered/adapter-outbound-cache-redis-c04.svg - key: adapter-outbound-cache-redis-c04-diagram file: ../../../final/assets/diagrams/adapter-outbound-cache-redis-c04.svg evidence: - ../../../final/evidence/raw/adapter-outbound-cache-redis-c04.txt source: - 원본 분석 절은 analysis/10-adapter-outbound-cache-redis.md#L245 이다. module: adapter-outbound-cache-redis --- # 대칭 검사기 자신을 검사하는 메타 테스트가 있다 `ReactiveRedisOperations`는 "Mirrors `RedisOperations` method for method"라고 주장하고 `ApiParityTest`가 그것을 반사로 강제한다. 그 위에 검사기가 고장 나 항상 통과하는 상태를 잡는 메타 테스트가 하나 더 있다. ## 본문 `ReactiveRedisOperations`는 "Mirrors `RedisOperations` method for method"라고 주장한다. `ApiParityTest`가 그것을 반사로 강제한다 — `PAIRS` 맵에 14쌍의 sync/reactive 인터페이스를 놓고 `everySyncOperationHasReactiveCounterpart`, `everyTypedSurfaceIsInParity`, `theTwoEntryPointsExposeTheSameStructureAccessors`, `everyReactiveMethodReturnsAPublisher`를 돌린다. 두 facade의 접근자 12개는 실제로 동일하다(diff 공백). ## 검사기에 대한 메타 검사 :::evidence key="adapter-outbound-cache-redis-c04-diagram" alt="두 진입점 인터페이스와 대칭 검사와 메타 테스트가 위에서 아래로 쌓이고 검사 방향 화살표가 아래로 그려진 구조" caption="검사기에 대한 메타 검사" zoom="false" ::: 두 가지가 특히 좋다. 첫째, **예외가 이유와 함께 목록에서 빠져 있다** — Pub/Sub은 sync가 핸들러+closeable subscription이고 reactive는 publisher 자신이 전달하며 취소로 구독을 끊으므로 "different shapes on purpose, so mechanical parity would be the wrong check for them". 둘째, `theInspectorDetectsADivergentReturnShape`라는 **검사기에 대한 메타 test**가 있다 — 대칭 검사기가 고장 나 항상 통과하는 상태를 잡는다. ## ReactiveRedisOperations 참조 위치 :::evidence key="adapter-outbound-cache-redis-c04" alt="코드베이스에서 ReactiveRedisOperations 를 검색한 출력 2줄. 이 기록이 세는 참조가 그 출력에 그대로 보인다." caption="ReactiveRedisOperations 코드베이스 검색 — 2줄 · exit 0" zoom="true" :::