[Android] ViewModel, 개념 이해하기

윤석규·2023년 4월 8일
2
post-thumbnail

ViewModel 이란?

소프트웨어 개발 아키텍처 패턴중 하나인 MVVM 아키텍처 패턴에서 파생된 개념으로 View와 Model 사이에서 매개체 역할을 하고, View의 데이터를 관리하는 역할을 한다.

AAC ViewModel 이란?

Anroid Architecture ViewModel의 약자로,
생명주기를 고려하여 UI와 관련된 데이터들을 저장하고 관리하는 역할을 하는 Android Jetpack의 구성요소이다.

ViewModel이 필요한 이유?

UI 컨트롤러의 데이터를 캡슐화하여 구성이 변경되어도 데이터를 유지하고, 과도한 책임을 분담하여 유지보수, 재사용성, 테스트 등을 용이하게 만들어 준다.

ViewModel의 생명주기

ViewModel은 Activity처럼 생명주기를 가지고 있다.
ViewModel의 생명주기는 Activity가 생성될 때 시작 되고 Activity가 종료될 때 함께 종료된다.

생명주기가 Activity에 비해 단순하기 때문에 앱이 갑자기 전화가 걸려오거나, 화면 회전이 발생하는 경우에도 데이터를 보존할 수 있다.

ViewModel 요청 과정


Activity나 Fragment 같은 UI 컨트롤러에서 ViewModel을 사용하기 위해서는 ViewModelProvider를 통해 ViewModel과 Activity, Fragment를 연결 해줘야한다.
만약 ViewModel 인스턴스가 이전의 요청으로 생성되어 있다면 ViewModelProvier는 ViewModelStoreOwner를 참조해 ViewModelStore에 생성되어 있는 ViewModel 인스턴스를 반환한다.
ViewModel 인스턴스가 생성되어 있지 않다면, ViewModelProvider.Factory를 통해 ViewModel 인스턴스를 생성한 후 ViewModelStore에 저장하고 생성된 ViewModel 인스턴스를 반환한다.

ViewModel 사용법

먼저 AAC ViewModel을 상속받는 ViewModel 클래스를 생성한다.

class MainViewModel : ViewModel() {
	...
}

이렇게 생성한 ViewModel을 사용하기 위해서는 2가지 방법이 있다.

1. ViewModelProvider 사용

첫번째는 위에서 설명한 ViewModelProvider를 이용한 초기화 방법이다.

class MainActivity : AppCompatActivity() {
	// by lzay 사용
    private val viewModel1: MainViewModel by lazy { 
    	ViewModelProvider(this).get(MainViewModel::class.java)
    }
    // lateinit var 사용
    private lateinit var viewModel2: MainViewModel
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        viewModel2 = ViewModelProvider(this).get(MainViewModel::class.java)
    }
}

2. by viewModels() 사용

2번째는 AndroidX의 KTX 모듈을 사용한 초기화 방법이다.

먼저 모듈 수준의 build.gradle에 아래 코드를 추가한다.

dependencies {
	// activity
	implementation 'androidx.activity:activity-ktx:{version}'
    // fragment
    implementation 'androidx.fragment:fragment-ktx:{version}'
}

그 후 Activity나 Fragment에 아래 코드를 사용하여 초기화 한다.

class MainActivity : AppCompatActivity() {
    private val viewModel: MainViewModel by viewModels()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ...
    }
}

+ Fragment에서 Activity와 공유하는 ViewModel을 방법

class MainFragment : Fragment() {
    private val viewModel: MainViewModel by activityViewModels()
    
       override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        ...
    }
}

MVVM ViewModel vs AAC ViewModel

MVVM ViewModel과 AAC ViewModel의 차이를 모르는 사람들이 많다.
MVVM에서의 ViewModel은 View에 필요한 데이터를 관리하여 바인딩 해주고, 비즈니스 로직을 담당해 데이터를 처리하는 개념이고, AAC에서의 ViewModel은 Android의 수명 주기를 고려하여 UI 관련 데이터를 저장하고 관리하는 개념이다.

따라서 MVVM ViewModel과 AAC ViewModel은 다른 개념이고 AAC ViewModel을 사용했다고 해서 MVVM 패턴으로서의 ViewModel을 사용했다고 말할 수 없다.

하지만 AAC ViewModel과 Observable한 LiveData, StateFlow을 사용해서 데이터를 바인딩 해준다면 MVVM의 ViewModel로써 사용할 수 있다.

결론을 말하자면, AAC ViewModel을 사용했다고 해서 MVVM ViewModel을 구현했다고 할 수 없고, AAC ViewModel과 LiveData 등으로 데이터를 바인딩한다면 MVVM의 ViewModel로써의 AAC ViewModel을 사용할 수 있다.

profile
나만의 것으로 만들 때까지 공부합니다 ✏️

0개의 댓글