--- kind: CASE slug: capability-constant-outlives-its-condition title: 능력 상수가 프로파일 조건보다 오래 살아서 중복 제거 없는 목적지가 가드를 통과한다 topic: transport-and-provider-semantics project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: case:capability-constant-outlives-its-condition evidenceCapturedOn: 2026-09-01 body: case-capability-constant-outlives-its-condition.body.md assets: - key: capability-constant-outlives-its-condition file: ../../../final/evidence/rendered/capability-constant-outlives-its-condition.svg evidence: - ../../../final/evidence/raw/capability-constant-outlives-its-condition.txt source: - 원본 분석 절은 final/document.md#a19-messaging-nats-experimental#L111 이다. --- # 능력 상수가 프로파일 조건보다 오래 살아서 중복 제거 없는 목적지가 가드를 통과한다 어댑터가 중복 제거 지원을 상수로 참이라 답한다. 실제 중복 제거 식별자는 프로파일에 창이 있을 때만 실린다. 창은 선택 사항이고 아무도 요구하지 않는다. 그리고 이 플래그는 부재가 예외를 만드는 유일한 능력이다. ## 관계 - **같은 자동 설정 안에서 검증기 하나만 감싸이지 않아 트랜잭션 조건이 검사되지 않는다** 같은 통독에서 나온 짝이다. - **지원 매트릭스가 코드와 반대를 말한다** 같은 능력 표의 반대 방향 사례다. - **조용히 약해진 보증은 사고 전까지 동작하는 것과 구분되지 않는다** 능력 레코드의 자바독이 적은 근거다. ## 문제 능력 레코드의 자바독이 계약을 선언한다. 프로파일이 여기 없는 것을 요구하면 플랫폼이 크게 실패한다는 것이다. 조용히 저하되지 않는다는 것이고, 그 이유는 조용히 약해진 보증이 사고가 나기 전까지 동작하는 보증과 구분되지 않기 때문이라는 것이다. 이 어댑터가 그 계약을 어떻게 답하는지 확인했다. ## 결론 상수로 답한다. 능력 값이 정적 최종 필드이고 프로파일을 보지 않는다. 그중 중복 제거 발행이 참이다. 그런데 중복 제거 식별자는 프로파일에 창이 있을 때만 만들어진다. 창이 비어 있으면 식별자가 없고, 헤더가 실리지 않고, 서버는 중복을 제거하지 않는다. 창은 선택 사항이다. 프로파일 생성자도 시작 검증기도 창을 요구하지 않는다. 이 플래그가 특별한 이유가 있다. 능력 열둘 중 부재가 예외를 만드는 유일한 것이다. 나머지는 읽히지 않거나 분기에만 쓰인다. 그러므로 창 없는 목적지가 그 가드를 통과한다. 가드는 어댑터가 참이라 답했으니 통과시킨다. 그리고 어댑터 자신이 그 조건을 알고 있다. 클래스 자바독이 시간 초과 발행을 모호로 다루는 이유를 적으면서, 그 모호를 재시도해도 안전하게 만드는 것은 중복 제거 창이며 프로파일이 그것을 켰을 때라고 적는다. 프로파일이 그것을 켰을 때라는 조건이 정확히 능력이 담지 않은 것이다. 창이 없는 목적지에서 모호를 재시도하면 스트림에 같은 메시지가 두 번 들어간다. ## 검증 환경 확인 방식 : 능력 상수와 식별자 생성 경로 대조, 프로파일 생성자와 검증기의 요구 확인 소스 수정 : x ## 재현 조건 원문은 document-detail 의 final/document.md#a19-messaging-nats-experimental 에 있다. 1. 어댑터의 능력 상수를 읽고 각 성분의 의미를 레코드 문서에서 확인한다. 2. 중복 제거 식별자를 만드는 메서드를 읽는다. 3. 프로파일의 창 필드가 선택 사항인지 확인한다. 4. 생성자와 검증기가 창을 요구하는지 확인한다. 5. 그 플래그의 부재가 어디서 예외를 만드는지 확인한다. ## 본문 어댑터가 `deduplicatedPublish=true` 를 상수로 답한다. 그런데 중복 제거 식별자는 프로파일에 창이 있을 때만 만들어지고, 창은 선택 사항이며 생성자도 검증기도 요구하지 않는다. ## 중복 제거 식별자가 만들어지는 조건 :::evidence key="capability-constant-outlives-its-condition" alt="분석 문서 final/document.md#a19-messaging-nats-experimental 에서 이 기록의 근거 절을 그대로 잘라낸 15줄. 코드베이스를 측정한 것이 아니라 원본 판정이 무엇을 적었는지를 보여 준다." caption="final/document.md#a19-messaging-nats-experimental 발췌 — 15줄" zoom="true" ::: ## 창이 없으면 서버가 중복을 제거하지 않는다 `Nats-Msg-Id` 가 실리지 않기 때문이다. ## 하필 그 플래그다 이 플래그는 능력 열둘 중 부재가 예외를 만드는 유일한 것이라, 창 없는 목적지가 그 가드를 통과한 뒤 모호 재발행에서 스트림에 같은 메시지를 두 번 넣는다. ## 어댑터 자신의 javadoc 이 조건을 안다 재시도를 안전하게 만드는 것은 창이며 "프로파일이 그것을 켰을 때" 라고 적는다. ## 확인하지 못한 것 창 없는 프로파일로 모호 재발행을 실행해 중복 저장을 재현하지 않았다. 이 리프는 실험 등급이고 배선 경로가 없다.