# ViewModel

[TIL] 230913 회고
Intro > 어제부터 MVVM에대해 배우고 살펴보는중이다. 안드로이드에서는 AAC ViewModel과 LiveData를 이용하여 MVVM 패턴을 구현할 수 있다고한다. MVVM의 주된 관심사는 어떻게 UI Layer와 Data Layer를 나눠서 각각 자기 할일을 잘 하게 하는 것이다. 안드로이드의 경우 비동기 작업이 많은데다가 라이프사이클등 여러가지 작업이 복합적으로 얽혀있기에 MVVM 구조를 사용하여 관심사를 최대한 분리해야 유지보수성이 좋아지고 확장성있는 앱을 개발할 수 있다. ListView+ViewModel+LiveData 해당 기술을 사용하여 구현하는것은 그리 어렵지 않다. 그런데 ViewModel과 LiveData를 쓸때 LifeCycle에 대한 이해가 없으면 왜 안되는지도
[TIL] 230912 회고
Intro > 저번주 팀과제 진행후 오늘부터 ViewModel과 LiveData를 공부중에있다. 그리고 이것들은 ListAdapter를 통하여 RecyclerView에서 보여질 데이터를 처리한다. 공부하면서 아직 해결하지못한 문제와 새롭게 알게된 것을 정리해보려고 한다. ListAdapter 기존에 사용하던 RecyclerView Adapter와 차이점은 바로 직접 List의 업데이트를 신경쓰지 않는다는 것이다. 이것은 DiffUtil이라는 안드로이드팀에서 제공하는 비교 알고리듬을 통해 기존 리스트와 새로운 리스트 내부 데이터 차이를 비교하여 바뀐부분만 업데이트 해준다. 사용해보니 무엇보다 코드가 간결해진다는 큰 장점이 있었다. ViewModel 일반적으로 ViewModel이라는 단어는 MVVM 패턴에서 보이는 단어이다. 어느 블로그 글을보니 MS에서 만든 MVVM은 View와 Data의 결합도를 낮춰 가독성좋고 유지보수하기 편한 구조를 만들기

