들어가며..
앞에서 이야기 했던 것[1]과 같이 기존에 개발 중이던 Android Application 과제에 참여하게 되면서 작성된 내용을 이해해야 하는 상황이 되었다. 여기서는 앞에서 언급한 UI 및 네비게이션 흐름 분석 중에서 FragmentTransaction, ViewModel, LiveData의 동작 방식 확인하기 위한 상세 내용에 대해서 살펴 본다.
Modern Anroid 구조
(1) Fragment 중심 설계 (Modern Android Architecture)
✅ 장점
- 단일 Activity 구조 가능 (Single Activity Architecture)
- 대부분의 UI를 하나의 Activity에서 관리하고 Fragment를 동적으로 교체.
- Navigation Component를 활용하면 자연스러운 화면 이동 가능.
- 유지보수 및 확장성 용이
- 같은 Activity 내에서 Fragment만 바꾸면 되므로 화면 재사용성이 높음.
- 대규모 앱 개발 시 구성 요소를 분리하여 관리하기 용이.
- 반응형 UI (Adaptive UI) 지원
- 태블릿과 스마트폰에 따라 레이아웃을 유연하게 조정 가능.
- 예: 태블릿에서는 좌측 리스트 + 우측 상세보기, 스마트폰에서는 화면 전환.
- Activity 간 전환 비용 감소
- Activity 간 전환 시 onCreate() → onDestroy() 호출이 발생하여 리소스 소모가 큼.
- Fragment 전환은 비용이 상대적으로 적고, BackStack을 관리하면 자연스럽게 복귀 가능.
- ViewModel과 LifecycleOwner 활용 가능
- Activity 단위에서 ViewModel을 공유하면 Fragment 간 데이터 유지 가능.
- viewLifecycleOwner를 활용하면 Fragment의 라이프사이클을 안전하게 관리.
❌ 단점
- Fragment의 생명주기 관리가 복잡
- Activity보다 복잡한 생명주기를 가짐 (onAttach(), onCreateView(), onDestroyView() 등).
- BackStack을 적절히 관리하지 않으면 메모리 누수 발생 가능.
- FragmentTransaction 관리 필요
- Fragment 간 전환 시 FragmentTransaction을 직접 관리해야 함.
- commit(), commitNow(), addToBackStack() 등 사용법을 숙지해야 함.
- Navigation Component 도입 필요
- 기존 방식 (FragmentTransaction) 대신 Navigation Component를 사용하는 것이 권장됨.
- Safe Args 같은 추가적인 학습이 필요할 수 있음.
Fragment vs Activity 사용 비교
Fragment 기반 (Single Activity) | - 동적인 화면 변경이 많은 경우 - 데이터 공유가 필요한 경우 (ViewModel 활용) - 태블릿/멀티-윈도우 지원이 필요한 경우 - Navigation Component를 활용하는 경우 |
Activity 기반 (Multiple Activity) | - 독립적인 기능의 화면이 많고, 서로 연결이 필요 없는 경우 - 단순한 앱(로그인 화면, 설정 화면)에서 사용 - 백스택 관리를 자동으로 하고 싶은 경우 |
Fragment, ViewModel, LiveData 분석 방법
(1) FragmentTransaction 분석
① Fragment 변경 방식 확인
- replace(), add(), remove(), show(), hide() 사용 여부 확인.
- commit(), commitNow()의 사용 방식이 적절한지 확인.
- addToBackStack() 사용 여부 및 Fragment 백스택 관리 방식 파악.
② Fragment 생명주기 확인
- onCreate(), onCreateView(), onResume(), onPause()의 호출 순서를 Logcat으로 확인.
- Fragment 간 전환 시 ViewModel이 정상적으로 재사용되는지 확인.
③ Fragment 간 데이터 전달 방식 분석
- arguments를 통해 전달하는지, ViewModel을 사용하는지 확인.
- FragmentResultListener 또는 LiveData로 데이터 전달하는지 분석.
(2) ViewModel 분석
① ViewModel 인스턴스 범위 확인
- Activity 범위인지 Fragment 범위인지 확인 (ViewModelProvider의 owner 확인).
- Fragment 재생성 시 ViewModel이 유지되는지 확인.
② ViewModel 내부 데이터 흐름 확인
- LiveData 또는 StateFlow를 사용하여 데이터를 관리하는지 분석.
- Transformations.map(), Transformations.switchMap()이 적절히 활용되는지 확인.
③ ViewModel의 Clear 시점 분석
- Fragment가 사라질 때 ViewModel이 정상적으로 유지되는지 또는 제거되는지 확인.
(3) LiveData 동작 분석
① LiveData의 구독 방식 확인
- observe()가 어디에서 호출되는지 확인 (Activity vs Fragment).
- viewLifecycleOwner를 사용하고 있는지 확인 (viewLifecycleOwner.lifecycleScope.launchWhenStarted).
② LiveData의 이벤트 처리 방식 확인
- SingleLiveEvent(일회성 이벤트) vs 일반 MutableLiveData 사용 방식 검토.
- observeForever()가 사용되었는지 확인 (메모리 누수 가능성 체크).
③ LiveData의 Thread 처리 확인
- MediatorLiveData 사용 여부 확인 (여러 LiveData 조합 처리 확인).
- viewModelScope.launch 등을 사용하여 백그라운드에서 처리되는지 확인.
마무리
Modern Android Application 구조가 Fragement 기반의 구조로 변경되면서 기존 Android Application을 이해하는 방법도 바뀌었다고 할 수 있다. 즉, Application -> Activity 기반의 구조 이해에서 Fragment, ViewModel, LiveData로 연결되는 구조를 이해를 먼저 해야 한다.
Fragment에서는 변경 방식, 생명주기, 데이터 전달 방식을 이해한 후에, ViewModle 인스턴스 범위 확인, 내부 데이터 흐름 확인 그리고 Clear 시점 분석을 한다. LiveData의 동작 분석에서는 구독 방식, 이벤트 처리 방식, Thread 처리를 확인한다.
참고 문헌
[1] Modern Android Application 구조의 이해, https://technical-leader.tistory.com/174
'Android Programming' 카테고리의 다른 글
ViewModel에서 Factory 사용 여부 비교 (0) | 2025.03.25 |
---|---|
Modern Anroid Application의 구조 이해 (1) | 2025.03.11 |
Waydroid 설정하기 (0) | 2022.04.15 |