--- kind: CONCEPT slug: application-core-c07 title: forRemoval이 붙었는데 production consumer가 남아 있다 topic: delivery-and-settlement-models project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: concept:application-core-c07 evidenceCapturedOn: 2026-09-01 assets: - key: application-core-c07 file: ../../../final/evidence/rendered/application-core-c07.svg evidence: - ../../../final/evidence/raw/application-core-c07.txt source: - 원본 분석 절은 analysis/03-application-core.md#L182 이다. module: application-core --- # forRemoval이 붙었는데 production consumer가 남아 있다 raw key/whole-byte legacy 계약과 provider-neutral semantic 계약이 같은 leaf에 공존하고, 제거 시점이 날짜가 아니라 실제 usage로 문서화돼 있다. ## 관계 - **legacy storage/notification compatibility surface의 제거 조건 추적** 같은 분석 리프에서 끌어낸 규칙이다. ## 본문 `application.storage.ObjectStoragePort`는 raw object key/whole-byte 방식의 legacy contract이며 `forRemoval` 표시가 있지만 실제 production consumer가 남아 있다. sample poster upload, adapter/config, characterization test에서 사용되므로 dead code로 분류할 수 없다. ## FilesystemCsvExportAdapter 참조 위치 :::evidence key="application-core-c07" alt="코드베이스에서 FilesystemCsvExportAdapter 를 검색한 출력 8줄. 이 기록이 세는 참조가 그 출력에 그대로 보인다." caption="FilesystemCsvExportAdapter 코드베이스 검색 — 8줄 · exit 0" zoom="true" ::: ## 제거 시점을 날짜로 적지 않았다 제거 시점은 날짜가 아니라 실제 migration/zero usage로 판단하도록 문서화돼 있다. `fileexport` 역시 raw filesystem path를 반환하는 opt-in legacy capability이며 `FilesystemCsvExportAdapter`/configuration을 통해 조건부 활성화된다. ## receipt surface에 raw Path가 없는 쪽 반대로 `filepublication`은 logical destination, operation/reference/version, schema, row streaming/checkpoint, durability semantic을 provider-neutral 계약으로 만든다. CSV formula injection(`=`, `+`, `-`, `@`, tab, CR)을 reject하는 정책이 테스트로 고정돼 있고, raw Path/SFTP/fileserver 타입이 receipt surface에 나오지 않는다.