[Android] 상속으로 중복코드 없애기(1): Add,Edit의 UI 같이 사용하기
Add와 Edit 보통 게시물 추가처럼 어떤 걸 추가할 수 있는 기능을 만들게 되면 특별한 이유가 없다면 수정 기능도 만들게 된다. 그럼 항상 이때 생기는 유혹이 Add와 Edit이 화면이 동일해서 ui에 관련된 코드는 같이 사용할 수 있는데.. -> edit에 관련된 메소드만 추가해서 같은 ViewModel을 사용해도 되지 않을까?? 그럼 ViewModel이 현재가 add인 상황인지 edit인 상황인지를 알아야 한다. -> isEdit이라는 변수를 만들어서 확인용으로 사용하자! 이렇게 되니 edit인 경우 다르게 처리해주어야 하는 경우 if~else문이 추가되면서 코드가 복잡해짐 예를 들어, 이미지의 경우 add일 때는 ByteArray로 처리했는데 edit일 때는 Uri로 처리한다면, showImage()같은 메서드가 edit일 때는 Uri로 보여주고 add일 때는 ByteArray로 보여주도록 if~else가 추가될 수 있다. 공통적으
[Android] Coroutine을 위한 exceptionHandler 만들어보기
사연 viewModel에서 repository를 이용해 http 통신을 할때 에러 발생시 앱이 종료되는 현상이 발생해서 viewModelScope에서 예외 처리는 어떻게 하는지 찾아보게 되었음 해결 네트워크 에러를 처리할 data class를 선언해준다 BaseViewModel이라는 클래스를 하나 만들고 거기에 공통적으로 사용할 예외 핸들러를 등록해준다 해당 클래스를 상속받아서 사용하는 방법은 아래와 같다 그리고 fetchState를 관찰하면서 에러에 대응하면 되는데 아래와 같이 해보았다. fetchState를 관찰하고 있다가 뭔가 문제가 발생했을때 해당 fetchState의 값을 가져와서 적절하게 예외를 처리해준다. 이런 방식으로 하니 앱이 종료되지 않고 정상적으로 예외를 처리할 수 있었다
[TIL] 230811 회고
Intro ViewModel과 LiveData를 공부하는중이다. ViewModel 간단하게 ViewModel에대해 구현해보았다. 요 앱은 flutter를 시작하면 나오는 기본 앱이랑 유사하게 클릭할때마다 숫자가 카운팅되어 화면에 디스플레이되는 간단한 앱이다. ViewModel을 배우는 이유가 대표적으로 안드로이드에서 화면이 Rotate될때 View를 새로그리게되는데 그때 기존 뷰에 남아있는 데이터들을 그대로 살리고싶을때 사용한다. View부분 심플하다. 그냥 버튼한개 텍스트뷰 한개가 끗. CountViewModel 여기도 심플한데 내가 뷰모델에관한 설명을 아무리봐도 구현하려고할때 감이 없어서 어떻게 시작해야할지 몰랐는데 Flutter의 Provider 구현하는거랑 살짝 비슷하게 느껴졌다. 구현하면서 느낀 핵심은 여기에 선언된 변수들은 Activity, Fragment의 생명주기에서 이들이 Destroy되지않는다면
[TIL] 230810 회고
Intro 오늘은 RecyclerView와 ViewModel에 대해 살펴보는 시간을 가졌다. 아직까지 ViewModel은 어떻게 써야할지 감도 안온다는게 함정.. RecyclerView 우리의 소리를 찾아서 느낌으로 ListView를 구현해보고 왜 ViewHolder 패턴이 필요하게되었는지 맛보기로 만들어보는 시간을 가졌다. 그리고 ViewHolder 패턴을 적용하기전 속도를 보는데 앱이 그냥 죽어버리더라..(item 개수가 1000개였지만 TextView하나였는데..) -자세한 내용은 여기에 ViewModel 음.. 일단 ViewModel은 앱에서 생명주기에 데이터가 영향을 받지않고 관리할 수 있게 만들어진것으로 이해하고있다. 대표적인 예가 ViewModel을 적용하지않은 앱에서 화면을 돌릴때 데이터가 초기화되는데 이게 무슨일일까? 를 많이 든
[Android] AAC 파헤치기 - 5) ViewModel, Lifecycle, LiveData 활용 예제 (Codelab)
이 포스트는 안드로이드 공식 Codelab 을 기반으로 작성되었습니다. https://developer.android.com/codelabs/android-lifecycles#0 이 Codelab 에서는 ViewModel , Lifecycle , LiveData 생명 주기를 인식하는 3가지 구성요소를 활용한 예제를 구현해본다. 1단계 - 환경 설정 아래 명령어를 실행해 예제 코드를 다운받는다. 코드를 다운받았으면 안드로이드 스튜디오를 열어서 프로젝트를 실행하고 root 디렉토리에서 아래 명령어를 실행한다. 맥OS / 리눅스 윈도우 처음 git 으로 코드를 다운 받았을 때 빌드 오류가 발생했는데 Android Studio에서 지시하는대로 gradle wrapper 버전을 업그레이드 해주었더니 정상적으로 진행되었다. 이 직접 데이터를 가져오고 빼오는걸 하는 책임이 있습니다. 그럼 한번 만들어 보겠습니다. Repository class 아직 기능이 없어서 뭔가 많이 없네요 그럼 설명을 하자면 repquestBookApi 은 비동기로 선언후 id,password, q
ViewModel
안드로이드 공식문서에서 개념을 참고했다. 간단한 카운트 증가,감소 앱을 만들어보며 개념을 이해하도록 노력했다. ViewModel 개념 -앱의 생명주기 변화시 데이터를 유지하게 해준다. -onSaveInstanceState를 사용해서 소량의 데이터를 관리할 수 있지만 ViewModel은 대량의 데이터를 관리하기에 편하다. -UI 컨트롤러로 ViewModel을 사용하면 데스트나 관리에 편하다 -ViewModel은 ViewModel scope에서 생명주기 전체를 관리한다 이점 지속성을 가지고 데이터가 소멸되지 않게 관리를 해준다는 장점이 있다. Xml Mainactivity.kt ViewModel.kt 개념을 적용시켜 이해를 할수 있었다.

