먼저 TodoList 함수는 저런식으로 호출을 하시면 TodoList 함수를 포함한 함수가 recomposition될 때마다 매번 호출되기 때문에 아랫처럼, side effect에 집어넣으셔야 할 것 같습니다. (아래 코드가 정확하게 동작하는지는 장담할 수는 없지만 side-effect에 넣어야 하는 것은 맞을 겁니다)
LaunchedEffect(day.toString()) {
TodoList(text = day.toString())
}
그리고 readTodo함수가 데이터를 잘 가져오고 ViewModel을 사용하지 않는 다고 한다면, readTodo에 함수를 인자로 넘겨서 아래처럼 이벤트 처리가 가능할 겁니다.
fun readTodo(
token: String,
year: Int,
month: Int,
day: Int,
onSuccess: (ReadoTodoResposne) -> Unit,
onFailure: (Throwable) -> Unit
) {
....
override fun onFailure(call: Callable<ReadoTodoResposne>, t: Throwable) {
onFailure(t)
}
override fun onResponse(call: Callable<ReadoTodoResposne>, response<ReadoTodoResposne>) {
...
onSuccess(todoResponse)
}
}
이제 readTodo 함수를 호출하는 곳에서 onSuccess와 onFailure 함수를 아래처럼 추가해 줄 수 있을 겁니다.
AnimatedVisibility(isVisible) {
...
onCurrentDayClick {...
readTodo(
token = token,
year = year,
month = month,
day = day,
onSuccess = { response: TodoResponse ->
todoResponse.value = response // setter 문법은 틀릴 수 있으니, 확인하세요.
},
onFailure = { t: Throwable ->
// TODO: 에러처리
}
)
}
}
그리고 가능하다면 readTodo 함수에 사용되는 인자들은 아래처럼 클래스를 새로 정의해서 줄이시는 게 코드를 읽고 쓰는데 더 편리합니다.
data class TodoDate(
val year: Int,
val month: Int,
val date: Int
)
// Result는 Kotlin 에서 제공되는 클래스(https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-result/)
fun readTodo(token: String, date: TodoDate, onResponse: (Result) -> Unit) {
....
retrofit.requestTodo(token, date.year, date.moth, date.date)
...
override fun onFailure(call: Callable<ReadoTodoResposne>, t: Throwable) {
onResponse(Result.failure(t))
}
override fun onResponse(call: Callable<ReadoTodoResposne>, response<ReadoTodoResposne>) {
...
onResponse(Result.success(response))
}
}
그리고 Compose의 state관리 방법에 대해서 자세히 읽어보시고 진행하시면 좋을 것 같습니다.
https://developer.android.com/jetpack/compose/state
같은 내용의 다른 질문에서도 말씀드렸지만, 제가 컴포즈를 업무에 사용하지 않기 때문에, 컴포즈에 대해 아주 기초적인 지식밖에 없습니다. 따라서 보여드린 코드는 접근방식에 대한 것으로 이해하시면 좋을 것 같고 동작하지 않는 부분이 있다면, 그 부분들은 개발자 문서를 참고하시면서 보완하시면 좋을 것 같습니다. 그리고 개인적으로는 확실한 아키텍쳐가 없다면, ViewModel을 사용하시는 편이 Compose의 코루틴을 통해 네트워크를 처리하거나 상태처리를 하는데 좀 더 쉬우실 거라고 생각합니다.