-
[안드로이드] MVVM 패턴카테고리 없음 2024. 3. 26. 10:45
장점
View와 Model이 완전히 분리되어 독립성을 유지할 수 있고 유닛 테스트가 용이하다.
(기존 MVC 패턴은 여러 곳에 작업 요청을 뿌렸다면, MVVM 패턴은 요청한 작업의 흐름이 순차적으로 진행된다.)
단점
데이터 바인딩이 필수이며 복잡해질수록 Controller만큼 ViewModel이 처리해야할 작업이 많아진다.
작동 방식
- 이용자의 입력이 View를 통해 들어온다.
- View에 입력이 들어오면 ViewModel에 입력을 전달한다.
- ViewModel은 전달받은 입력을 바탕으로 Model에 데이터를 요청한다.
- Model은 ViewModel의 요청을 응답하여 데이터를 넘긴다.
- ViewModel은 받은 데이터를 저장하고 View에 넘겨준다.
- View는 받은 데이터를 화면에 표시한다.
예시 코드
(이전에 작성했던 코드 일부분을 잘라왔다.)
class SignUpViewModel : ViewModel() { private val _nameEvent: MutableLiveData<String> = MutableLiveData() val nameEvent: LiveData<String> get() = _nameEvent // name을 전달 받으면 이를 바탕으로 Model에서 데이터를 요청하여 MutableLiveData에 데이터를 저장한다. // 여기선 Model이 없기 때문에 name을 바로 저장하였다. fun setName(name: String) { _nameEvent.value = name } } class SignUpActivity : AppCompatActivity() { private val nameInput: EditText by lazy { findViewById(R.id.name_input) } private val viewModel: SignUpViewModel by lazy { ViewModelProvider(this)[SignUpViewModel::class.java] } // ViewModelProvider로 특정 ViewModel을 가져올 수 있다. override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_sign_up) initViewModelEvent() } // xml에 있는 Button의 onClick과 연결되어 있다. fun signUp(view: View) { val name = nameInput.text.toString() if (name.isEmpty()) { Toast.makeText(this, nameInput.hint.toString(), Toast.LENGTH_SHORT).show() return } // SignUpViewModel에 setName 메서드로 입력 값을 넘겨준다. viewModel.setName(name) } private fun initViewModelEvent() { // 위 코드에서 setName 메서드로 데이터를 넘겨줄 때 호출된다. // ex) setName("테스트") 메서드로 데이터를 넘겨줬다면 Toast에 "입력: 테스트"라고 뜰 것이다. viewModel.nameEvent.observe(this) { name -> Toast.makeText(this, "입력: $name", Toast.LENGTH_SHORT).show() } } }