[Android] Jetpack ViewModel이란
오늘 알아볼 ViewModel은 Android JetPack의 구성요소 중 하나이다. ViewModel이란 이름은 소프트웨어 개발 디자인 패턴 중 하나인 MVVM(Model-View-ViewModel) 디자인 패턴으로부터 파생되었다. MVVM의 관점에서 부르는 ViewModel과 Android Jetpack에 포함된 ViewModel클래스를 구분하기 위해 Android Jetpack에 포함된 ViewModel을 Android Architecture ViewModel의 약자인 AAC ViewModel이라고도 부른다. ViewModel 이란? Activity와 fragment와 같은 UI 컨트롤러의 로직에서 데이터를 다루는 로직을 분리하기 위해 등장한 Android JetPack 라이브러리이다. 왜 UI 컨트롤러와 데이터를 분리할까? UI 컨트롤러의 목적 데이터를 표시해주거나, 사용자가 어떤 작업을 했을 때 반응을 보여주거나, 권한 요청과 같은 OS
TIL) 230412
Data 클래스 copy() copy() 함수는 기본적으로 데이터 클래스의 모든 인스턴스에 제공된다. 이 함수는 일부 속성을 변경하지만 나머지 속성은 변경하지 않고 그대로 두기 위해 객체를 복사하는 데 사용된다. Room에서 가져온 값에 연산을 하려면 Flow가 아닌 LiveData를 활용하자 DataBinding을 활용해서 viewModel의 값을 활용하는 코드다. viewModel의 getAllChatList의 크기를 삼항연산자를 이용해 BindingAdpater로 전달하여 visibility를 조절하고 있다. 그런데 막상 코드를 실행하니 아래와 같은 오류가 났다. 💡 java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

[Android] ViewModel, 개념 이해하기
ViewModel 이란? > 소프트웨어 개발 아키텍처 패턴중 하나인 MVVM 아키텍처 패턴에서 파생된 개념으로 View와 Model 사이에서 매개체 역할을 하고, View의 데이터를 관리하는 역할을 한다. AAC ViewModel 이란? > Anroid Architecture ViewModel의 약자로, 생명주기를 고려하여 UI와 관련된 데이터들을 저장하고 관리하는 역할을 하는 Android Jetpack의 구성요소이다. ViewModel이 필요한 이유? > UI 컨트롤러의 데이터를 캡슐화하여 구성이 변경되어도 데이터를 유지하고, 과도한 책임을 분담하여 유지보수, 재사용성, 테스트 등을 용이하게 만들어 준다. ViewModel의 생명주기 ViewModel은 Activity처럼 생명주기를 가지고 있다. ViewModel의 생명주기는 Activity가 생성될 때 시작 되고 Activity가 종료될 때 함께 종료된다.

TIL) 230404
Dao 쿼리에서 Kotlin 값 참조하기 위 데이터 클래스에서 컬럼이 스네이크 케이스로 명명되어있지만, 코틀린에서는 카멜 케이스로 명명하기 때문에 @ColumnInfo 주석을 활용해 이름을 지정했다. 그리고 Dao 쿼리에서 값을 참조하기 위해 :를 사용한다. ViewModelFactory ViewModelFactory는 ViewModel 인스턴스를 생성하는 데 사용되는 클래스다. ViewModelProvider를 사용하여 ViewModel 인스턴스를 만들고 관리한다. ViewModelFactory는 ViewModel의 인스턴스화를 위해 필요한 데이터 또는 객체를 전달할 수 있도록 도와준다. 그래서 ViewModel이 생성될 때마다 인스턴스화해야 하는 클래스 또는 데이터가 있을 때 유용하다. 예를 들어 ViewModelFactory를 사용하여 데이터베이스 인스턴스를 ViewModel에 전달하면 ViewModel은 데이터

