일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 안드로이드 의존성주입
- android clean architecture
- 안드로이드 테스트코드
- android memory leak
- 안드로이드 Mockito
- RxJava
- Koin
- MVVM
- 스타트업 코딩테스트
- 안드로이드 mvvm
- android DI
- 리싸이클러뷰 최적화
- 안드로이드 mvvm예제
- 안드로이드 앱 아키텍처 가이드라인 예시
- 안드로이드 앱 아키텍처 가이드라인
- 안드로이드 앱 아키텍처 가이드라인 사용법
- 안드로이드 최적화
- Hilt
- 안드로이드 hilt
- 안드로이드 클린 아키텍처
- coroutine
- 안드로이드 리싸이클러뷰
- sharedFlow
- 안드로이드 아키텍처 컴포넌트
- Android App Architecture Guideline
- 안드로이드 Espresso
- 안드로이드 앱 아키텍처 가이드라인 설명
- Android MVVM
- 안드로이드 JUnit
- 코루틴
- Today
- Total
안드로이드 연구소
[MVVM만들기] Lifecycle 본문
지난 강의에서 ViewModel+LiveData+DataBinding+Retrofit2까지 사용하여
MVVM을 기본적인 틀을 만들어놓았습니다.
사실 여기까지만 하여도 MVVM패턴의 핵심은 끝났다고 보아도 됩니다.
하지만 위의 ViewModel, LiveData 그리고 DataBiding도
이전에 안드로이드에서 가지고 있던 문제들을 해결해준 구글에 노력이였습니다.
그렇다면 아직 배워보지 못한 컴포넌트들이 있다는 건
우리가 알지 못하는 문제들이 있다는 것이고 아직 해결하지 못했다는 뜻이 아닐까요?
그렇다면 아직 남아 있는 대표적이 3가지 라이브러리들에 대해서
알아보고 어떤 문제들을 해결할 수 있는지 알아봅시다.
가장 첫번째는 Lifecycle입니다.
Q1. ChatGPT, Lifecycle 라이브러리를 만들기 전에 등장 배경에 대해서 알려줘.
안드로이드 아키텍처 컴포넌트의 Lifecycle이 도입되기 전에
앱 구성요소(엑티비티와 프레그먼트)의 수명 주기를 관리하는 것은 종종 복잡하고 오류가 발생하기 쉬운 작업이었습니다.
개발자는 onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()와 같은 메서드로 관리하였다.
이로 인해 많은 보일러플레이트 코드가 생성되고 코드 유지 및 테스트가 어려워질 수 있습니다.
또 표준화된 방식이 없어 일관성 없는 동작과 메모리 누수와 같은 문제가 발생할 수 있습니다.
그리하여 2017년 안드로이드 아키텍처 컴포넌트에 Lifecycle를 통해
엑티비티, 프래그먼트의 현재 수명 주기 상태에 따라 동작을 자동으로 조정할 수 있는 구성요소인
수명 주기 인식 컴포넌트를 빌드할 수 있는 클래스 및 인터페이스를 제공합니다.
앱 구성 요소의 수명 주기 관리를 표준화된 접근 방식을 제공했으며 모듈식 및 테스트 가능한 코드 생성 방법을 제시하였습니다.
개발자가 보일러플레이트 코드(onCreate(), onDestory())를 작성할 필요 없이
수명 주기 이벤트에 자동으로 응답할 수 있는 수명 주기 인식 구성 요소의 개념을 도입했습니다.
여기서 가장 핵심은 우리 안드로이드 개발자들이 일반적으로 관리해주던 생명주기 관리방식이 올드하다는것입니다.
그래서 Lifecycle라이브러리는 수명 주기 인식 컴포넌트를 사용하여
현재 생명주기에 맞춰 자동으로 실행이 되게끔 작업을 할 수 있게 해놓은 것 같습니다.
Q2. 어떻게 사용하는지 예시로 보여줘.
dependencies {
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle-version"
}
최선버전: https://developer.android.com/jetpack/androidx/releases/lifecycle
먼저, 관찰할 수 있는 Observer 클래스를 만들어야한다.
1. LifecycleObserver 인터페이스를 상속받는다.
2. 그 후 onCreate메서드와 @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) 주석을 연결합니다.
그리하여 해당 엑티비티의 수명주기개체가 ON_CREATE가 되면 onCreate()함수가 자동으로 호출됩니다.
import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.OnLifecycleEvent class MyObserver : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) fun onCreate() { // code to run when the component is created } @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) fun onDestroy() { // code to run when the component is destroyed } }
즉, 엑티비티나 프레그먼트가 생성이 될 때 onCreate()함수가 자동으로 실행되고
파괴될 때는 onDestory()함수를 자동으로 실행할 수 있다는거네요.
아하 이렇게 엑티비티나 프레그먼트에서 불러와야할 함수를 observer클래스에서
해당 생명주기를 인식하고 자동으로 함수가 호출되니
엑티비티의 UI로직에서 비즈니스 로직을 분리하여서
엑티비티 따로, Observer클래스 따로 기능별로 테스트를 잘 할 수 있다는 말이 이거였군요!
하지만 이 observer클래스는 아직 엑티비티에 연결이 되어 있지 않은데 어떻게 감지를 하죠?
그 답은 아래에.
그 다음으로 엑티비티 또는 프래그먼트에서 위에 생성한 observer클래스를 연결해줍니다.
1. lifecycle.addObserver로 수명 주기 관찰자를 추가해야 합니다.
2. 또 엑티비티가 onDestory되면 lifecycle.removeObserver를 사용하여 수명 주기 관찰자를 제거해줍니다.class MyActivity : AppCompatActivity() { private val myObserver = MyObserver() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) lifecycle.addObserver(myObserver) } override fun onDestroy() { super.onDestroy() lifecycle.removeObserver(myObserver) } }
엑티비티에서 생성한 observer클래스의 인스턴스를
위와 같이 연결하면 되네요.
위의 myObserver에서는 두가지 생명주기(ON_CREATE, ON_DESTROY)밖에 사용하지 않았는데
그외에는 어떤 것들이 있을까요?
Q3. ViewModel안에서도 lifecycle을 사용하니?
class MyViewModel : ViewModel(), LifecycleObserver {
private lateinit var lifecycle: Lifecycle
init {
// Get the Lifecycle object for this ViewModel
lifecycle = LifecycleRegistryOwner.lifecycle
// Add this ViewModel as a lifecycle observer
lifecycle.addObserver(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate() {
// Perform any necessary initialization here
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy() {
// Remove the observer from the lifecycle
lifecycle.removeObserver(this)
}
}
ViewModel안의 메서드들도 lifecycle을 사용가능하네요.
1. LifecycleObserver을 상속받은 후에
2. init함수에서 LifecycleRegistryOwner(해당엑티비티나 프레그먼트에 연결된 Lifecycle객체) 인스턴스를 생성해 addObserver로 연결한다.
3. 아래 메서드처럼 @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)로 연결하여 수명 주기 관련 메서드를 정의한다.
Q4. 생명주기 타입에는 어떤 것들이 있니?
생명주기의 두가지 타입이 있습니다.
1. Lifecycle.Event
: Lifecycle 클래스에서 전달되는 수명 주기 이벤트입니다. 이러한 이벤트는 활동 및 프래그먼트의 콜백 이벤트에 매핑됩니다.
- ON_ANY : LifecycleOwner의 모든 event에 대한 상수
- ON_CREATE : LifecycleOwner의 onCreate 이벤트에 대한 상수
- ON_DESTROY : LifecycleOwner의 onDestory 이벤트에 대한 상수
- ON_PAUSE : LifecycleOwner의 onPause 이벤트에 대한 상수
- ON_RESUME : LifecycleOwner의 onResume 이벤트에 대한 상수
- ON_START : LifecycleOwner의 onStart 이벤트에 대한 상수
- ON_STOP : LifecycleOwner의 onStop 이벤트에 대한 상수
2. Lifecycle.State
: Lifecycle 객체가 추적하는 구성 요소의 현재 상태
INITIALIZED : Owner의 onCreate()가 불리기 직전에 바뀜
DESTROYED : Owner의 onDestroy()가 불리기 직전에 바뀜
CREATED : Owner의 onCreate() 이후나 onStop() 직전에 바뀜
STARTED : Owner의 onStart() 이후나 onPause() 직전에 바뀜
RESUMED : Owner의 onResume()이 불린 이후에 바뀜
Lifecycle.Event는 @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) 위에서 사용했듯이
Lifecycle.State는 @OnLifecycleEvent(Lifecycle.State.CREATED) 이렇게 사용하면 되겠죠?
오늘은 lifecycle에 대해서 알아보았습니다.
기존의 onCreated(), onResume(), onStart()같은 생명주기 메서드에 넣어둔 기능들을
생명주기 Observer클래스에 따로 정리해놓으므로
엑티비티 속에서 핵심 로직을 분리시켜서
엑티비티 따로 테스트하고, Observer클래스 테스트 따로 할 수 있게 해놓으니 정말 좋겠네요.
그리고 ViewModel에서도 생명주기를 갖게 하는 법을 배웠으니
앞으로 어떻게 활용할 수 있을지 확인해봅시다.
그럼 오늘 여기까지.
감사합니다.
'안드로이드 연구소 > MVVM+AAC' 카테고리의 다른 글
[MVVM만들기] Room (0) | 2023.05.16 |
---|---|
[MVVM만들기] Paging3 (0) | 2023.05.15 |
[MVVM만들기] http통신(Retrofit2) (0) | 2023.05.12 |
[MVVM만들기] DataBinding (0) | 2023.05.12 |
[MVVM만들기] ViewModel + LiveData (0) | 2023.05.12 |