
안녕하세요.
iOS 개발자 비모 🤖 입니다.
오늘은 SwiftUI의 다양한 공부를 하기전에
Single Source Of Truth 에 대해 알아보고자 합니다.
이번 글은 WWDC2019부터 나온 single source of truth 에 대한 내용들을 바탕으로 포스팅을 하였습니다.
우선 Single Source of truth가 뭘까요?
그대로 직역을 해보면 "단일 정보 소스" 인데요.
애플에서 말하는 단일 정보 소스란 무엇을 말하는 것일까요?
간단하게 말한다면
입니다.
그렇다면...
왜 애플은 SwiftUI 관련 WWDC 세션에서 단 하나의 데이터임을 보장하는 것을 계속 강조하고 있는 걸까요?
이제부터 Single Source Of Truth를 SSOT로 줄여서 표현하겠습니다.
Single이란 단어를 빼고 Source Of Truth라는 단어는 SwiftUI 관련 세션 중에 정말 자주 등장합니다.
제가 본 세션들 중 총 4개의 세션에서 언급되었습니다.
WWDC2019 Data Flow Through SwiftUI
WWDC2019 Introducing SwiftUI - Building Your first App
WWDC2020 Introdution to SwiftUI
WWDC2020 Data Essentials in SwiftUI 중에서..
이 세션들에서 Source Truth가 언급되는 이유는 위에서도 말했지만 데이터의 일관성을 강조한다는 점입니다. 그렇다면 왜 그렇게 데이터의 일관성을 강조할까요?
데이터의 일관성은 SwiftUI에서 Single Source of Truth(SSOT) 를 강조하는 핵심 이유 중 하나입니다. SwiftUI는 데이터와 UI를 동기화하며 동작하는 선언적 UI 프레임워크로, 데이터의 변화에 따라 UI가 자동으로 업데이트됩니다. 이때 데이터가 일관성을 잃거나 여러 소스에서 관리된다면 UI와 데이터 간의 불일치가 발생할 수 있습니다.
출처 - WWDC2020 Data Essentials in SwiftUI 중에서..
SwiftUI는 선언적 방식으로 데이터 상태를 UI에 반영합니다. 데이터가 변경되면 해당 데이터에 의존하는 모든 뷰가 다시 렌더링되며, 최신 데이터에 기반한 UI를 제공하게 됩니다.
struct CounterView: View {
@State private var count: Int = 0 // Source of Truth
var body: some View {
VStack {
Text("Count: \(count)") // 변경된 데이터를 업데이트
Button("Increment") {
count += 1
}
}
}
}
여기서 @State는 SwiftUI의 상태 관리 도구로, 데이터의 진리 원천(Source of Truth) 역할을 합니다.
그렇다면 다시 본론으로 넘어가서!
만약 아래와 같이 부모 뷰와 자식 뷰 각각에서 같은 데이터를 관리한다면 어떤 일이 발생할까요?
struct CounterView: View {
@State private var count: Int = 0 // Source of Truth
var body: some View {
IncrementButtonView()
}
}
struct IncrementButtonView: View {
@State private var count: Int = 0 // Source of Truth 2?
var body: some View {
VStack {
Text("Count: \(count)") // 변경된 데이터를 업데이트
Button("Increment") {
count += 1
}
}
}
}
위 코드에서 부모와 자식 뷰 각각이 @State로 동일한 데이터(count)를 관리합니다. 동일한 데이터를 서로 독립적으로 관리하게 되면 다음과 같은 문제가 발생할 수 있습니다:
결국, 데이터를 단일 원천으로 관리하지 않으면 데이터의 일관성과 예측 가능성이 떨어집니다.
바로 @Binding을 사용합니다.
@Binding을 사용하여 count의 데이터를 자식뷰에도 부모뷰의 쓰기 권한을 공유하게 합니다.
struct CounterView: View {
@State private var count: Int = 0 // Source of Truth
var body: some View {
IncrementButtonView(count: $count) // @Binding 전달
}
}
struct IncrementButtonView: View {
@Binding var count: Int // 😎
var body: some View {
VStack {
Text("Count: \(count)") // 변경된 데이터를 업데이트
Button("Increment") {
count += 1
}
}
}
}
이렇게 @Binding을 사용하면 부모뷰에서 변경된 count가 자식뷰에도 그대로 영향을 끼쳐 뷰 업데이트가 이루어집니다.
따라서 애플은 @State, @Binding, @ObservedObject, @EnvironmentObject 등의 SSOT를 지키기 위한 다양한 프로퍼티 래퍼들을 제공하고 있습니다.
관련 내용을 더 자세히 보고 싶다면 >> iOS Study - github
SwiftUI는 데이터가 UI와 동기화되는 구조를 기반으로 동작하며, 데이터의 일관성과 예측 가능성을 매우 중요하게 생각합니다.
Single Source of Truth(SSOT) 는 이를 구현하기 위한 핵심 개념으로, 데이터를 한 곳에서 관리하고, 데이터 변경이 모든 관련된 UI에 정확히 반영되도록 보장합니다. 이를 통해 상태 관리의 복잡성을 줄이고, 버그 발생 가능성을 낮추며, 코드의 유지보수성을 향상시킵니다.
읽어주셔서 감사합니다!