[swift] PromiseKit를 활용한 데이터 캐싱과 캐시 만료 처리

앱 개발 시 데이터의 캐싱과 캐시 만료 처리는 중요한 요소입니다. 앱의 성능을 향상시키고 사용자 경험을 개선하기 위해 캐싱은 필수적입니다. PromiseKit는 비동기 작업을 처리하고 캐싱을 구현하는 데 사용할 수 있는 유용한 라이브러리입니다. 이번 글에서는 PromiseKit를 사용하여 데이터 캐싱과 캐시 만료 처리를 구현하는 방법을 알아보겠습니다.

PromiseKit 소개

PromiseKit은 비동기 작업을 처리하기 위한 프로미스(Promise) 패턴을 구현한 라이브러리입니다. 프로미스 패턴은 비동기 작업의 성공 또는 실패를 처리하기 위한 일련의 체이닝 메서드를 제공하여 코드의 가독성과 유지 보수성을 높여줍니다.

데이터 캐싱 구현하기

  1. cache라는 변수를 생성하여 데이터를 저장할 캐시 객체를 만듭니다.
  2. 데이터를 요청하는 비동기 작업을 Promise로 래핑합니다.
  3. 데이터를 요청하기 전에 캐시에 데이터가 있는지 확인합니다.
  4. 캐시에 데이터가 있으면 해당 데이터를 반환합니다.
  5. 캐시에 데이터가 없으면 비동기 작업을 수행하여 데이터를 가져옵니다.
  6. 가져온 데이터를 캐시에 저장하고 반환합니다.
import PromiseKit

class DataManager {
    private var cache: [String: Any] = [:]
    
    func fetchDataFromCacheOrAPI() -> Promise<Any> {
        let key = "data"
        
        if let cachedData = cache[key] {
            return .value(cachedData)
        }
        
        return fetchDataFromAPI().then { data in
            self.cache[key] = data
            return .value(data)
        }
    }
    
    func fetchDataFromAPI() -> Promise<Any> {
        return Promise<Any> { seal in
            // API 요청 수행
            // ...
            
            if let data = responseData {
                seal.fulfill(data)
            } else {
                seal.reject(MyError.APIError)
            }
        }
    }
}

캐시 만료 처리하기

  1. expiryDate를 추가하여 데이터의 만료일을 저장하는 변수를 설정합니다.
  2. 데이터를 요청하는 시점에 만료일을 확인합니다.
  3. 데이터의 만료일이 지났으면 캐시에서 데이터를 제거하고 비동기 작업을 수행하여 새 데이터를 가져옵니다.
  4. 가져온 데이터를 캐시에 저장하고 반환합니다.
import PromiseKit

class DataManager {
    private var cache: [String: Any] = [:]
    private var expiryDate: [String: Date] = [:]
    
    func fetchDataFromCacheOrAPI() -> Promise<Any> {
        let key = "data"
        
        if let cachedData = cache[key], let expiry = expiryDate[key], expiry > Date() {
            return .value(cachedData)
        }
        
        return fetchDataFromAPI().then { data in
            self.cache[key] = data
            self.expiryDate[key] = Date().addingTimeInterval(3600) // 1시간 후에 만료
            return .value(data)
        }
    }
    
    func fetchDataFromAPI() -> Promise<Any> {
        return Promise<Any> { seal in
            // API 요청 수행
            // ...
            
            if let data = responseData {
                seal.fulfill(data)
            } else {
                seal.reject(MyError.APIError)
            }
        }
    }
}

결론

PromiseKit을 사용하면 데이터 캐싱과 캐시 만료 처리를 손쉽게 구현할 수 있습니다. 캐싱을 통해 앱의 성능을 향상시키고 사용자 경험을 개선할 수 있습니다. PromiseKit의 강력한 기능과 유연성을 활용하여 안정적이고 효율적인 앱을 개발해보세요.

참고: