Android 앱 개발에서 Fragment 간에 데이터를 공유하고 상태를 유지하는 것은 흔한 일입니다.
Singleton 형태의 공유 메모리 영역을 두고 관리하거나 Callback 리스너 등을 이용해 이벤트 또는 파라메터를 전달하여 공유할 수도 있지만 ViewModel을 기반으로 하면 이를 잘 활용할 수 있습니다.
특히 MVVM 또는 클린 아키텍처 구조를 기반으로 개발할 때는 ViewModel을 활용하는 것이 효율적입니다. 이번 글에서는 자식 Fragment에서 변경된 데이터를 부모 Fragment에서 알 수 있도록 하는 구조와 ViewModelProvider의 Context를 활용한 Fragment 간 ViewModel 공유에 대해 자세히 설명합니다.
1. MVVM/클린 아키텍처 기반 데이터 공유 구조
핵심 개념: SharedViewModel
부모 Fragment와 자식 Fragment가 공유할 ViewModel을 생성합니다. 이 ViewModel은 데이터를 저장하고, 데이터 변경을 감지하는 역할을 합니다.
구현 단계:
- 데이터 모델 (Data Model): 데이터를 표현하는 클래스를 정의합니다.
- ViewModel (SharedViewModel): LiveData를 사용하여 데이터를 저장하고, 데이터 변경을 감지합니다. 자식 Fragment에서 데이터를 변경하는 메서드를 제공합니다.
- 자식 Fragment (ChildFragment): ViewModel을 통해 데이터를 변경합니다.
- 부모 Fragment (ParentFragment): ViewModel의 데이터를 관찰하고, 데이터 변경 시 UI를 업데이트합니다.
코드 예시 (Kotlin):
// SharedViewModel
class SharedViewModel : ViewModel() {
private val _data = MutableLiveData<MyData>()
val data: LiveData<MyData> = _data
fun updateData(newData: MyData) {
_data.value = newData
}
}
// ChildFragment
class ChildFragment : Fragment() {
// ...
viewModel.updateData(MyData(editText.text.toString()))
// ...
}
// ParentFragment
class ParentFragment : Fragment() {
// ...
viewModel.data.observe(viewLifecycleOwner, Observer { newData ->
textView.text = newData.text
})
// ...
}
2. ViewModelProvider의 Context를 활용한 Fragment 간 ViewModel 공유
핵심 개념: 동일한 Activity Context 사용
ViewModelProvider의 Context를 동일한 Activity로 설정하면 두 Fragment에서 각각 ViewModel을 선언하더라도 동일한 ViewModel 인스턴스를 공유합니다.
원리:
- ViewModelProvider는 ViewModelStoreOwner를 기반으로 ViewModel을 관리합니다.
- Activity는 ViewModelStoreOwner 인터페이스를 구현하므로, Activity를 Context로 사용하여 ViewModelProvider를 생성하면 해당 Activity의 ViewModelStore를 사용하게 됩니다.
- 따라서 동일한 Activity를 Context로 사용하여 생성된 ViewModelProvider는 동일한 ViewModelStore를 사용하므로, 동일한 ViewModel 인스턴스를 반환합니다.
코드 예시 (Kotlin):
// Fragment A
val viewModelA = ViewModelProvider(requireActivity()).get(SharedViewModel::class.java)
// Fragment B
val viewModelB = ViewModelProvider(requireActivity()).get(SharedViewModel::class.java)
// viewModelA === viewModelB (true)
주의사항:
- Fragment의 Context를 requireActivity() 대신 this로 설정하면 각 Fragment는 자체 ViewModelStore를 가지게 되므로, ViewModel을 공유하지 않습니다.
결론
ViewModel을 활용하면 Fragment 간에 데이터를 안전하고 효율적으로 공유할 수 있습니다. 특히 동일한 Activity Context를 사용하여 ViewModel을 생성하면 여러 Fragment에서 동일한 ViewModel 인스턴스를 공유하여 상태를 유지하고 데이터를 동기화할 수 있습니다. MVVM 또는 클린 아키텍처 구조를 기반으로 개발할 때 ViewModel을 적극적으로 활용하여 효율적인 앱 개발을 경험해 보세요!
'프로그래밍' 카테고리의 다른 글
Kotlin 싱글톤, StaticFieldLeak 걱정 없이 안전하게 구현하기! (Volatile 어노테이션 설명 포함) (1) | 2025.03.21 |
---|---|
ViewBinding 환경에서 부모 Fragment의 Arguments를 자식 Fragment에게 안전하게 전달하기 (완벽 가이드) (0) | 2025.03.21 |
Android Navigation Component argType, 어떤 타입을 사용할 수 있을까? (0) | 2025.03.21 |
Jsoup Select 구문, try.jsoup.org에서 로또 번호로 테스트해보기 (1) | 2025.03.20 |
Chrome 에서 Talend API Tester (무료) 확장 프로그램으로 API 테스트하기: 단계별 가이드 (0) | 2025.03.20 |