캐시란?#
- 자주 사용하는 데이터에 빠르게 접근할 수 있도록 데이터를 미리 복사해 놓은 고속 임시 저장소
- 매번 느린 원본 저장소에서 가져오는 것보다 빠르게 접근할 수 있음
- 주로 RAM같은 빠른 매체 사용. DB, 디스크, 네트워크처럼 느린 계층에 대한 접근 횟수 줄임
캐싱이란?#
- 자주 사용하는 데이터에 빠르게 접근할 수 있도록 데이터를 임시 저장소(메모리, 디스크)에 복사해서 보관하는 기술
- 캐시 히트: 캐시에 해당 데이터가 있는 경우. 데이터가 반환됨
- 캐시 미스: 캐시에 해당 데이터가 없는 경우. 원본을 데이터에서 복사해서 캐시에 저장.
- 유의사항: 원본 데이터가 바뀌면 캐시도 갱신해야함.
- 캐시 예시: CPU 캐시부터 웹 브라우저, 앱 이미지 캐시까지 컴퓨터 시스템 전반에서 쓰임
- 브라우저 캐시: 웹페이지, 이미지, 스크립트 등을 로컬에 저장
- CPU 캐시: 자주 쓰는 데이터를 RAM보다 빠른 캐시 메모리에 보관
- 데이터베이스 캐시: 반복되는 결과를 메모리에 저장 ex Redis
- CDN: 콘텐츠를 전 세계 서버에 분산 저장해 가까운 곳에서 제공
캐싱이 필요한 이유#
- 지역성의 원리 기반:
- 시간 지역성: 방금 쓴 데이터는 곧 다시 쓸 가능성이 높음.
- 공간 지역성: 특정 데이터 근처 데이터도 함께 참조될 가능성이 큼.
- 성능 향상: 네트워크 요청이나 DB 조회는 밀리초 단위로 느리지만, 메모리 캐시는 나노초 수준으로 상대적으로 빠르게 접근 가능.
- 비용 절감: 서버 부하와 네트워크 트래픽을 줄여 비용을 낮춘다.
장점과 단점#
- 장점
- 응답 속도 향상을 통한 사용자 체감 성능 개선.
- 원본 저장소(DB, API, 디스크, 네트워크)의 부하 감소 및 비용 절감.
- 단점
- 캐시와 원본 데이터 간 불일치(스테일 데이터) 문제.
- 추가 메모리 사용, 캐시 구축·무효화 전략 설계 복잡도 증가
캐시 위치에 따른 캐싱 종류: 메모리 캐싱과 디스크 캐싱#
- 메모리 캐싱
- 저장 위치: RAM
- 휘발성: 앱이 종료되면 사라짐.
- 용량: RAM의 용량이 제한적이라 많이 저장 못함.
- 디스크 캐싱
- 저장 위치: 저장소
- 영구성: 앱을 종료해도 유지됨.
- 용량: 메모리(RAM)에 비해 저장을 훨씬 더 많이할 수 있음.
Apple 플랫폼 개발에서의 캐싱 대상#
- 이미지
- 일반 데이터
- 구조화된 데이터
- 네트워크 응답
- 등등
- 메모리 캐시(NSCache): 앱 실행 중 빠른 접근용, 메모리 부족시 자동 제거.
- 디스크 캐시(FileManager): 앱 재시작해도 유지, 영속성 보장.
- 네트워크 캐시: HTTP 응답 자체를 캐싱.
캐싱을 위한 도구, 방법들#
NSCache#
- Apple Platform에서 메모리 기반 캐싱을 위한 Foundation 프레임워크 클래스
- 이미지, API 응답 등 자주 쓰이는 데이터를 메모리에 임시 저장
- 재계산 비용을 줄이며 시스템 압박시 자동으로 항목 제거
- 자동 메모리 관리
- Thread-safe
- 다중 스레드 환경에서 lock 없이 안전하게 접근/수정 가능
- GCD와 잘 맞음
- 키 복사 안함
- NSMutableDictionary와 달리 key 객체를 복사하지 않아 메모리 효율적.
- NSString이나 AnyObject로 키사용
Dictionary#
FileManager#
UserDefault#
CoreData#
SwiftData#
URLCache#
King fisher (3rd Party)#
SDWebImage (3rd Party)#
캐시 메모리 캐싱 vs 메모리 캐싱 vs 디스크 캐싱#
빠름
│
┌─────────────▼─────────────┐
│ CPU 캐시 메모리 캐싱 │ ← CPU가 RAM 데이터 캐싱
│ (L1 / L2 / L3) │
└─────────────┬─────────────┘
│
┌─────────────▼─────────────┐
│ 메모리 캐싱 │ ← RAM에 저장장치 데이터 캐싱
│ (NSCache, 이미지 캐시) │
└─────────────┬─────────────┘
│
┌─────────────▼─────────────┐
│ 디스크 캐싱 │ ← 저장장치에 네트워크 데이터 캐싱
│ (URLCache, 파일 캐시) │
└─────────────┴─────────────┘
│
느림
GitHub Comments