본문 바로가기

iOS

iOS 데이터 저장 방식 알아보기 - SwiftData

반응형

안녕하세요!

데이터 저장방식의 마지막! SwiftData를 알아보도록 하겠습니다 :)

 

이외 다른 저장 방식에 대한 글을 보고싶으시다면 아래 링크를 참고해 주세요!

iOS 데이터 저장 방식 알아보기 - 개념편

iOS 데이터 저장 방식 알아보기 - UserDefaults

iOS 데이터 저장 방식 알아보기 - File System

iOS 데이터 저장 방식 알아보기 - Core Data


SwiftData란?

SwiftData는 Apple이 제공하는 최신 데이터 저장 프레임워크로, 기존의 Core Data보다 간단하고 직관적으로 데이터를 관리할 수 있습니다.
SwiftData는 SwiftUI와 완벽히 통합되었으며, 데이터 스키마 정의와 변경 사항 추적 같은 작업을 더욱 쉽게 처리할 수 있습니다.

Core Data의 입증된 지속성 기술과 Swift의 최신 동시성 기능을 결합하여, SwiftData는 최소한의 코드로 안전하고 효율적인 데이터 관리를 구현합니다.

 

🤔 SwiftData를 사용하면 좋은 데이터는 어떤 게 있을까?

  • 사용자 데이터의 영구 저장: 할 일 목록, 레시피 관리, 개인 설정.
  • 관계형 데이터 관리: 레시피 태그, 사용자 간 연결.
  • 캐시 및 임시 데이터 저장: 서버 데이터 캐싱 및 제한적인 오프라인 기능.
  • 대량 데이터 관리: 텍스트 편집기, 비디오 편집기 등.

SwiftData의 주요 특징

  1. Swift 코드로 데이터 스키마 정의
    • @Model()과 같은 매크로를 사용해 Swift 코드만으로 데이터 스키마를 정의할 수 있습니다.
    • 외부 파일이나 복잡한 설정이 필요하지 않습니다.
  2. 관계(Relationship) 자동 관리
    • 모델 간의 관계를 자동으로 관리하며, 관계 속성의 삭제 규칙도 쉽게 설정할 수 있습니다.
  3. 변경 사항 자동 추적
    • 모델 클래스는 Observable 프로토콜을 따르기 때문에 변경 사항을 자동으로 추적합니다.
  4. 간단한 영구 저장(Persistence)
    • 기본적으로 모든 비계산 속성을 저장하며, 저장되지 않아야 할 속성은 @Transient() 매크로를 사용해 제외할 수 있습니다.
  5. SwiftUI와의 강력한 통합
    • modelContainer와 같은 뷰 수정자를 사용해 쉽게 모델을 설정하고, 데이터를 뷰에 반영할 수 있습니다.
  6. 유연한 저장소 옵션
    • 메모리 저장, 읽기 전용, 특정 App Group 또는 CloudKit 컨테이너와의 연동 등 다양한 옵션을 지원합니다.

SwiftData 기본 사용 방법

1.  모델 정의

  • 데이터 저장 구조를 정의합니다.
  • 모델 클래스는 @Model 매크로로 선언하여 SwiftData가 이를 관리하도록 합니다.
import SwiftData

@Model
class Trip {
    var destination: String
    var startDate: Date
    var endDate: Date

    init(destination: String, startDate: Date, endDate: Date) {
        self.destination = destination
        self.startDate = startDate
        self.endDate = endDate
    }
}

 

2.  ModelContainer 설정

  • 앱에서 사용될 데이터 모델들을 등록하고 관리하는 컨테이너를 만듭니다.
  • modelContainer(for:)를 통해 필요한 모델 클래스를 등록합니다.
import SwiftUI

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .modelContainer(for: [Trip()])
        }
    }
}

 

3.  모델 인스턴스를 ModelContext에 삽입

  • @Environment(\modelContext)를 통해 모델 콘텍스트를 가져옵니다.
  • 새로 생성한 모델 인스턴스를 콘텍스트에 삽입합니다.
  • 콘텍스트는 데이터 변경 사항을 추적하고 영구 저장을 처리합니다.
import SwiftUI

