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)
}
ViewModel
내에서 비동기 작업을 수행할 때 사용ViewModel
이 파괴될 때 자동으로 취소되므로 메모리 누수를 방지하는 데 도움launch
는 코루틴을 시작하는 코루틴 빌더로 새 코루틴을 시작하면, 그 코루틴 내에서 비동기 작업을 실행할 수 있다.launch
내부에서 실행되는 코드는 비동기적으로 실행되며, launch
는 즉시 반환되어 다음 코드 라인으로 실행이 이어짐.CoroutineScope
의 확장 함수이며, 코루틴 스코프 내에서 호출. 여기서는 viewModelScope
가 해당 스코프 역할을 합니다.⇒ viewModelScope.launch
를 활용하면 ViewModel
의 생명주기에 맞춰 비동기 작업을 간단하고 안전하게 처리 가능 -> 코루틴을 사용해 UI가 반응성 있게 유지되도록 하면서 백그라운드 작업을 처리하는 효율적 방법 + ViewModel
이 파괴될 때 자동으로 코루틴이 취소되므로, 메모리 누수를 걱정하지 않아도 됨
getDiary
와 getAllDiaries
함수가 viewModleScope
를 사용하지 않는 이유는이 두 함수는 비동기 작업을 내부적으로 처리하는 LiveData
를 반환하기 때문이다.getDiary
가 함수인 이유와 getAllDiaries
가 변수(또는 프로퍼티)인 이유getDiary(id: Int)
: 함수는 특정 조건(여기서는 id
)에 따라 다른 결과를 반환할 수 있도록 매개변수를 필요로 할 때 사용
getAllDiaries
: 변하지 않는 값을 가지는 프로퍼티로 선언되었고, 함수로서 매개변수를 받을 필요가 없기 때문에 변수(또는 프로퍼티)로 구현됨.
⇒ 매개변수를 필요로 하는 동적인 데이터 조회는 함수를 통해 구현하고, 고정된 동작이나 변하지 않는 값을 제공하는 경우 변수(또는 프로퍼티)를 사용하여 구현하는 것이 일반적이다.