[SwiftUI] @Published 썼는데도 View가 안 바뀐다?

2025. 5. 30. 08:54·iOS 개발/SwiftUI

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
'iOS 개발/SwiftUI' 카테고리의 다른 글
  • [SwiftUI] Memo 기능 리뷰 (Feat. 나만의 Todo)
  • [SwiftUI] Todo 기능 리뷰 (Feat. 나만의 Todo)
  • [SwiftUI] Splash & Onboarding 화면 구현 리뷰 (Feat. 나만의 Todo)
  • [SwiftUI] Figma 비율 그대로! 개발하는 Constants 구조체 만들기
Riu
Riu
안녕하세요 iOS 개발자를 꿈꾸는 Riu입니다. Github: woolnd
  • Riu
    Riu 개발노트
    Riu
  • 전체
    오늘
    어제
    • 분류 전체보기 (27)
      • 티스토리 (2)
      • iOS 개발 (21)
        • SwiftUI (9)
        • UIKit (6)
        • Combine (5)
        • Architecture (1)
      • 알고리즘 (1)
      • 회고록 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    막자알림서비스
    나만의todo
    안드로이드
    SWIFT
    시작
    SwiftUI
    UIKit
    티스토리
    cleanArchitecture
    SWIF
    Combine
    ios개발
    알고리즘
    회고록
    ios
    구름톤유니브
    Architecture
    앗차!
    figma
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Riu
[SwiftUI] @Published 썼는데도 View가 안 바뀐다?
상단으로

티스토리툴바