개발 블로그를 위한 MCP 서버 구축기 (3): Cold Start 1초 미만을 위한 캐싱과 에러 복구
· 약 7분
Git Commit Hash 기반 캐싱으로 서버 시작 시간을 1초 미만으로 줄이고, 에러 복구 전략을 구현합니다.
🎯 들어가며
1편에서 Git 기반 아키텍처를, 2편에서 역인덱스 검색 기능을 구현했습니다. 하지만 실제로 사용해보면 한 가지 불편함이 있습니다.
"서버 시작이 너무 느려요"
매번 Claude Desktop을 열 때마다 Git clone과 인덱스 빌드가 발생합니다. 콘텐츠가 늘어날수록 점점 더 오래 걸리죠.
이번 편에서는 캐싱 시스템을 구현해서 Cold Start를 1초 미만으로 줄이고, 에러 복구 전략으로 안정성을 높입니다.
📚 문제 분석
현재 시작 프로세스
서버 시작
↓
Git Clone (첫 실행) 또는 Git Pull (5-10초)
↓
인덱스 빌드: 모든 파일 파싱 (1-3초)
↓
서비스 준비 완료
문제점
- 매번 인덱스 재빌드: 콘텐츠가 변경되지 않아도 전체 인덱스를 다시 빌드
- 네트워크 의존성: Git 작업 실패 시 서버 시작 불가
- 느린 Cold Start: 초기 시작에 5-15초 소요
목표
| 항목 | 현재 | 목표 |
|---|---|---|
| Cold Start (캐시 있음) | ~10초 | < 1초 |
| Cold Start (캐시 없음) | ~10초 | ~5초 |
| 네트워크 실패 시 | 서버 시작 실패 | 재시도 후 복구 |
🏗️ 캐싱 전략 설계
Git Commit Hash 기반 검증
캐시 무효화 전략에서 가장 중요한 건 "언제 캐시를 버릴 것인가?" 입니다.
여러 방법이 있습니다:
| 방식 | 장점 | 단점 |
|---|---|---|
| 시간 기반 (TTL) | 구현 간단 | 변경 없어도 갱신, 변경 있어도 캐시 사용 가능 |
| 파일 수정 시간 | 정확한 감지 | 모든 파일 검사 필요, clone 시 시간 변경됨 |
| Git Commit Hash | 정확하고 빠름 | Git 저장소 필요 |
Git Commit Hash를 선택했습니다. 저장소가 업데이트될 때만 commit hash가 바뀌므로 완벽한 무효화 키가 됩니다.
캐시 흐름
서버 시작
↓
Git Pull (저장소 동기화)
↓
현재 Commit Hash 조회
↓
캐시 파일에서 저장된 Commit Hash 비교
↓
[일치] 캐시 로드 → 서비스 준비 (< 1초)
[불일치] 인덱스 재빌드 → 캐시 저장 → 서비스 준비
🔧 CacheManager 구현
캐시 파일 구조
{
"commitHash": "b07fdb6abc123...",
"timestamp": "2025-12-03T15:30:00Z",
"index": {
"posts": { ... },
"docs": { ... },
"tags": { ... },
"keywords": { ... }
}
}
