From ecc
SHA-256 콘텐츠 해시를 사용해 비용이 큰 파일 처리 결과를 캐시합니다. 경로와 무관하고, 콘텐츠 변경 시 자동 무효화되며, 서비스 레이어 분리를 유지합니다.
npx claudepluginhub sam42-lab/everything-claude-code-krThis skill uses the workspace's default tool permissions.
PDF 파싱, 텍스트 추출, 이미지 분석처럼 비용이 큰 파일 처리 결과를 SHA-256 콘텐츠 해시를 캐시 키로 사용해 저장합니다. 경로 기반 캐시와 달리 파일 이동/이름 변경에도 캐시를 재사용할 수 있고, 내용이 바뀌면 자동으로 무효화됩니다.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
PDF 파싱, 텍스트 추출, 이미지 분석처럼 비용이 큰 파일 처리 결과를 SHA-256 콘텐츠 해시를 캐시 키로 사용해 저장합니다. 경로 기반 캐시와 달리 파일 이동/이름 변경에도 캐시를 재사용할 수 있고, 내용이 바뀌면 자동으로 무효화됩니다.
--cache/--no-cache CLI 옵션이 필요할 때경로가 아니라 파일 내용을 키로 사용합니다.
import hashlib
from pathlib import Path
_HASH_CHUNK_SIZE = 65536
핵심 이유:
from dataclasses import dataclass
@dataclass(frozen=True, slots=True)
class CacheEntry:
file_hash: str
source_path: str
document: ExtractedDocument
각 캐시는 {hash}.json으로 저장합니다. 해시 기준 O(1) 조회가 가능하고 인덱스 파일이 필요 없습니다.
def write_cache(cache_dir: Path, entry: CacheEntry) -> None:
...
손상된 엔트리는 None을 반환해 cache miss로 처리합니다.
처리 함수는 순수하게 유지하고, 캐시는 별도 서비스 레이어로 감쌉니다.
def extract_with_cache(
file_path: Path,
*,
cache_enabled: bool = True,
cache_dir: Path = Path(".cache"),
) -> ExtractedDocument:
...
핵심 순서:
| Decision | Rationale |
|---|---|
| SHA-256 content hash | 경로와 무관, 내용 변경 시 자동 무효화 |
{hash}.json naming | O(1) 조회, 인덱스 불필요 |
| Service layer wrapper | 추출 함수는 순수, 캐시는 별도 관심사 |
| Manual JSON serialization | frozen dataclass 제어 |
Corruption returns None | 다음 실행에서 재처리 |
| Lazy cache dir creation | 첫 쓰기 시 생성 |
asdict() 사용--cache/--no-cache 옵션이 있는 CLI