본문 바로가기
SwiftUI

SwiftUI 데이터 바인딩과 상태 관리

by 안될개발 2025. 2. 5.

SwiftUI 데이터 바인딩과 상태 관리

SwiftUI 데이터 바인딩과 상태 관리

SwiftUI에서는 데이터와 UI를 간결하고 효율적으로 연결하기 위해 데이터 바인딩과 상태 관리 방식을 제공합니다. 이 글에서는 SwiftUI의 주요 데이터 바인딩 기법과 상태 관리 도구에 대해 다루어 보겠습니다.


1. @State: 단일 뷰 내 상태 관리

@State 프로퍼티 래퍼는 SwiftUI 뷰 내부에서 상태 변화를 감지하고 UI를 갱신하는 데 사용됩니다. 주로 뷰의 내부 상태를 관리할 때 활용합니다.

예제

struct CounterView: View {
    @State private var count: Int = 0

    var body: some View {
        VStack {
            Text("Count: \(count)")
                .font(.largeTitle)

            Button("Increment") {
                count += 1
            }
        }
    }
}

특징

  • @State는 뷰가 소멸되면 초기화됩니다.
  • 주로 단순 값(예: Bool, Int, String) 관리에 적합합니다.

2. @Binding: 부모와 자식 뷰 간 데이터 연결

@Binding은 부모 뷰의 상태를 자식 뷰에서도 참조하고 수정할 수 있도록 합니다.

예제

struct ParentView: View {
    @State private var isOn: Bool = false

    var body: some View {
        ToggleView(isOn: $isOn)
    }
}

struct ToggleView: View {
    @Binding var isOn: Bool

    var body: some View {
        Toggle("Switch", isOn: $isOn)
    }
}

특징

  • 부모 뷰에서 전달된 상태 값을 자식 뷰에서 읽고 수정할 수 있습니다.
  • $ 기호를 사용하여 바인딩 값을 전달합니다.

3. @ObservedObject와 @Published: 뷰 모델 패턴

@ObservedObject와 @Published는 외부 데이터 소스를 관찰하고 상태 변화를 감지하여 UI를 갱신할 때 사용합니다.

예제

class CounterViewModel: ObservableObject {
    @Published var count: Int = 0

    func increment() {
        count += 1
    }
}

struct CounterView: View {
    @ObservedObject var viewModel = CounterViewModel()

    var body: some View {
        VStack {
            Text("Count: \(viewModel.count)")

            Button("Increment") {
                viewModel.increment()
            }
        }
    }
}

특징

  • @Published로 선언된 프로퍼티가 변경되면 UI가 자동으로 갱신됩니다.
  • @ObservedObject는 외부 객체를 관찰하는 데 사용됩니다.

4. @EnvironmentObject: 전역 데이터 공유

@EnvironmentObject는 여러 뷰 간에 공통 데이터를 공유할 때 사용됩니다.

예제

class UserSettings: ObservableObject {
    @Published var username: String = "Guest"
}

struct ContentView: View {
    @EnvironmentObject var settings: UserSettings

    var body: some View {
        VStack {
            Text("Username: \(settings.username)")

            Button("Change Username") {
                settings.username = "SwiftUIUser"
            }
        }
    }
}

특징

  • @EnvironmentObject는 부모 뷰에서 environmentObject() 메서드를 통해 전달됩니다.
  • 앱 전역 상태 관리에 적합합니다.

5. 결론

SwiftUI의 데이터 바인딩과 상태 관리 도구는 복잡한 UI를 간단하고 효율적으로 구성할 수 있도록 도와줍니다.

적절한 상태 관리 기법을 선택하여 코드의 유지 보수성과 확장성을 높여 보시기 바랍니다.