마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

retrofit response와 lazycolumn 연동 하는 과정에서 오류가 납니다

0 추천

캘린더를 이용해서 요일 클릭시 년, 월, 일 데이터를 서버로 보내 서버에 저장된 값이 있다면 그 값을 받아와 응답값 중에 필요한 데이터를 추출해 LazyColumn에 넣어서 todolist를 띄울려고 하는데 연결은 잘 됐으나 뷰가 안띄워 지는데 질문합니다.

에러가 나는 부분은 없었습니다. ㅠㅠ 관련된 전체 코드 올립니다..

image

image

image

image

image

image

jongjoon (340 포인트) 님이 2023년 2월 4일 질문
package 명에 밑줄이 있는 걸 보면 아마도  package 명이 폴더명과 일치하지 않을 듯합니다.
package 명은 소문자에 underscore(_)가 없이 사용하시고 폴더명과 일치시켜주시는 것이 좋을듯 합니다.

1개의 답변

0 추천

먼저 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의  코루틴을 통해 네트워크를 처리하거나 상태처리를 하는데 좀 더 쉬우실 거라고 생각합니다.

spark (226,420 포인트) 님이 2023년 2월 4일 답변
spark님이 2023년 2월 4일 수정
...