--- kind: CONCEPT slug: messaging-runtime-core-c06 title: 지역 변수 하나만 람다가 복사해 캡처한다 topic: state-machines-and-ownership project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: concept:messaging-runtime-core-c06 evidenceCapturedOn: 2026-09-01 assets: - key: messaging-runtime-core-c06 file: ../../../final/evidence/rendered/messaging-runtime-core-c06.svg evidence: - ../../../final/evidence/raw/messaging-runtime-core-c06.txt source: - 원본 분석 절은 analysis/messaging/messaging-runtime-core.md#L429 이다. module: messaging-runtime-core --- # 지역 변수 하나만 람다가 복사해 캡처한다 `DefaultMessagePublisher` 자체는 불변이고 필드 여덟이 전부 final 협력자다. `lease`만 메서드 지역 변수다. ## 관계 - **만들어 두고 흘리지 않는 진단값은 진단이 아니다** 같은 분석 리프에서 끌어낸 규칙이다. - **증가한다고 문서화한 값이 리터럴이면 그 사실을 적는다** 같은 분석 리프에서 끌어낸 규칙이다. - **안정 코드는 운영자의 행동이 갈리는 지점마다 나눈다** 같은 분석 리프에서 끌어낸 규칙이다. - **`CompletionStage`를 반환하는 메서드는 동기적으로 던지지 않는다** 같은 분석 리프에서 끌어낸 규칙이다. ## 본문 `DefaultMessagePublisher` 자체는 불변이고 상태를 갖지 않는다 — 필드 여덟이 전부 final 협력자다. `lease`만 메서드 지역 변수이고 `handle` 람다가 `held`라는 effectively-final 복사본으로 캡처한다. ## DefaultMessagePublisher 참조 위치 :::evidence key="messaging-runtime-core-c06" alt="코드베이스에서 DefaultMessagePublisher 를 검색한 출력 22줄. 이 기록이 세는 참조가 그 출력에 그대로 보인다." caption="DefaultMessagePublisher 코드베이스 검색 — 22줄 · exit 0" zoom="true" ::: ## 수명주기 참여는 하나뿐이다 `TransportMessagingRuntime.close()`뿐이고, 그것을 부르는 것은 registry(회전 시)와 컨텍스트 종료 두 경로다.