[android] ViewModel(AAC)
ViewModel이 뭘까? 구글 개발자들이 Clean Architecture를 쉽게 구현 할 수 있도록 라이브러리모음(Android Architecture Components)을 만들었는데 그중 하나가 바로 ViewModel이다. ViewModel은 class이며 수명 주기를 고려하여 UI 관련 데이터를 저장하고 관리하도록 설계되었다. ViewModel class를 사용하면 화면 회전과 같이 구성을 변경할 때도 데이터를 유지할 수 있다. 그래서 ViewModel을 왜쓰는걸까? 결론적으로는 화면 회전과 같이 구성을 변경할때 데이터를 유지 시킬수 있다, 그러면 onSaveInstanceState()를 쓰면 되는거 아닌가? 데이터가 단순한 경우는 onSaveInstanceState() 메서드를 사용

compose의 상태(state)를 알아보자!
Compose에서 상태(state)란? 시간이 지나면서 변할 수 있는 값을 말한다. room 데이터베이스부터 클래스까지 매우 다양하고, 예시는 다음과 같다. 채팅 앱에서 가장 최근에 수신된 메시지 사용자의 프로필 사진 recyclerView와 같은 list의 스크롤 위치 💡 상태에 따라 특정 시점에 UI에 표시되는 항목이 결정된다. Compose에서 이벤트(events)란? 상태가 시간이 지남에 따라 변하는 값이라면, 변하는 이유는 무엇일까? Android 앱에서는 이벤트에 대한 응답으로 상태를 업데이트하는 것이다. 그러니까 이벤트는 다음과 같다. 버튼 누르기 등으로 UI와 상호작용하는 사용자 기타 요인(예: 새 값을 전송하는 센서 또는 네트워크 응답) 💡 상태는 존재하고, 이벤트는 발생한다. UI 업데이트 루프를 아래
TIL) 230331
RecyclerView 아이템이 추가될 때 Animation 넣기 조건은 다음과 같다. 채팅 기능을 recyclerView로 구현하고 있기 때문에 특정 type에만 애니메이션을 넣으려고 한다. 아이템이 추가될 때 해당 아이템에만 애니메이션이 적용되어야 한다. 코드로 살펴보자. xml adapter 전체 코드를 살펴보면 좋을 것 같아서 전부 넣었다. 이제 요구 조건들을 해결하고 있는 블록을 떠와서 자세히보자. 우선 특정 type에만 애니메이션이 넣어져야 한다. 챗봇을 구현하는 recyclerview에 그려지는 type은 총 세 개로, BOT, USER, LINE인데 봇의 채팅이 출력되는 부분에만 애니메이션을 넣고 싶었다. 그래서 해당 부분의 ViewHolder에만 추가했다. 애니메이션 관련 코드는 init에 정의해야 한다. 그렇지 않고 bind 메서드에서 해결하게 되면 아이

TIL) 230330
android package와 androidx package Activity와 Fragment의 기본 틀을 미리 짜두고 싶어서 추상 클래스를 만들었다. viewBinding 부분을 제외하면 Fragment도 같은 구조를 사용하였기에 생략한다. 그리고 이 베이스 코드를 활용한 Activity 코드는 다음과 같다. 그런데 다음 오류를 발견했다. > Type argument is not within its bounds. Expected: ViewBinding Found: ActivityMainBinding > 분명 ViewBinding을 상속 받도록 코딩했는데 무슨 문제일까? 삽질 끝에 찾아보니 import한 ViewBinding 라이브러리가 어느 package에 속해있는지, 그리고da