Skip to content

Release Version 1.0.0

Choose a tag to compare

@junil1030 junil1030 released this 19 Dec 01:53
· 11 commits to main since this release

CachingKit v1.0.0

고성능 이미지 캐싱을 위한 Swift Package 라이브러리 첫 번째 릴리스입니다.

✨ 주요 기능

2단계 하이브리드 캐싱

  • 메모리 캐시: NSCache 기반 초고속 메모리 캐싱
  • 디스크 캐시: FileManager 기반 영구 저장
  • 메모리 부족 시 자동 캐시 정리

지능형 캐시 관리

  • LRU+LFU 하이브리드 제거 정책: 최근 사용(70%) + 사용 빈도(30%) 가중치 기반
  • ETag 기반 HTTP 재검증: 304 Not Modified로 불필요한 다운로드 방지
  • TTL(Time To Live): 만료 시간 기반 자동 캐시 무효화 (기본 7일)

메모리 최적화

  • 이미지 다운샘플링: CGImageSource를 이용한 효율적 리사이징
  • 메모리 워닝 감지 및 자동 정리
  • 물리 메모리의 25% 이내 자동 제한 (최대 150MB)

유연한 저장소 설정

// 기본 캐시 디렉토리
StoragePathProvider.default

// App Groups (위젯, 익스텐션과 공유)
StoragePathProvider.appGroups(identifier: "group.com.yourapp.shared")

// 커스텀 경로
StoragePathProvider.custom(url: customURL)

UIImageView Extension

imageView.ck_setImage(
    with: url,
    placeholder: placeholderImage,
    targetSize: CGSize(width: 300, height: 300),
    cacheStrategy: .both
)

📦 설치 방법

Swift Package Manager

Package.swift
dependencies: [
    .package(url: "https://github.com/yourusername/CachingKit.git", from: "1.0.0")
]

Xcode
1. File → Add Package Dependencies
2. Repository URL 입력
3. Version: 1.0.0 선택

🚀 빠른 시작

기본 사용

import CachingKit

// 기본 설정으로 사용
let image = await CachingKit.shared.loadImage(
    url: imageURL,
    targetSize: CGSize(width: 300, height: 300)
)

커스텀 설정

let config = CacheConfiguration(
    storageProvider: .appGroups(identifier: "group.com.yourapp.shared"),
    memoryLimit: 100 * 1024 * 1024,  // 100MB
    diskLimit: 200 * 1024 * 1024,     // 200MB
    ttl: 3 * 24 * 60 * 60              // 3일
)

let cachingKit = CachingKit(configuration: config)

let image = await cachingKit.loadImage(
    url: imageURL,
    targetSize: CGSize(width: 300, height: 300),
    cacheStrategy: .both  // .memoryOnly, .diskOnly, .both
)

UIImageView Extension

import CachingKit

imageView.ck_setImage(
    with: imageURL,
    placeholder: UIImage(named: "placeholder"),
    targetSize: imageView.bounds.size
)

// 이미지 로딩 취소
imageView.ck_cancelImageLoad()

캐시 통계

if let stats = await CachingKit.shared.getStatistics() {
    print("메모리 히트율: \(stats.memoryHitRate)")
    print("디스크 히트율: \(stats.diskHitRate)")
    print("ETag 히트율: \(stats.etagHitRate)")
    print("다운로드 횟수: \(stats.totalDownloads)")
    print("절약한 바이트: \(stats.totalBytesSaved)")
}

캐시 정리

// 메모리 캐시만 정리
CachingKit.shared.clearMemoryCache()

// 디스크 캐시만 정리
CachingKit.shared.clearDiskCache()

// 전체 캐시 정리
CachingKit.shared.clearAll()

🏗️ 아키텍처

Actor 기반 동시성

- 모든 캐시 작업은 Actor로 보호되어 스레드 안전 보장
- Swift Concurrency (async/await) 전면 지원

계층 구조

CachingKit (Public API)
    ↓
CacheManager (Actor)
    ↓
┌─────────────┬─────────────┐
MemoryCache   DiskCache    NetworkLoader
  (Actor)      (Actor)        (Actor)

📊 기술 사양

- 언어: Swift 5.9+
- 최소 버전: iOS 17.0 / macOS 14.0 / tvOS 17.0 / watchOS 10.0
- 동시성: Swift Concurrency (Actor 기반)
- 의존성: 없음 (Foundation, UIKit만 사용)

🎯 성능 특징

- 중복 요청 방지: 동일 URL 동시 요청 시 하나의 네트워크 호출만 실행
- 자동 리사이징: targetSize 기반 자동 다운샘플링으로 메모리 절약
- 점진적 로딩: 메모리 → 디스크 → 네트워크 순서로 폴백
- ETag 재검증: 304 응답으로 대역폭 절약

📝 전체 변경사항

Core

- ✨ CachingKit 메인 API 클래스
- ✨ CacheManager Actor (메모리/디스크 조율)
- ✨ CacheConfiguration (설정 관리)
- ✨ CacheMetadata (메타데이터 + 통계)
- ✨ CacheStrategy enum (캐싱 전략)
- ✨ CachingKitError (에러 타입)

Disk

- ✨ DiskCacheActor (디스크 캐시)
- ✨ DoublyLinkedList (LRU+LFU 알고리즘)
- ✨ StoragePathProvider (경로 추상화)

Memory

- ✨ MemoryCacheActor (메모리 캐시)

Network

- ✨ NetworkLoader (ETag 재검증)

Resize

- ✨ ImageResizer (다운샘플링)

Extensions

- ✨ UIImageView+CachingKit (편의 메서드)

Utils

- ✨ CacheStatistics (통계)
- ✨ String+Hash (SHA256)

🔗 링크

- 📖 https://github.com/yourusername/CachingKit/blob/main/README.md
- 📦 https://github.com/yourusername/CachingKit/blob/main/Package.swift
- 🐛 https://github.com/yourusername/CachingKit/issues

---
Full Changelog: https://github.com/yourusername/CachingKit/commits/v1.0.0