[swift] Swift MVVM 아키텍처에서의 캐시 및 로컬 저장소 관리 방법

MVVM (Model-View-ViewModel) 아키텍처는 Swift 앱 개발에서 많이 사용되는 패턴 중 하나입니다. 이 아키텍처는 앱의 데이터 흐름을 쉽게 관리하고 코드의 재사용성과 유지보수성을 높일 수 있습니다. MVVM 아키텍처에서는 모델, 뷰, 뷰모델이 각각 역할을 담당하며, 이 중에서 모델은 데이터를 나타내고, 뷰는 사용자 인터페이스를 나타내며, 뷰모델은 뷰와 모델 사이의 통신을 관리합니다.

캐시 및 로컬 저장소는 여러 가지 목적으로 사용될 수 있습니다. 예를 들어, 네트워크 요청으로부터 데이터를 캐싱하여 앱의 성능을 향상시킬 수 있습니다. 또는 앱이 오프라인 상태일 때 로컬 저장소에 저장된 데이터를 사용하여 사용자 경험을 향상시킬 수도 있습니다. 따라서 MVVM 아키텍처에서는 캐시 및 로컬 저장소를 효율적으로 관리해야 합니다.

캐시 관리

캐시는 네트워크 요청 결과를 저장하는 용도로 사용될 수 있습니다. MVVM 아키텍처에서는 보통 뷰모델이 캐시를 관리하며, 데이터를 요청하기 전에 캐시에서 데이터를 확인하고, 캐시에 존재하지 않을 경우에만 네트워크 요청을 수행합니다.

캐시를 관리하기 위해 NSCache 클래스를 활용할 수 있습니다. 이 클래스를 사용하면 자동으로 메모리 관리를 처리하고 키-값 쌍으로 데이터를 저장할 수 있습니다. 뷰모델 내부에서 NSCache 인스턴스를 생성하고, 데이터를 요청할 때마다 해당 데이터가 캐시에 있는지 확인한 뒤 필요한 경우 캐시에 저장하면 됩니다.

let cache = NSCache<NSString, AnyObject>()

func fetchData(completion: @escaping (Data?) -> Void) {
    if let cachedData = cache.object(forKey: "data") as? Data {
        completion(cachedData)
    } else {
        // 네트워크 요청 코드
        // ...
        // 요청 결과를 캐시에 저장
        cache.setObject(data as AnyObject, forKey: "data")
        completion(data)
    }
}

위의 예시에서는 fetchData 메서드에서 먼저 캐시에서 데이터를 확인한 후, 캐시에 데이터가 존재하지 않을 경우에만 네트워크 요청을 수행합니다. 네트워크 요청 결과를 받아서 캐시에 저장한 뒤, 완료 핸들러를 호출하여 데이터를 반환합니다.

로컬 저장소 관리

로컬 저장소는 앱 내부에 데이터를 영구적으로 저장하기 위해 사용될 수 있습니다. MVVM 아키텍처에서는 모델이 로컬 저장소에 접근하고 관리하는 일을 담당합니다.

로컬 저장소를 다루기 위해 Swift는 여러 가지 방법을 제공합니다. 예를 들어, 간단한 데이터는 UserDefaults를 사용하여 저장할 수 있고, 복잡한 데이터 구조는 Core DataRealm 등의 데이터베이스를 활용할 수 있습니다. 이러한 방법들은 개발자가 선택한 데이터 구조와 요구사항에 따라 다르게 사용될 수 있습니다.

아래는 UserDefaults를 사용하여 데이터를 로컬 저장소에 저장하는 예시입니다.

struct User {
    let name: String
    let age: Int

    static var currentUser: User? {
        get {
            let defaults = UserDefaults.standard
            if let name = defaults.string(forKey: "name"),
               let age = defaults.integer(forKey: "age") {
                return User(name: name, age: age)
            }
            return nil
        }
        set {
            let defaults = UserDefaults.standard
            defaults.set(newValue?.name, forKey: "name")
            defaults.set(newValue?.age, forKey: "age")
        }
    }
}

위의 예시에서는 User 구조체에 currentUser라는 정적 변수를 추가했습니다. currentUser 변수를 통해 현재 사용자를 저장하고 가져올 수 있습니다. 이를 위해 UserDefaults 클래스를 사용하여 데이터를 읽고 쓸 수 있습니다.

결론

MVVM 아키텍처에서는 캐시 및 로컬 저장소를 효율적으로 관리하여 앱의 성능을 향상시키고 사용자 경험을 개선할 수 있습니다. 캐시는 네트워크 요청 결과를 저장하고 뷰모델에서 관리하며, 로컬 저장소는 모델에서 관리하는 것이 일반적입니다. 위에서 제시한 예시 코드를 참고하여 적절한 방법으로 캐시 및 로컬 저장소를 구현해보세요.

참고 자료