UIImage 리사이징과 캐싱 전략: 이미지를 리사이징한 후 캐싱하여 빠르게 로드하는 방법.

작성일 :

UIImage 리사이징과 캐싱 전략: 이미지를 리사이징한 후 캐싱하여 빠르게 로드하는 방법

소개

이미지 처리는 앱 개발에서 중요한 부분을 차지합니다. 특히 UIImage와 같은 기본 클래스들이 주로 사용되며, 이 이미지를 최적화하는 방법은 사용자가 경험하는 로딩 속도와 앱의 성능에 큰 영향을 미칩니다. 이 글에서는 Swift 언어를 사용하여 UIImage를 리사이징하고 캐시를 사용하여 빠르게 로드하는 방법에 대해 다루겠습니다. 이를 통해 앱의 성능을 최적화하는 데 많은 도움이 될 것입니다.

UIImage 리사이징

이미지를 리사이징하는 것은 앱 성능에 중요한 역할을 합니다. 고해상도의 이미지를 그대로 사용하는 것은 메모리와 로딩 시간을 많이 소비하므로, 적절한 크기로 리사이징하는 것이 필요합니다.

리사이징 구현 방법

다음은 UIImage를 리사이징하는 기본적인 코드입니다:

swift
import UIKit

extension UIImage {
    func resized(to width: CGFloat) -> UIImage? {
        let height = CGFloat(ceil(width/size.width * size.height))
        let newSize = CGSize(width: width, height: height)
        let format = UIGraphicsImageRendererFormat()
        format.scale = 1
        let renderer = UIGraphicsImageRenderer(size: newSize, format: format)
        return renderer.image { _ in
            draw(in: CGRect(origin: .zero, size: newSize))
        }
    }
}

위 코드는 UIImage를 새롭게 크기를 조정하여 반환하는 코드를 보여줍니다. UIGraphicsImageRenderer를 사용하여 메모리 효율성을 높였습니다.

캐싱 전략

리사이징한 이미지를 캐시하면 다음 로딩 시간에 속도가 대폭 개선됩니다. 메모리 캐시와 디스크 캐시를 적절히 사용하여 성능을 향상시킬 수 있습니다.

메모리 캐시

메모리 캐시는 앱 실행 중에만 유지되는 캐시로, 빠른 접근이 가능하지만 앱이 종료되면 사라집니다. NSCache를 사용하여 쉽게 구현할 수 있습니다:

swift
import Foundation
import UIKit

class ImageCache {
    static let shared = NSCache<NSString, UIImage>()

    private init() {}
}

사용 예는 다음과 같습니다:

swift
let cacheKey = NSString(string: "image_key")
if let cachedImage = ImageCache.shared.object(forKey: cacheKey) {
    // 캐시된 이미지 사용
} else {
    // 새로운 이미지 로딩 및 캐시
    let resizedImage = originalImage.resized(to: 100)
    ImageCache.shared.setObject(resizedImage!, forKey: cacheKey)
}

디스크 캐시

디스크 캐시는 영구적으로 데이터를 저장할 수 있어 앱 재실행 후에도 데이터를 유지할 수 있습니다. 여기서는 FileManager를 사용하여 디스크 캐시를 구현해보겠습니다.

swift
import Foundation
import UIKit

class DiskCache {
    static let shared = DiskCache()

    private init() {}

    private func cacheDirectory() -> URL? {
        let paths = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)
        return paths.first?.appendingPathComponent("ImageCache")
    }

    func cacheImage(_ image: UIImage, forKey key: String) {
        guard let data = image.pngData(), let directory = cacheDirectory() else { return }
        let imageURL = directory.appendingPathComponent(key)
        do {
            try data.write(to: imageURL)
        } catch {
            print("Error caching image: \(error)")
        }
    }

    func getCachedImage(forKey key: String) -> UIImage? {
        guard let directory = cacheDirectory() else { return nil }
        let imageURL = directory.appendingPathComponent(key)
        guard let data = try? Data(contentsOf: imageURL) else { return nil }
        return UIImage(data: data)
    }
}

사용 예는 다음과 같습니다:

swift
let cacheKey = "image_key.png"
if let cachedImage = DiskCache.shared.getCachedImage(forKey: cacheKey) {
    // 디스크에 저장된 이미지 사용
} else {
    // 새로운 이미지 로딩 및 디스크에 저장
    let resizedImage = originalImage.resized(to: 100)
    DiskCache.shared.cacheImage(resizedImage!, forKey: cacheKey)
}

결론

UIImage 리사이징과 캐싱 전략은 앱의 성능을 크게 향상시킬 수 있는 중요한 기술입니다. 메모리 캐시와 디스크 캐시를 적절히 활용하여 이미지를 빠르게 로드하고, 메모리 사용량을 최적화하는 것이 핵심이라 할 수 있습니다. 이 글에서 소개한 기법들을 활용하여 더욱 쾌적한 사용자 경험을 제공하는 앱을 개발하시길 바랍니다.