다이어리 앱 3. ViewModel

woniwon·2024년 3월 18일
0

Android

목록 보기
13/19
post-thumbnail

ViewModel

DiaryViewModel

  • 전체 코드
    class DiaryViewModel(private val repository: DiaryRepository) : ViewModel() {
        fun insertDiary(title: String, content: String, createdDate: LocalDateTime) = viewModelScope.launch {
            val diary = Diary(title = title, content = content, createdDate = createdDate)
            repository.insertDiary(diary)
        }
    
        fun getDiary(id:Int) : LiveData<Diary> = repository.getDiary(id)
    
        val getAllDiaries: LiveData<List<Diary>> = repository.getALLDiaries()
    
        fun updateDiary(id: Int, title: String, content: String, createdDate: LocalDateTime) = viewModelScope.launch {
            val existingDiary = repository.getDiaryById(id) ?: return@launch
            val updatedDiary = existingDiary.copy(title = title, content = content, createdDate = createdDate, modifiedDate = LocalDateTime.now())
            repository.updateDiary(updatedDiary)
        }
    
        fun deleteDiary(diary: Diary) = viewModelScope.launch {
            repository.deleteDiary(diary)
        }
    }
    
    // ViewModel을 생성하기 위한 Factory 클래스
    class DiaryViewModelFactory(private val repository: DiaryRepository) : ViewModelProvider.Factory {
        override fun <T : ViewModel> create(modelClass: Class<T>): T {
            if (modelClass.isAssignableFrom(DiaryViewModel::class.java)) {
                @Suppress("UNCHECKED_CAST")
                return DiaryViewModel(repository) as T
            }
            throw IllegalArgumentException("Unknown ViewModel class")
        }
    }
fun insert(title: String, content: String, createdDate: LocalDateTime) = viewModelScope.launch {
    val diary = Diary(title = title, content = content, createdDate = createdDate)
    repository.insertDiary(diary)
}

viewModelScope

  • ViewModel 내에서 비동기 작업을 수행할 때 사용
  • ViewModel이 파괴될 때 자동으로 취소되므로 메모리 누수를 방지하는 데 도움

launch

  • launch는 코루틴을 시작하는 코루틴 빌더로 새 코루틴을 시작하면, 그 코루틴 내에서 비동기 작업을 실행할 수 있다.
  • launch 내부에서 실행되는 코드는 비동기적으로 실행되며, launch는 즉시 반환되어 다음 코드 라인으로 실행이 이어짐.
  • CoroutineScope의 확장 함수이며, 코루틴 스코프 내에서 호출. 여기서는 viewModelScope가 해당 스코프 역할을 합니다.

viewModelScope.launch 를 활용하면 ViewModel의 생명주기에 맞춰 비동기 작업을 간단하고 안전하게 처리 가능 -> 코루틴을 사용해 UI가 반응성 있게 유지되도록 하면서 백그라운드 작업을 처리하는 효율적 방법 + ViewModel이 파괴될 때 자동으로 코루틴이 취소되므로, 메모리 누수를 걱정하지 않아도 됨

return@launch

  • 해당 코루틴 블록의 실행을 중단하고 코루틴을 종료해라

DiaryViewModelFactory

DiaryViewModel 전체 코드 코멘트

  • getDiarygetAllDiaries 함수가 viewModleScope를 사용하지 않는 이유는이 두 함수는 비동기 작업을 내부적으로 처리하는 LiveData를 반환하기 때문이다.
  • getDiary가 함수인 이유와 getAllDiaries가 변수(또는 프로퍼티)인 이유
    1. getDiary(id: Int): 함수는 특정 조건(여기서는 id)에 따라 다른 결과를 반환할 수 있도록 매개변수를 필요로 할 때 사용

    2. getAllDiaries: 변하지 않는 값을 가지는 프로퍼티로 선언되었고, 함수로서 매개변수를 받을 필요가 없기 때문에 변수(또는 프로퍼티)로 구현됨.

      ⇒ 매개변수를 필요로 하는 동적인 데이터 조회는 함수를 통해 구현하고, 고정된 동작이나 변하지 않는 값을 제공하는 경우 변수(또는 프로퍼티)를 사용하여 구현하는 것이 일반적이다.

profile
단순 기록용 Velog 입니다.

0개의 댓글