SwiftUI 오프라인 데이터 처리: 로컬 저장소 사용

작성일 :

SwiftUI 오프라인 데이터 처리: 로컬 저장소 사용

SwiftUI는 Apple 생태계에서 가장 최신의 사용자 인터페이스 프레임워크로, iOS, macOS, tvOS 및 watchOS에서 일관된 사용자 경험을 제공합니다. 이런 강력한 도구를 사용하여 우리는 데이터를 온라인뿐만 아니라 오프라인에서도 효과적으로 관리할 수 있습니다. 여기서는 SwiftUI에서 로컬 저장소를 사용하여 데이터를 저장하고 처리하는 방법에 대해 설명하겠습니다.

로컬 저장소의 필요성

현대 모바일 애플리케이션은 대부분 네트워크 연결을 기반으로 합니다. 하지만 항상 안정적인 연결을 기대할 수 없으며, 데이터 종종 오프라인 환경에서도 접근해야 할 필요가 있습니다. 이를 위해 로컬 저장소를 사용합니다. 로컬 저장소의 도움이 되는 주요 시나리오는 다음과 같습니다:

  1. 인터넷 연결이 없는 경우: 사용자가 데이터를 여전히 접근 및 업데이트할 수 있어야 합니다.
  2. 데이터 캐싱: 서버로부터 자주 요청되는 데이터를 캐싱하여 사용자 경험을 개선합니다.
  3. 데이터 백업: 중요한 데이터를 로컬에 백업하여 데이터 손실을 방지합니다.

SwiftUI에서 로컬 저장소 옵션

SwiftUI에서 사용할 수 있는 로컬 저장소 옵션에는 여러 가지가 있습니다. 가장 널리 사용되는 방법은 다음과 같습니다:

  1. UserDefaults: 간단하고 가벼운 데이터 저장에 적합합니다.
  2. 파일 시스템: 파일을 직접 읽고 쓸 수 있습니다. 예를 들어, .txt 파일이나 .json 파일 등을 사용할 수 있습니다.
  3. CoreData: 더욱 복잡하고 구조화된 데이터를 관리하는 데 적합합니다.
  4. SQLite: CoreData에 비해 더 직접적으로 데이터베이스를 관리합니다.

이렇게 많은 옵션이 있지만, 여기서는 UserDefaults와 CoreData를 중심으로 살펴보겠습니다.

UserDefaults 사용하기

UserDefaults는 애플리케이션의 설정값을 저장하는 데 주로 사용되지만, 어느 정도의 단순한 데이터를 저장하는 데에도 사용할 수 있습니다. 다음은 UserDefaults를 통해 데이터를 저장하고 로드하는 방법입니다:

swift
import SwiftUI

struct ContentView: View {
    @State private var name: String = UserDefaults.standard.string(forKey: "name") ?? ""
    @State private var age: Int = UserDefaults.standard.integer(forKey: "age")

    var body: some View {
        VStack {
            TextField("이름", text: $name)
                .padding().onDisappear {
                    UserDefaults.standard.set(self.name, forKey: "name")
                }

            TextField("나이", value: $age, formatter: NumberFormatter())
                .padding().onDisappear {
                    UserDefaults.standard.set(self.age, forKey: "age")
                }        
        }
        .padding().onAppear {
            self.name = UserDefaults.standard.string(forKey: "name") ?? ""
            self.age = UserDefaults.standard.integer(forKey: "age")
        }
    }
}

위 코드는 사용자 이름과 나이를 UserDefaults에 저장하고 애플리케이션이 실행될 때 해당 값을 불러오는 간단한 예제입니다.

CoreData 사용하기

CoreData는 더 복잡한 데이터 모델을 필요로 하는 경우에 유용합니다. SwiftUI에서 CoreData를 사용하는 방법은 다음과 같습니다.

CoreData 설정

  1. 프로젝트 설정: Xcode에서 새로운 프로젝트를 생성할 때 Use Core Data 옵션을 선택합니다.
  2. 데이터 모델 작성: .xcdatamodeld 파일을 열어 데이터 모델을 작성합니다.

CoreData 엔티티와 속성 추가

다음 예제에서는 Person이라는 엔티티를 생성하고, 이 엔티티에 nameage 속성을 추가해 보겠습니다.

SwiftUI와 CoreData 연동하기

다음으로, CoreData를 SwiftUI와 연동하여 데이터를 저장하고 불러오는 방법을 살펴보겠습니다.

swift
import SwiftUI
import CoreData

struct ContentView: View {
    @Environment(\.managedObjectContext) private var viewContext
    @FetchRequest(
        entity: Person.entity(),
        sortDescriptors: [NSSortDescriptor(keyPath: \Person.name, ascending: true)]
    ) var people: FetchedResults<Person>

    @State private var name: String = ""
    @State private var age: String = ""

    var body: some View {
        VStack {
            TextField("이름", text: $name).padding()

            TextField("나이", text: $age).keyboardType(.numberPad).padding()

            Button(action: addPerson) {
                Text("추가")
            }.padding()

            List {
                ForEach(people) { person in
                    VStack(alignment: .leading) {
                        Text(person.name ?? "이름 없음")
                        Text("나이: \(person.age)")
                    }
                }
            }
        }
        .padding()
    }

    private func addPerson() {
        withAnimation {
            let newPerson = Person(context: viewContext)
            newPerson.name = name
            newPerson.age = Int16(age) ?? 0

            do {
                try viewContext.save()
            } catch {
                let nsError = error as NSError
                fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
            }
        }
    }
}

extension Person : Identifiable { }

주요 포인트

  1. @Environment(\.managedObjectContext)를 사용하여 CoreData의 관리 객체 컨텍스트를 가져옵니다.
  2. @FetchRequest 프로퍼티 랩퍼를 사용하여 특정 엔티티를 불러옵니다.
  3. 데이터를 추가하는 addPerson 함수를 정의하고, 이를 버튼에 연결하여 사용자가 데이터를 입력하고 추가하도록 합니다.

결론

SwiftUI에서 오프라인 데이터 처리는 사용자의 경험을 크게 향상시킬 수 있으며, UserDefaults와 CoreData는 이를 위한 주요 도구입니다. UserDefaults는 간단한 데이터 저장에, CoreData는 복잡한 데이터 모델과 관계를 관리하는 데 유용합니다. 이를 활용하여 애플리케이션이 오프라인 상태에서도 원활히 작동하도록 할 수 있습니다.