struct ContentView: View {
    @Environment(\modelContext) private var modelContext
    @Query private var trips: [Trip]

    var body: some View {
        VStack {
            List(trips) { trip in
                Text(trip.destination)
            }

            Button("Add Trip") {
                let newTrip = Trip(destination: "Paris", startDate: Date(), endDate: Date().addingTimeInterval(86400 * 7))
                modelContext.insert(newTrip)
            }
        }
    }
}

 


SwiftData 활용 팁

속성의 저장 방지

  • 임시 데이터를 저장하지 않으려면 @Transient() 매크로를 사용합니다.
@Model
class Weather {
    var temperature: Double
    @Transient var isSunny: Bool
}

 

삭제 규칙 설정

  • 관계 속성의 삭제 규칙을 지정하려면 @Relationship 매크로를 사용합니다.
@Model
class Trip {
    var accommodations: [Accommodation]

    @Relationship(deleteRule: .cascade)
    var accommodations: [Accommodation]
}

 

테스트를 위한 메모리 저장소

  • 테스트 시 데이터가 디스크에 저장되지 않도록 메모리 저장소를 설정할 수 있습니다.
.modelContainer(for: [Trip()], inMemory: true)

 


SwiftData와 Core Data 중 뭘 써야할까?

항목 SwiftData Core Data
지원 OS iOS 17 이상에서만 사용 가능 iOS 16 이하를 포함한 모든 iOS 버전에서 사용 가능
개발 속도 빠르고 간단하며, Core Data 대비 약 10분의 1의 시간으로 앱 개발 가능 복잡하며 모델 파일, 설정 등이 필요해 상대적으로 많은 시간 소요
간단한 데이터 관리 적합
기본적인 데이터 저장 및 관리 작업에 적합
가능하지만 설정이 복잡해 SwiftData보다 불편
복잡한 데이터 관리 제한적
고급 기능(예: NSFetchedResultsController)이나 세밀한 제어가 필요하면 부적합
적합
복잡한 관계형 데이터 및 대규모 데이터 관리에 강력한 기능 제공
문서 및 커뮤니티 지원 부족
새로운 기술로 자료와 커뮤니티 지원이 제한적
풍부
오래된 기술로 Apple 문서와 Stack Overflow 등에서 자료와 질문 답변을 쉽게 찾을 수 있음
Apple 기술 방향성 최신 기술
Swift 및 SwiftUI와 함께 새로운 Cocoa의 핵심 구성 요소로 자리 잡음
오래된 기술
향후 SwiftData로 대체될 가능성이 있음
기존 프로젝트와의 호환성 Core Data와 동일한 데이터를 처리하므로, SwiftData → Core Data로 쉽게 전환 가능 별도로 SwiftData를 통합하려면 추가 작업이 필요
클라우드 기반 데이터 관리 부적합. CloudKit 같은 서비스에만 데이터를 저장하는 경우 적합하지 않음 가능
로컬 및 클라우드 기반 데이터 관리 모두 지원
커뮤니티 성장 가능성 높음
Swift, SwiftUI와 함께 지속적으로 확장될 가능성이 큼
안정적
하지만 새로운 기능 도입보다는 유지 보수 위주로 발전

SwiftData가 적합하지 않은 경우

  1. iOS 16 이하 지원이 필요한 경우
    • SwiftData는 iOS 17 이상에서만 동작합니다.
  2. 클라우드 기반 데이터만 사용하는 경우
    • CloudKit 같은 서비스에만 데이터를 저장할 경우 SwiftData는 필요하지 않습니다.
  3. Core Data의 고급 기능이 필요한 경우
    • NSFetchedResultsController와 같은 고급 기능이 필요한 경우, SwiftData는 적합하지 않을 수 있습니다.

SwiftData의 한계와 보완점

  1. 문서화 부족:
    새로운 기술로, 공식 문서나 커뮤니티 자료가 부족합니다.
  2. 제한된 기능:
    고급 쿼리, 대규모 데이터 최적화 등은 Core Data가 더 적합할 수 있습니다.

 

 


예시 프로젝트

간단한 ToDoApp을 만들어보았습니다!

코드 구조가 궁금하시다면 참고해주세요!! :)

 

ToDoApp

 

반응형