반응형
Notice
Recent Posts
Recent Comments
Link
NOW OR NEVER
[Android] MVVM 구조 본문
반응형
MVVM 구조
- 개발 패턴 구조 종류 중 하나
- 코드를 다 나누자
- 화면에 보이는 요소들이 수시로 바뀔 때 쓰면 좋다
- fragment 하나에서 했던 일은 다 나눠서 할 수 있게
- 앱 수준 gradle에 databinding{ enabled = true } 추가
View Model
- 새로고침 기능, 채팅 앱 등을 만들 때 채팅 내용은 수시로 업데이트 되기에 viewModel 구조로 쓰는 것이 좋다
- 눈에 보이는 화면의 데이터를 viewModel에서 관리
- 값이 변경되면 viewModel 안 감시자(observe)가 발동
- 화면을 구성하기 위해서 어떤 view들이 필요한 지 인지하고 있어야 한다.
- 데이터를 셋팅하는 곳
- model : 애플리케이션에서 사용되는 모든 데이터를 담을 클래스들을 정의
- UI 요소에 설정할 값을 관리
LiveData 와 MutableLiveData
- 감시자 붙일 수 있다.
- LiveData
- 수정 불가능(읽기만 가능)
- MutableLiveData
- MutableLiveData<자료형>
- 수정 가능(값을 새롭게 셋팅 가능)
- 보통 이걸 많이 씀
메서드
- .observe
- 감시자 역할로 해당 메서드 먼저 선언 후 다른 메서드 사용 가능
- Activity나 Fragment에서 livedata에 대한 감시자를 생성 후 사용 및 갱신하는 작업을 한다.
- viewModel객체.viewModel이 가지고 있는 값.감시자{}
- 원래 목적은 눈에 보이는 화면과 관련된 거지만 눈에 보이는 것과 관련되지 않더라도 어떤 property에 값이 들어가거나 변경됐을 때 자동으로 감시자가 변경하고 싶은 내용을 감시자 안에 넣어도 좋다.
- property 당 감시자를 붙일 수 있는 개수는 무제한이다.
- viewModel 객체가 가지고 있는 MutableLiveData에 값이 들어왔을 때 감시자 동작
- 리스트에 객체를 추가(list.value.add 감시자 동작x)와 객체 값 설정(.value에 값 직접 설정, 감시자 동작o) 은 다른 개념 : fun addItem(testData:TestData){
tempList.add(testData)
dataList.value = tempList
}
이런 식으로 메서드 만들어서 value에 리스트 값을 다시 할당해야 감시자가 동작
- .value
- 값 셋팅 시 사용, 해당 메서드로 값 입력하면 감시자 작동
- 이것을 통해 값을 집어 넣는 행위만 하면 감시자가 동작한다.
- ViewModelProvider(viewModel소유할context).get<viewModel객체::class.java> : 생성자
소유자
- mainActivity는 어플리케이션이 끝날 때 까지 살아있으므로 만약에 모든 액티비티, 프래그먼트가 viewModel 소유자를 mainActivity로 설정하면 데이터 공유가 가능해진다.
- 소유자가 소멸되면 viewModel도 같이 삭제된다.
- 소유자 소멸되지 않았다면 계속해서 언제 어디서든 지 viewModel 사용할 수 있다.
- viewmodel의 생명주기는 viewmodel을 가진 소유자와 생명주기가 같다
- ViewModel 소유자가 다르면 다른 객체이다.
- 데이터를 공유하지 않을 거면 소유자가 달라도 된다.
- 액티비티에서 다른 액티비티를 가져오는 것이 쉬운 일이 아니므로 정적멤버(companion object)를 사용한다.
- 예를 들어 MainActivity를 다른 액티비티에서 사용하고 싶다면 정적멤버로 lateinit var mainAcitivity : MainActivity로 선언한다음 MainActivity onCreate 메소드 안에서 초기화(mainActivity = this) 한다. 그 후 다른 액티비티에서 MainActivity를 쓸 경우 MainActivity.mainActivity로 들고 와 사용한다.
- viewModelTest1 = ViewModelProvider(MainActivity.mainAcitivity)[ViewModelTest1::class.java]
Repository
- 데이터를 구해와서 반환하는 메서드들을 모아놓은 곳
- 내장 데이터베이스나 서버 등에서 데이터를 가져와서 반환하는 작업을 한다.
- 데이터베이스나 서버 등 데이터를 가지고 있는 곳에서 데이터를 구해 반환하거나 데이터를 저장, 수정, 삭제 등을 구현
- ViewModel 클래스에서 이 repository 내 메서드를 사용해 설정하는 작업한다.
- Repository 메서드가 반환하는 것을 가지고 ViewModel 내 LiveData에 셋팅
'Android' 카테고리의 다른 글
[Android] 안드로이드 스튜디오 레이아웃 디자인 XML tools:context 에러 (0) | 2023.08.08 |
---|---|
[Android] Main Activity 인식 불가 문제 해결 (0) | 2023.08.07 |
[Android] FireBase 기본 설정 & CRUD (0) | 2023.07.31 |
[Android] Retrofit (0) | 2023.07.27 |
[Android] Image view에 등록된 사진이 안보이는 Error (0) | 2023.07.27 |