Firebase에서 데이터를 잘 받아왔는데도, SwiftUI View에서는 아무것도 나타나지 않는 상황.
분명히 @Published를 썼는데도 화면에는 변화가 없었다. 왜 이런 문제가 생겼을까?
이 글에서는 내가 직접 겪은 오류 상황과, SwiftUI의 상태 바인딩 원리, 그리고 UIKit과의 결정적인 차이에 대해 정리해보겠습니다.
❌ 문제 상황
현재 ViewModel 구조는 UIKit 개발 경험을 바탕으로 구성을 하였습니다.
final class State {
struct ViewModels {
var todoViewModels: [Todo] = []
}
@Published var viewModels = ViewModels()
}
final class TodoMainViewModel: ObservableObject {
var state = State()
}
View를 유저들에게 보여주는 방식은 간단히 ForEach으로 보여주였습니다. 아래와 같은 방식으로 작성하였습니다.
ForEach(viewModel.state.viewModels.todoViewModels) { todo in
Text(todo.title)
}
Firebase에서 데이터를 성공적으로 받아오고 있다는 점은 print(response) 로그를 통해 확인할 수 있었습니다.
그러나 View에서는 해당 데이터를 바탕으로 한 렌더링이 이루어지지 않아, 실제 화면에는 아무 변화가 없었습니다.
🫥 현재 구조의 문제
SwiftUI의 상태 관리 방식은 실제로는 매우 명확하고, 규칙 기반으로 동작하는 구조다.
현재 구조를 구성해서 발생한 문제는 아래와 같습니다:
@Published가 적용된 viewModels는 여러 개의 상태를 담는 struct 또는 class였는데, 내부의 todoViewModels 배열만 변경되었을 뿐, viewModels 자체는 그대로였기 때문에 SwiftUI는 이 변화를 감지하지 못했습니다.
SwiftUI의 View가 감지할 수 있는 것은
@Published로 선언된 속성 자체가 완전히 새로운 값으로 변경될 때입니다.
✅ 해결 방법
SwiftUI에서 가장 이상적인 구조는 @Published var 속성이 ViewModel 내부에 직접 선언되어 있고,
해당 값이 View와 직접 바인딩되어 있는 형태입니다.
final class TodoMainViewModel: ObservableObject {
@Published var todoViewModels: [Todo] = []
}
📝 더 쉽게 이해할 수 있는 UIKit vs SwiftUI 상태 비교표
🔍 비교 항목 | ✅ UIKit | ✅ SwiftUI |
View가 어떻게 바뀌는가? | 직접 reloadData() 같은 메서드를 호출해서 View를 갱신해야 함 | @Published 속성의 값 자체가 변경되면 View가 자동으로 다시 그림 |
내부 값만 바뀌어도 View가 반응하나? | 가능. 내부 속성이 바뀌더라도 직접 갱신 호출을 하면 반영됨 | 안 됨. View가 감지하려면 객체 자체가 새로 바뀌어야 함 |
프로그래밍 방식 | 명령형 (imperative): "바꿔라" 라고 명령해야 반영됨 | 선언형 (declarative): "상태가 바뀌면 자동으로 바뀐다"고 선언만 하면 됨 |
즉 UIKit는 상태가 바뀌었더라도 reloadData()를 직접 호출하지 않으면 View는 바뀌지 않고. 대신 개발자가 언제든 강제로 반영할 수 있습니다. SwiftUI는 View는 상태 바뀜을 자동으로 감지해서 반영하지만, 그 상태는 반드시 @Published로 선언되어 있고, 객체 자체가 바뀌어야 합니다.
🧩 마무리
이번 경험을 통해 단순히 @Published를 사용한다고 해서 무조건 View가 업데이트되는 것이 아니라,
그 객체 자체가 바뀌어야 SwiftUI가 이를 감지하고 View를 다시 그린다는 중요한 원리를 다시 한 번 체감할 수 있었습니다.
앞으로도 꾸준히 기록하며 성장하는 개발자가 되기 위해 달려보겠습니다! 🚀
'iOS 개발 > SwiftUI' 카테고리의 다른 글
[SwiftUI] Memo 기능 리뷰 (Feat. 나만의 Todo) (4) | 2025.06.06 |
---|---|
[SwiftUI] Todo 기능 리뷰 (Feat. 나만의 Todo) (3) | 2025.06.02 |
[SwiftUI] Splash & Onboarding 화면 구현 리뷰 (Feat. 나만의 Todo) (1) | 2025.05.26 |
[SwiftUI] Figma 비율 그대로! 개발하는 Constants 구조체 만들기 (1) | 2025.05.24 |
뷰 상태변경 제 2장 (8) | 2024.11.13 |