반응형
SwiftUI에서 많이 하는 실수 - @State와 @Binding을 혼동해서 잘못 사용하는 실수
SwiftUI에서 상태를 다룰 때 가장 먼저 부딪히는 벽이 바로 @State vs @Binding입니다.
두 개념의 핵심 차이는 “상태를 누가 소유하느냐”입니다.
- @State : 이 View가 값의 진짜 소유자(source of truth) 일 때
- @Binding: 이미 다른 곳에서 소유한 값을 읽고·쓰기만 할 때 (참조)
이걸 섞어 쓰면 부모와 자식의 값이 따로 놀거나, UI가 갱신되지 않는 문제가 자주 생깁니다.
1. 문제 원인
- UIKit 시절처럼 “View마다 자기 상태를 가지면 되겠지”라고 생각
- 부모와 자식이 동시에 @State를 선언해 각자 다른 상태를 가짐
- @Binding을 “단지 inout 비슷한 것”으로만 이해하고 소유권을 고려하지 않음
2. 나타나는 증상
- 부모 View의 Text는 안 바뀌는데, 자식 TextField만 값이 바뀌는 것처럼 보임
- 자식에서 입력한 내용이 다른 화면으로 전달되지 않음
- 디버깅해보면 분명 set을 하는데, 다른 View에서 값이 유지되지 않음
3. 잘못된 코드 예시
struct ParentView: View {
@State private var name: String = "" // 부모의 상태
var body: some View {
VStack {
Text("부모 이름: \(name)")
// ❌ 자식이 자기만의 @State를 가지고 있어 동기화되지 않음
ChildView()
}
.padding()
}
}
struct ChildView: View {
@State private var name: String = "" // ❌ 실제 소스와는 다른 상태
var body: some View {
TextField("이름 입력", text: $name)
.textFieldStyle(.roundedBorder)
.padding()
}
}
- ParentView.name 과 ChildView.name 은 서로 전혀 관계가 없습니다.
- 사용자는 “입력했는데 위 텍스트는 왜 안 바뀌지?”라는 상황을 겪게 됩니다.
4. 올바른 코드 예시
struct ParentView: View {
@State private var name: String = "" // ✅ 진짜 상태 소유자
var body: some View {
VStack {
Text("부모 이름: \(name)")
ChildView(name: $name) // ✅ Binding 전달
}
.padding()
}
}
struct ChildView: View {
@Binding var name: String // ✅ 소유권 없음, 참조만
var body: some View {
TextField("이름 입력", text: $name)
.textFieldStyle(.roundedBorder)
.padding()
}
}
이제 TextField에서 입력한 내용이 곧바로 부모의 name에 반영되고,
부모 Text도 함께 업데이트됩니다.
5. 정리 및 팁
- 먼저 “이 값의 진짜 주인은 누구인가?”를 정한 다음, 그 View에 @State를 선언합니다.
- 자식 View는 항상 @Binding 또는 단순 값 복사만 사용하는 것이 기본 원칙입니다.
- 재사용 가능한 컴포넌트는 @Binding 기반으로 만들고, Preview에서는 .constant를 활용합니다.
#Preview {
ChildView(name: .constant("미리보기"))
}
이 원칙만 지켜도 SwiftUI 상태 꼬임이 많이 사라집니다.
반응형
'Dev Study > SwiftUI' 카테고리의 다른 글
| SwiftUI에서 많이 하는 실수 - View struct 내부에 일반 프로퍼티로 상태를 저장하려는 실수 (0) | 2025.12.05 |
|---|---|
| SwiftUI에서 많이 하는 실수 - View의 body 안에서 무거운 연산을 실행하는 실수 (0) | 2025.12.05 |
| SwiftUI에서 많이 하는 실수 - @EnvironmentObject를 남용하거나 주입을 잊어서 크래시가 나는 실수 (0) | 2025.12.05 |
| SwiftUI에서 많이 하는 실수 - @ObservedObject와 @StateObject를 잘못 사용해 ViewModel이 계속 초기화되는 실수 (1) | 2025.12.05 |
| SwiftUI 전용 개발을 위한 최적의 iOS Deploy Target 가이드(25년 기준) (0) | 2025.11.10 |
| SwiftUI + UIKit 혼합 아키텍처 실전 가이드 (0) | 2025.11.10 |
| foregroundColor vs tint (0) | 2023.10.28 |
| SwiftUI 아이폰 회전시 Landscape, Portrait 이벤트 (0) | 2023.10.24 |

