wanna be dev 🧑‍💻

Cool 하고 Sick한 개발자가 되고 싶은 uzun입니다

A.K.A. Kick-snare, hyjhyj0901, h_uz99 solvedac-logo

Android/Study

📥 단방향 데이터 플로우 Undirectional Data Flow (UDF) 패턴

Kick_snare 2022. 8. 20. 19:55
728x90

단방향 Data Flow란 

안드로이드 앱에서 상태는 사용자 이벤트에 대한 응답으로 업데이트가 이루어진다.

  • Event : 사용자 또는 프로그램의 다른 부분에 의해 생성됨
  • Update State : 이벤트 핸들러가 UI 에서 사용하는 상태를 변경
  • Display State : 새로운 상태를 표시하도록 UI가 업데이트 됨

기존의 구조화 되지 않은 상태

class HelloActivity : AppCompatActivity() {
   private lateinit var binding: ActivityHelloBinding
   var name = ""

   override fun onCreate(savedInstanceState: Bundle?) {
       binding.textInput.doAfterTextChanged {text ->
           name = text.toString()
           updateHello()
       }
   }

   private fun updateHello() { binding.helloText.text = "Hello, $name" }
}

→ 이와 같은 코드는 UI가 늘어나면서 관리하기 어려워짐

  • View와 얽혀 코드 테스트가 어려움
  • 각 상태가 변경되고 수동으로 업데이트 되기 때문에 관리가 힘듬
  • 코드가 복잡성이 올라감

ViewModel를 사용한 단방향 Data Flow 의 상태

class HelloViewModel: ViewModel() {
   private val _name = MutableLiveData("")
   val name: LiveData<String> = _name

   fun onNameChanged(newName: String) { _name.value = newName }
}

class HelloActivityWithViewModel : AppCompatActivity() {
   private val helloViewModel by viewModels<HelloViewModel>()

   override fun onCreate(savedInstanceState: Bundle?) {
       binding.textInput.doAfterTextChanged {
           helloViewModel.onNameChanged(it.toString())
       }

       helloViewModel.name.observe(this) { name ->
           binding.helloText.text = "Hello, $name"
       }
   }
}

  • 상태를 Acticitiy 에서 ViewModel 로 이동
  • 상태는 LiveData로 표시된다 (Observerable State Holder)
  • LiveData, StateFlow, Flow, Observable

이러한 패턴을 Unidirectional data flow 이라고 함

  • 테스트 가능성이 좋아짐
  • 상태 캡슐화으로 버그 가능성이 작음
  • UI 일괄성 : 모든 상태 업데이트가 즉시 UI에 반영

참고

https://www.notion.so/uzun/Unidirectional-Data-Flow-305e5021b597477099acd07f43fb653f#b47e3b47afb84a5da5ebb77bab402467

https://www.notion.so/uzun/Unidirectional-Data-Flow-305e5021b597477099acd07f43fb653f#8c113ffabb9c4eafac134619fea0157b

728x90