본문 바로가기
iOS

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

by GODOLs 2023. 10. 11.

목차

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

    반응형