[swift] Swift DeepDiff를 활용하여 서버로부터 받은 데이터 필터링하기

많은 경우 웹 서비스나 앱에서 서버로부터 받은 데이터를 다양한 방법으로 필터링해야 할 때가 있습니다. 이 때 DeepDiff 라이브러리를 사용하면 간편하게 변경 사항을 탐지하고 필터링 할 수 있습니다.

DeepDiff란?

DeepDiff는 Swift에서 사용할 수 있는 패키지로서 컬렉션이나 객체의 변경 사항을 탐지합니다. 이 라이브러리는 이전과 현재의 데이터 집합을 비교하여 추가, 삭제 및 변경된 요소를 식별할 수 있습니다.

DeepDiff 사용법

먼저 DeepDiff 라이브러리를 프로젝트에 추가해야 합니다. DeepDiff GitHub에서 패키지를 다운로드하거나 CocoaPods 등의 패키지 매니저를 활용하여 설치할 수 있습니다.

import DeepDiff

...

let oldData = [1, 2, 3, 4, 5]
let newData = [3, 4, 5, 6, 7]

let changes = diff(old: oldData, new: newData)

두 개의 배열을 비교하고 diff 함수를 사용하여 변경된 결과를 얻을 수 있습니다. 이를 통해 changes 변수에는 이전 데이터와 현재 데이터 간의 변경 사항이 담겨집니다.

필터링 예제

이제 실제로 서버로부터 받은 데이터를 필터링하는 예제를 살펴보겠습니다.

import DeepDiff

struct Product: Hashable {
    let id: Int
    let name: String
}

let oldProducts = [Product(id: 1, name: "Apple"), Product(id: 2, name: "Banana"), Product(id: 3, name: "Orange")]
let newProducts = [Product(id: 1, name: "Apple"), Product(id: 3, name: "New Orange"), Product(id: 4, name: "Grapes")]

let changes = diff(old: oldProducts, new: newProducts)

for change in changes {
    switch change {
    case .insert(let insertIndexes):
        for index in insertIndexes {
            let product = newProducts[index]
            print("추가된 제품: \(product.name)")
        }
        
    case .delete(let deleteIndexes):
        for index in deleteIndexes {
            let product = oldProducts[index]
            print("삭제된 제품: \(product.name)")
        }
        
    case .replace(_, let deleteIndexes, let insertIndexes):
        for deleteIndex in deleteIndexes {
            let deletedProduct = oldProducts[deleteIndex]
            print("삭제된 제품: \(deletedProduct.name)")
        }
        
        for insertIndex in insertIndexes {
            let insertedProduct = newProducts[insertIndex]
            print("추가된 제품: \(insertedProduct.name)")
        }
    }
}

위의 예제에서는 Product 구조체를 사용하여 제품들을 비교하고 변경된 제품들을 필터링합니다. 변경된 제품들을 추가 또는 삭제 여부에 따라 다른 로직을 수행할 수 있습니다.

DeepDiff 라이브러리를 사용하면 서버로부터 받은 데이터의 변경 사항을 탐지하고 필터링할 수 있습니다. 이렇게 함으로써 앱이나 웹 서비스에서 동적으로 데이터를 처리하고 적용할 수 있게 됩니다.


참고문헌