Level 8 (환율 변동 아이콘)과 Level 10 (앱 상태 저장·복원)을 동시에 구현하면서 고민했던 설계, 데이터 흐름, 메모리 전략을 정리했습니다.
±0.01
을 넘으면 상승(🔼)/하락(🔽) 아이콘을 보여 주고, 그렇지 않으면 .none
으로 처리하여 UI 흔들림을 방지합니다.@Model
final class LastViewedScreenEntity {
@Attribute(.unique) var id: String = "singleton"
var type: ScreenType
var currencyCode: String?
var exchangeRate: Double?
init(type: ScreenType, currencyCode: String?, exchangeRate: Double?) {
self.type = type
self.currencyCode = currencyCode
self.exchangeRate = exchangeRate
}
}
Task.detached
에서 저장/삭제를 실행.func persistLastScreen(_ screen: LastViewedScreen, context: ModelContext) async {
await context.perform {
try? context.delete(model: LastViewedScreenEntity.self)
let entity = LastViewedScreenEntity(
type: screen.type,
currencyCode: screen.currencyCode,
exchangeRate: screen.exchangeRate
)
context.insert(entity)
try? context.save()
}
}
private func computeTrends(
newRates: [String: Double],
previousRates: [String: Double]
) -> [String: RateTrend] {
newRates.reduce(into: [String: RateTrend]()) { result, entry in
let previous = previousRates[entry.key] ?? entry.value
let diff = entry.value - previous
result[entry.key] = RateTrend(difference: diff)
}
}
let snapshot = ExchangeRates.sample(
base: "USD",
rates: ["KRW": 1350.25, "JPY": 148.56],
timestamp: Date(timeIntervalSince1970: 1_704_000_000)
)
let updated = snapshot.updating(
base: "EUR",
rates: ["USD": 1.08, "KRW": 1430.5]
)
작업은 단순히 기능을 추가하는 수준이 아니라, 데이터를 어떻게 해석하게 만들고, 사용자의 맥락을 어떻게 지켜 줄 것인가에 대한 고민이었습니다.
앞으로도 기능 구현을 넘어서, 데이터와 UX 사이의 연결 고리를 고민하는 개발자로 성장하고 싶습니다.