라떼는말이야

MVVM 아키텍처 적용 연습 본문

프로젝트/[안드로이드] 강의 평가 프로젝트

MVVM 아키텍처 적용 연습

MangBaam 2022. 1. 7. 22:33
반응형

더보기 탭에서 학교 메일 정보는 없앴다. 회원 가입을 할 때 이메일도 해싱 대상이기 때문이다.

추후에 필요하다면 추가적인 정보가 더 들어갈 수는 있다. 그 외에 뷰에서의 변화는 없다.

하지만 껍데기 뿐이던(하드 코딩된) 화면을 뷰모델에서 데이터를 가져와 화면에 표시하는 구조로 변경하였다.

 

Fragment

class MoreFragment : Fragment() {
    private lateinit var viewModel: MoreViewModel
    private lateinit var viewModelFactory: MoreViewModelFactory
    private lateinit var binding: FragmentMoreBinding

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = DataBindingUtil.inflate(inflater, R.layout.fragment_more, container, false)

        viewModelFactory = MoreViewModelFactory()
        viewModel = ViewModelProvider(this,viewModelFactory)[MoreViewModel::class.java]
        binding.viewModel = viewModel
		
        ...
    }
}

Databinding을 사용했기 때문에 DataBindingUtil로 인플레이트를 한다.

그리고 뷰모델 인스턴스를 더 효율적으로 생성하기 위해 팩토리 패턴을 사용했다.

 

ViewModelFactory

class ViewModelFactory: ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(MoreViewModel::class.java)) {
            return MoreViewModel() as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}

현재는 뷰모델에 전달할 매개 변수가 없지만 나중에 뷰모델에 매개 변수를 전달해야 할 때가 있다면 Factory 패턴을 사용하는 것이 좋다.

지금은 공부하는 차원에서 사용해봤다.

 

View (XML)

strings.xml

 

MVVM 패턴에서는 뷰에서 뷰모델의 데이터를 직접 참조한다.

strings.xml에 미리 지정된 형태에 뷰모델의 데이터를 결합해 직접 뷰에서 그 값을 표시한다.

000 P 로 표시되는 전체 포인트와 (강의 평가, 시험 정보, 시험 정보 열람) 개수 등의 데이터는 뷰모델에서 직접 참조했지만 (+70), (+100), (-40)과 같이 그 값에 따라 색이 변화는 부분은 어차피 뷰의 속성을 변경해야 하는 부분이기 때문에 뷰 컨트롤러인 프래그먼트에서 뷰모델의 값을 observe하여 처리하였다.

뷰에서 직접 처리할 수 있는 방법이 있는지 찾아봐야겠다.

반응형
Comments