프로젝트를 진행하던 도중 문제가 발생했다!!! :) 문제는 SwiftData에서 발생했다. 😂
진행 상황
아래와 같이 Clean Architecture의 형태로 만들고 있었는데 Entity, Data, UseCase, Store까지 쭈욱 코드를 작성해나가고 있었다. API 호출 관련 부분까지는 문제가 없었는데...
위와 같이 구현하게 된다면, SwiftData를 Entity로 써야 하는데, SwiftData의 ModelContext가 View로부터 분리가 힘들다는 문제점에서 발생했다. SwiftData는 ModelContext를 @Environment(\.modelContext) private var context 처럼 View에서 가져오는 방법밖에 없었다. 그렇게 된다면 Use case는 반드시 View의 변경에 큰 영향을 받을 수 밖에 없었다.
해결 과정
View로부터 분리하는 방법이 있었지만 아래와 같이 shared를 사용해야 한다는 점, try! 를 사용하여 오류에 매우 취약하다는 점이 있어서 내키지 않았다.
@MainActor
static let shared = ItemDataSource()
@MainActor
private init() {
self.modelContainer = try! ModelContainer(for: Item.self)
self.modelContext = modelContainer.mainContext
}
그리고 무엇보다 아래와 같이 동시성 관련 오류와 함께 Swift 6에서 오류가 날것입니다... (???)라는 신기한 오류가 발생하게 되었다.
그렇다면 이렇게 강제적으로 해결하는 건 패스... 두 번째로는 그냥 context자체를 인자로 전달해 주면 되겠다!라고 생각했었는데,
아래와 같이 ModelContext를 메인스레드에서 보장할 수 없는 곳으로 보내버리면 경쟁 상황이 발생할 수 있다고 오류가 발생하게 되어서 이 해결방법도 무산이 되었다.
생각해 보면 Entity부분은 프레임워크랑 상관없이 완전무결해야 하는데 이 Entity자체가 SwiftData라는 프레임워크를 사용하여 구현하다 보니 이런 문제가 생긴 것 같다.
최대한 Entity를 프레임워크와 아무 상관이 없게 만들고, SwiftData를 아래와 같이 Presentation Layer에 두기로 결정했다.
'→ Solver' 카테고리의 다른 글
[Project-Solver] Data race 오류 기록 (0) | 2024.07.07 |
---|---|
[Project-Solver] 프로젝트 1차 배포 (v1.0.1) (0) | 2024.05.01 |
[Project-Solver] 앱 기본 설계 (2) | 2024.04.22 |
[Project-Solver] 아키텍처 설계 (0) | 2024.04.21 |
[Project-Solver] 프로젝트 기본 세팅 (1) | 2024.04.19 |