Lifecycle 인식 컴포넌트
- Activity와 Fragment와 같은 다른 컴포넌트의 생명주기 상태 변화에 대응하여 수행되는 컴포넌트
- UI Controller의 수명주기를 인식
- Lifecycle 인식 구성요소를 사용하면 코드를 더 가볍게 만들 수 있고 유지보수하기가 쉬워짐 -> Activity나 Fragment 생명주기와 관련된 코드를 이 컴포넌트안에 작성하여 코드를 더 깔끔하게 작성할 수 있음
Lifecycle
- Activity나 Fragment와 같은 구성요소의 수명 주기 상태 관련 정보를 포함하며 다른 객체가 이 상태를 관찰할 수 있게 하는 클래스
- 생명주기의 변화가 발생하면 등록된 Observer를 실행해주는 역할
- LifeCycleOwner 인터페이스에 정의되어 있는
getLifeCycle()
메서드를 사용해 Lifecycler을 얻음
Event
, State
두 개의 Enumeraiton을 사용하여 연결된 구성요소의 수명 주기 상태를 추적
State는 그래프의 노드, Event는 그래프의 간선
LifecyclerOwner
LifecycleOwne
는 클래스에 Lifecycle
이 있음을 나타내는 단일 메서드(getLifecycle()
) 인터페이스
- Fragment 및 AppCompatActivity와 같은 개별 클래스에서 Lifecycle의 소유권을 추출하고, 함께 작동하는 구성요소를 작성할 수 있게 함
- LifecycleOwner의 getLifecycle() 메서드는 LifeCycle 객체를 반환
수명주기 인식 컴포넌트의 권장사항
- UI 컨트롤러(Activity와 Fragment)를 가능한 한 가볍게 유지 -> 자체 데이터를 확보하기 보다는 ViewModel을 사용해 데이터를 확보하고 LiveData 객체를 관잘해 변경사항을 뷰에 반영해야 함
- 데이터 기반 UI를 작성 -> 데이터 변경에 따라 뷰를 업데이트하거나 사용자 작업을 다시 ViewModel에 알리는 것은 UI 컨트롤러의 책임
- ViewModel 클래스에 데이터 로직을 배치 -> ViewModel은 UI 컨트롤러와 앱 나머지 부분 간의 커넥터 역할이기 때문에 데이터를 가져오는 것은 ViewModel의 책임이 아님 -> ViewModel은 적절한 구성요소를 호출하여 데이터를 가져온 후 결과를 다시 UI 컨트롤러에 제공해야 함
- DataBinding을 사용하여 뷰와 UI 컨트롤러 사이의 인터페이스를 깔끔하게 유지
- UI가 복잡하다면 UI 수정을 처리할 수 있는 presenter 클래스를 만드는 것이 좋음
- ViewModel에서 View 또는 Activity Context를 참조하지 말 것 -> 가비지 컬렉터가 제대로 처리하지 못해 메모리 누수가 발생할 수 있음
- Kotlin Coroutine을 사용하여 장기 실행 작업 및 비동기적으로 실행될 수 있는 기타 작업을 관리
참고