ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [안드로이드] MVVM 패턴
    카테고리 없음 2024. 3. 26. 10:45

    장점

    View와 Model이 완전히 분리되어 독립성을 유지할 수 있고 유닛 테스트가 용이하다.

    (기존 MVC 패턴은 여러 곳에 작업 요청을 뿌렸다면, MVVM 패턴은 요청한 작업의 흐름이 순차적으로 진행된다.)

    단점

    데이터 바인딩이 필수이며 복잡해질수록 Controller만큼 ViewModel이 처리해야할 작업이 많아진다.


    작동 방식

    1. 이용자의 입력이 View를 통해 들어온다.
    2. View에 입력이 들어오면 ViewModel에 입력을 전달한다.
    3. ViewModel은 전달받은 입력을 바탕으로 Model에 데이터를 요청한다.
    4. Model은 ViewModel의 요청을 응답하여 데이터를 넘긴다.
    5. ViewModel은 받은 데이터를 저장하고 View에 넘겨준다.
    6. 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()
            }
        }
    }
Designed by Tistory.