Inflearn brand logo image

인프런 커뮤니티 질문&답변

leebs30919님의 프로필 이미지
leebs30919

작성한 질문수

Part1: 진짜 왕초보 iOS 배우기(SwiftUI, SwiftData, 2024)

우리 Todo앱에 SwiftData 적용하기

@Binding된 객체는 자동으로 저장이 되나요?

해결된 질문

작성

·

51

1

SwiftData를 사용해서 TodoList 앱을 만들어보는 중입니다. 강의를 듣기 전에 복습 차원에서 먼저 구현해봤는데, 예상과 다른 동작을 발견했습니다.

처음에는 데이터를 저장하기 위해 modelContext.save()를 명시적으로 호출해야 할 것이라고 생각했습니다. 그런데 실제로 코드를 작성하고 테스트해보니, .save() 메서드를 호출하지 않아도 데이터가 자동으로 저장되고 있었습니다. SwiftData에서 데이터가 자동으로 저장되는 특정한 시점이나 이벤트가 있나요?

import SwiftUI

struct TodoDetail: View {
    
    @Binding var todo: TodoList
    @Environment(\.modelContext) private var modelContext

    var body: some View {
        VStack {
            // placeHolder 작성
            
            TextField("할 일을 입력하세요", text: $todo.title)
                .font(.title2)
                .padding(10)
                .overlay(
                    RoundedRectangle(cornerRadius: 10)
                        .stroke(style: StrokeStyle(lineWidth: 1))
                )
        
            TextEditor(text: $todo.todoDesc)
                .padding(10)
                .overlay(
                    RoundedRectangle(cornerRadius: 10)
                        .stroke(style: StrokeStyle(lineWidth: 1))
                )
                
        }
        .padding()
        .navigationTitle("할 일을 작성하세요.")
        .toolbar{
            ToolbarItem{
                Button("저장") {
                    do {
                      // try modelContext.save()
                    }
                    catch {
                        print("Error Context Save: \(error)")
                    }
                    
                }
            }
        }
    }
}
/// 코드 셍략

 

답변 2

0

애구마(agmma)님의 프로필 이미지
애구마(agmma)
지식공유자

안녕하세요 leebs30919님
스위프트 데이터는 데이터의 변경, 삽입(context.insert()), 삭제(context.delete())등을 바로 처리하지 않고 메모리에 모아뒀다가
앱이 백그라운드로 가거나 컨텍스트의 사용을 끝났을때 수정사항을 한번에 디스크에 입력하게 됩니다.
하지만 만약에 앱이 백그라운드로 가기전에 디스크에 바로 수정사항을 기록하고 싶다면
그때 context.save()를 사용하시면 됩니다.

그래서 save를 하지 않아도 모델에 변경사항이 반영된것 처럼 보이는 것입니다!
참고할수있는 문서 남겨두겠습니다
https://developer.apple.com/documentation/swiftdata/modelcontext/save()

강의 들어주셔서 감사합니다~

0

안녕하세요, 인프런 AI 인턴입니다. leebs30919님.

SwiftData와 함께 사용하는 @Binding된 객체가 특정 시점에 자동으로 저장되는지 궁금하신 것 같습니다. SwiftUI에서 @Binding은 부모 뷰로부터 값을 전달받아 하위 뷰에서 조작할 수 있게 해주는 역할을 합니다. 하지만, SwiftData에서 데이터 저장과 관련하여 몇 가지 알아두시면 좋은 사항들이 있습니다.

  1. 자동 저장 기능: 일반적으로 SwiftUI에서 @State@Binding을 통해 데이터가 변경될 때 즉시 적용되도록 하는 켄트 방향의 데이터 흐름이 존재하지만, 실제 데이터 저장소인 SwiftData에서는 데이터가 변경되는 시점에 자동으로 저장되지 않습니다. 즉, modelContext.save()를 명시적으로 호출해야 데이터베이스에 변경 사항이 실제로 반영됩니다.

  2. 변경 추적과 저장: 어떤 시점에서든 @Binding으로 연결된 프로퍼티가 변경될 때 modelContext가 변경 사항을 감지하여 이를 저장할 수 있도록 해야 합니다. SwiftData에서는 이러한 변경 사항이 발생되면, 해당 시점에 context의 변경 사항이 반영되도록 설계해야 데이터 일관성이 유지됩니다.

  3. 명시적 저장 요청: SwiftData의 변경 내용을 반영시키기 위해 수동으로 저장 요청을 하도록 가이드라인을 따르는 것이 좋습니다. 코드 중 주석 처리된 부분처럼 modelContext.save()를 호출하는 것이 안전하며, 예기치 못한 동작을 방지할 수 있습니다.

따라서, 예상과 달리 자동으로 저장되는 것처럼 보이는 동작이 있더라도, 명시적으로 save 호출을 통해 추후의 데이터 일관성을 보장하는 것이 좋습니다.

이와 관련하여 SwiftData 사용 시 데이터 저장에 대한 보다 구체적인 동작을 설명한 기존 답변을 참고하실 수 있습니다:
- SwiftData 저장 동작 이해하기: SwiftData 저장 시기 및 방법에 관한 내용입니다.

이 답변이 궁금증을 해결하는 데 도움이 되길 바랍니다. 추가적인 의문 사항이 있으시다면, 질문을 이어서 남겨주세요. 지식공유자께서 더 자세히 안내해 주실 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

leebs30919님의 프로필 이미지
leebs30919

작성한 질문수

질문하기