@StateObject vs @ObservedObject: SwiftUI에서의 상태 관리

SwiftUI에서는 상태를 관리하기 위해 @StateObject와 @ObservedObject라는 두 가지 속성을 사용합니다. 그러나 이 둘의 차이를 명확히 이해하지 않으면 의도하지 않은 동작이 발생할 수 있습니다. 이번 글에서는 이 두 개념을 비교하고, 적절한 예제와 함께 설명하겠습니다.

@StateObject: 뷰가 직접 생성하고 관리하는 객체

@StateObject는 SwiftUI에서 뷰의 생명주기 동안 유지해야 하는 객체를 생성할 때 사용됩니다.

class ArticleFetcher: ObservableObject {
    @Published var articles: [String] = []
}

struct ArticleListView: View {
    @StateObject private var articleFetcher = ArticleFetcher()
    
    var body: some View {
        List(articleFetcher.articles, id: \ .self) { article in
            Text(article)
        }
    }
}

위 코드에서는 articleFetcher 객체가 @StateObject로 선언되었기 때문에 ArticleListView가 다시 렌더링되더라도 동일한 인스턴스를 유지합니다.

@ObservedObject: 외부에서 주입받는 객체

반면, @ObservedObject는 다른 뷰에서 생성된 객체를 전달받아 사용하는 경우에 적합합니다.

struct ArticleListView: View {
    @ObservedObject var articleFetcher: ArticleFetcher
    
    var body: some View {
        List(articleFetcher.articles, id: \ .self) { article in
            Text(article)
        }
    }
}

이제 부모 뷰에서 객체를 생성하여 전달하면 됩니다.

struct ContentView: View {
    @StateObject private var articleFetcher = ArticleFetcher()
    
    var body: some View {
        ArticleListView(articleFetcher: articleFetcher)
    }
}

언제 사용해야 할까?

  • 뷰에서 직접 생성하는 객체는 @StateObject
  • 부모에서 생성한 객체를 자식 뷰에서 사용할 때는 @ObservedObject

이 차이를 이해하면 SwiftUI에서의 상태 관리를 보다 효과적으로 할 수 있습니다.

위로 스크롤