출처 : https://developer.apple.com/videos/play/wwdc2024/10075/

Swift Data에는 History를 통해 데이터의 변화를 추적하고 관리할 수 있는 기능이 있다. 이 history를 통해 아래와 같은 일을 할 수 있다.
Transaction은 Changes(변경 사항)의 묶음이다. Transaction과 그 안의 각 Change는 순서를 지켜 저장된다.
각 Change는 Insert, Update, Delete 타입이 있다.
Transactions은 Token으로 관리되며 Hisotry가 지워졌을 때 관련된 Token이 Expire 된다. 
모델 데이터가 지워졌을 때 History에 변경 사항과 관련된 데이터를 남기고 싶다면 .preserveValueOnDeletion을 사용하면 된다.
위젯의 Change를 반영하는 예제
History Descriptor가 history를 fetch

process data
livingAccommodation에 관련된 모델 데이터를 가져옴

각 변경사항에 맞게 분기 처리 가능함

-> 변경 사항이 적용된 여행 결과와 함께 마지막 토큰을 반환

UserDefaults로 마지막 토큰 데이터를 저장해둔 것을 가져오고 Json 파싱한다. 해당 토큰 이후로 발생된 Transactions를 찾고 이 변경 사항을 통해 안 읽은 Trips를 가져온다.
새로운 토큰으로 UserDefaults 토큰을 업데이트해야한다.
읽지 않은 Trips가 있다면 UI를 업데이트 해준다.
읽었다면 뱃지 UI를 사라지게 한다.
위에는 SwiftData의 Default Store를 사용했다면,
Custom Store에서도 History 기능을 사용할 수도있음.
아래 세개를 설정 해줘야한다.
Custom Store는 History Providing 프로토콜을 채택해야한다.
Custom Transaction : Transation의 경계를 설정해야하고 데이터가 저장되는 백엔드에 unique한 identifier가 저장되어있어야함.
Custom Change : Change의 경계를 설정(Default Store에서는 개별 모델의 인스턴스가 기준임), unique idetifier, change types, deletion 시 preserve 여부를 고려해야함.
Custom Hitory Providing : 개별 Transaction을 구분하고 언제 히스토리를 삭제할지 정해야함
Custom Token : unique idetifier를 설정하고, mutiple store에서 사용하는지 고려해야 함