본문 바로가기
Apple/Apple_Foundation

URLCache

by LeviiOS 2024. 7. 1.
반응형

URL Cache는 네트워크 요청에 대한 응답 데이터를 캐시하여, 동일한 요청에 대해 더 빠르고 효율적으로 응답을 제공하는 메커니즘입니다. URL Cache를 통해 네트워크 트래픽을 줄이고, 응답 시간을 단축하며, 앱의 성능을 향상시킬 수 있습니다.

 

URL Cache의 주요 기능

 

1. 캐싱 정책:

URL Cache는 HTTP 응답 헤더에서 제공하는 캐싱 지침을 따릅니다. 이러한 지침은 서버가 클라이언트에게 응답을 캐시할지 여부와 캐시 기간을 알리는 방법입니다.

대표적인 헤더:

Cache-Control: 캐시 동작을 제어하는 가장 일반적인 헤더. 예: no-cache, max-age, public, private.

Expires: 응답이 만료되는 날짜와 시간을 지정합니다.

ETag: 응답의 고유 식별자. 변경 여부를 확인하는 데 사용됩니다.

Last-Modified: 마지막으로 수정된 날짜와 시간을 나타냅니다.

2. 캐싱 전략:

메모리 캐시: 메모리에 데이터를 저장하여 빠르게 접근할 수 있게 합니다. 앱이 종료되면 캐시가 사라집니다.

디스크 캐시: 디스크에 데이터를 저장하여 앱이 종료된 후에도 캐시를 유지합니다.

3. 캐시 조회:

동일한 URL 요청 시, 캐시된 데이터가 유효하면 네트워크 요청을 생략하고 캐시된 데이터를 반환합니다.

캐시된 데이터가 유효하지 않거나 만료된 경우, 네트워크 요청을 수행하여 데이터를 갱신하고 캐시를 업데이트합니다.

 

URL Cache 설정

URLSession에서 캐시를 설정할 때 URLCache 객체를 사용합니다.

import Foundation

// URLCache 설정 (메모리: 4MB, 디스크: 20MB)
let memoryCapacity = 4 * 1024 * 1024 // 4MB
let diskCapacity = 20 * 1024 * 1024 // 20MB
let urlCache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myCache")

// URLSessionConfiguration 설정
let configuration = URLSessionConfiguration.default
configuration.urlCache = urlCache
configuration.requestCachePolicy = .useProtocolCachePolicy

// URLSession 생성
let session = URLSession(configuration: configuration)

// URL 요청
if let url = URL(string: "https://www.example.com") {
    let request = URLRequest(url: url)
    
    // 데이터 태스크 생성 및 시작
    let task = session.dataTask(with: request) { data, response, error in
        if let error = error {
            print("Error: \(error.localizedDescription)")
            return
        }
        
        if let httpResponse = response as? HTTPURLResponse {
            if httpResponse.statusCode == 200 {
                // 캐시된 응답 처리
                print("Data received and cached")
            } else {
                print("HTTP Error: \(httpResponse.statusCode)")
            }
        }
    }
    
    task.resume()
}

 

캐시 정책 설정

URL 요청 시 캐시 정책을 지정하여 캐시 동작을 제어할 수 있습니다.

.useProtocolCachePolicy: 서버의 캐시 관련 헤더를 따릅니다.

.reloadIgnoringLocalCacheData: 캐시를 무시하고 항상 네트워크에서 데이터를 가져옵니다.

.returnCacheDataElseLoad: 캐시된 데이터가 있으면 이를 사용하고, 없으면 네트워크 요청을 수행합니다.

.returnCacheDataDontLoad: 캐시된 데이터가 있으면 이를 사용하고, 없으면 실패합니다.

 

let request = URLRequest(url: url, cachePolicy: .returnCacheDataElseLoad, timeoutInterval: 60.0)

 

캐시 무효화 및 제거

캐시를 수동으로 무효화하거나 제거할 수 있습니다.

// 특정 URL 요청의 캐시 무효화
if let cachedResponse = urlCache.cachedResponse(for: request) {
    urlCache.removeCachedResponse(for: request)
}

// 모든 캐시 데이터 제거
urlCache.removeAllCachedResponses()

 

URL Cache의 장점

1. 성능 향상: 캐시된 데이터를 사용하여 네트워크 요청 수와 대기 시간을 줄여 성능을 향상시킵니다.

2. 네트워크 트래픽 감소: 동일한 데이터를 여러 번 요청하지 않아 네트워크 트래픽을 줄입니다.

3. 오프라인 지원: 캐시된 데이터를 사용하여 네트워크 연결이 없을 때도 일정 부분의 기능을 제공할 수 있습니다.

반응형