여기서 처음에 data.titleArg라는 데이터바인딩 코드를 사용했는데.. 이게 알고보니 필요가 없었네요 더 정확히는 <data></data> 태그도 필요가 없구요.. 그냥 코드상에서 binding 객체를 이용해서 id를 통해서접근하면 되는것이었습니다.. 맞나요..?
=> 이 부분이 좀 이상하네요. 안드로이드 데이터바인딩은 Angular, React, ViewJS같은 웹프레임웍이 아니라서 자동으로 업데이터 되지 않습니다. 명료하게 어떤 데이터를 사용한다고 XML에 정의해주고 이걸 바인딩 시켜주셔야 합니다. 따라서 XML에 data 태그 부분에 어떤 데이터를 가져다 쓰는지 정의해주서야 하는 걸로 압니다. 안그러면 데이터바인딩이 data가 어떤 걸 가리기는지 알 방법이 없어요. 빌드 자체가 안될 걸로 생각합니다. 이렇게 하시면
viewModel.title.observe(viewLifecycleOwner) { titleData ->
// UI 업데이트
binding.title.text = titleData // 업데이트 안됨
}
이렇게 Fragment가 ViewModel을 observe할 필요가 없습니다. DataBinding을 사용할 때 님과 방법으로 사용하지는 않아요. 그냥 binding.data = ViewModel 이런 식으로만 설정해주면 끝입니다. DataBinding이 자동으로 observe를 하게 되어있어요.
님의 사용하신 코드는 이미 data binding이 내부적으로 처리하고 있는 부분을 중복으로 코딩하시는 것이므로 binding.data로 필요한 데이터를 설정하시고 제거하시는 게 맞다고 보여요. 이 부분은 onViewCreated를 이용하시는면 될 듯합니다.
그리고 ViewModel에서,
val title: MutableLiveData<String> = MutableLiveData()
MutableLiveData를 public으로 만드는 것보다는
private var _title: MutableLiveData<String> = MutableLiveData()
val title: LiveData<String> get = _title
MutableLIveData는 값 변경이 가능하기 때문에 Readonly인 LiveData를 public으로 해주는 게 더 좋습니다.
1.newInstance는 프래그먼트를 생성함과동시에 데이터를 넣는 코드(arguments)라 꼭 필요한 코드 같고..
더 좋은 방법 혹은 깔끔한 방법이 있는지 모르겠습니다. 아마 메인액티비티에도 MVVM 패턴을 적용하면서
뷰모델을 만들지 싶은데 그때 ViewModel을 통한 데이터 공유방법도 있다고 들어 그걸 이용할까하는데
어떨까요?
님의 경우 VIew 레이어가 DataBinding(XML)이기 때문에 Activity는 MVVM과는 직접 관련이 없습니다.
프레그먼트 생성은 newInstance든, ViewModel 공유 든간에 님의 요구에 맞게 선택하시면 됩니다.
2.넣은 인자를 onCreate(0에서 받아 데이터를 가공하는 코드도 MVVM 패턴에서 보면 좋지 않아보이는데
뷰모델 내부에서 메소드를 정의하고 arguments.apply에서 메소드를 호출하면서 인자를 전달해 메소드
내부에서 가공시켜줘야할까요?
setArguments를 사용하신다면 ViewModel에 arguments로 받은 데이터를 ViewModel로 전달하는 부분이 필요할 수 있을 겁니다. 이건 안드로이드 시스템 구조상 그런 부분이고 ViewModel을 공유하는 것도 안드로이드에 존재하는 개념이구요.
3.observe가 데이터 변경을 알 수있도록 setTitle이라는 함수를 호출하는데 이것의 위치가 어디가 좋을까요.
위에서 말씀드린 데로 onViewCreate에서 binding.data 를 호출하시면 데이터바인딩에 필요한 데이터를 세팅해 주시면 됩니다. Fragment가 ViewModel에 있는 LiveData를 observe하실 필요가 없어요. Databinding을 쓰기 때문에 Fragment는 이제 더이상 MVVM에 말하는 View가 아니예요.
참고로 님이 하신 방법대로라면 DataBinding이 굳이 필요없구요. 그냥 ViewBinding만 쓰시고 XML은 layout, data없이 정상적으로 사용하시면 됩니다. 제가 보기엔 님께서는 Databinding과 ViewBinding을 헷갈리고 계시는 것 같아요.