iOS

[iOS/SwiftUI] @EnvironmentObject와 Singleton의 차이점

GODOLs 2023. 10. 11. 14:31

1. 목적:

  • EnvironmentObject: SwiftUI view 계층 내에서 데이터를 공유하고 전달하는 목적으로 사용됩니다. 특정 뷰에서 제공되는 데이터나 상태를 자식 뷰들에게 전달하고 싶을 때 사용됩니다.
  • 싱글톤: 앱 전체에서 하나의 인스턴스만 유지하고자 할 때 사용하는 디자인 패턴입니다. 앱의 여러 부분에서 동일한 정보나 설정, 리소스를 공유해야 할 때 사용됩니다.

2. 사용법:

  • EnvironmentObject: 뷰 계층에서 .environmentObject(_:) 메서드를 사용하여 제공되고, @EnvironmentObject 속성 래퍼를 사용하여 해당 객체에 액세스합니다.
  • 싱글톤: 특정 클래스에서 static shared 변수나 메서드를 통해 싱글톤 인스턴스에 액세스합니다.

1. EnvironmentObject 사용 예시

먼저, ObservableObject로 사용될 데이터 클래스를 생성합니다.

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

뷰에서 EnvironmentObject를 사용하려면:

struct ContentView: View {
    @EnvironmentObject var settings: UserSettings

    var body: some View {
        Text("Hello, \(settings.username)")
    }
}

struct RootView: View {
    var body: some View {
        ContentView()
            .environmentObject(UserSettings())
    }
}

2. 싱글톤 사용 예시

싱글톤 클래스를 정의하려면:

class AppManager {
    static let shared = AppManager()

    var appVersion: String = "1.0"

    private init() {}  // 이 initializer는 private으로 설정하여 외부에서 인스턴스 생성을 방지합니다.
}

이 싱글톤에 액세스하려면:

let currentVersion = AppManager.shared.appVersion

참고:
EnvironmentObject는 뷰 계층의 특정 부분에 데이터를 주입하고 해당 데이터를 계층 내의 다른 뷰와 공유하는 데 사용됩니다.
싱글톤은 앱의 전체 수명 주기 동안 하나의 인스턴스만 존재하도록 보장하며, 앱의 여러 부분에서 공유되는 데이터나 설정을 저장하고 액세스하는 데 사용됩니다.
이 두 가지 방법은 서로 다른 문제를 해결하도록 설계되었으므로, 앱의 특정 요구 사항에 따라 적절한 방법을 선택하는 것이 중요합니다.


3. 사용 시나리오:

  • EnvironmentObject: 사용자 인증 정보, UI 테마 설정 등 뷰 계층에서 공유해야 하는 데이터를 전달하는데 사용됩니다.
  • 싱글톤: 데이터베이스 연결, 로그 관리, 네트워크 연결 등 앱 전체에서 공유되어야 하는 리소스를 관리하는데 사용됩니다.

4. 생명 주기:

  • EnvironmentObject: SwiftUI view 계층의 일부로써, 뷰가 소멸될 때 같이 소멸될 수 있습니다.
  • 싱글톤: 앱의 생명 주기 동안 계속 유지됩니다. 일반적으로 앱이 종료될 때까지 싱글톤 인스턴스는 메모리에 남아 있습니다.

결론

EnvironmentObject와 싱글톤은 모두 데이터를 공유하고 관리하는 데 사용되지만, 사용 목적과 범위, 생명 주기 등 여러 측면에서 차이가 있습니다. 따라서 개발 중인 앱의 요구 사항에 따라 적절한 도구나 패턴을 선택하여 사용해야 합니다.

반응형