본문 바로가기
TIL, WIL(일기)

230926 오늘의 억까(변수명의 중요성!)

by 도슬 2023. 9. 26.

문제점 : API를 이용해서 서버에서 데이터를 받아왔는데 앱에 표시가 안된다.

해결 과정

ViewModel 

apiService.getFavorites("snippet","mostPopular",10,"0")
    ?.enqueue(object : Callback<FavoritesData?> {
        override fun onResponse(call: Call<FavoritesData?>, response: Response<FavoritesData?>) {
            response.body()?.let {
                for(favorites in response.body()!!.items){
                    val title = favorites.snippet.title
                    val url = favorites.snippet.thumbnails.default.url
                    youtubeItems.add(YoutubeModel(Constants.FAVORITES_TYPE,title,url))
                    Log.d("YouTubeProjects", "Favorites데이터 : ${youtubeItems}")
                }
            }
            HomeResult()
        }

        override fun onFailure(call: Call<FavoritesData?>, t: Throwable) {
            Log.e("YouTubeProjects", "에러 : ${t.message}")
        }
    })

1. 우선 정상적으로 서버에서 데이터를 가져오는지 로그를 찍어 보았는데 위와 같이 너무 잘 찍힌다.(데이터로드 확인)

 

Adapter 

inner class FavoritesViewHolder(private val binding: FavoritesitemsBinding) : RecyclerView
.ViewHolder(binding.root){
    fun bind(item:YoutubeModel){
        binding.apply {
            Log.d("YouTubeProjects", "어댑터 데이터 : ${item.url}")
            homeTitle.text = item.title
            Glide.with(context)
                .load(item.url)
                .into(homeUrl)
        }
    }
}

2. 다음으로 뷰자체가 아무것도 안나와서 어댑터가 인식을 못하는건지 로그를 찍어봤는데 왠열, 로그자체가 안찍힌다.(데이터를 못받아오는것 확인)

 

 Adapter 

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    Log.d("YouTubeProjects", "onCreateViewHolder 호출되냐?")
   val binding =FavoritesitemsBinding.inflate(LayoutInflater.from(parent.context),parent,false)
    return FavoritesViewHolder(binding)
}

3. 혹시 몰라서 어댑터 자체가 호출안되는지 확인해보기위해 onCreateViewHolder에 로그를 찍어봤는데 호출자체가 안되었다.(어댑터 자체를 호출하지 않는것을 확인)

 

Fragment 

homeViewModel.homeResult.observe(viewLifecycleOwner){
    Log.d("YouTubeProjects", "프래그먼트 데이터 : ${it}")
    if(adapter !=null){
        Log.d("YouTubeProjects", "어댑터 정상작동?")
        adapter.items.addAll(it)
        Log.d("YouTubeProjects", "adapter.items에 뭐가 찍혀있는데?${adapter.items}")
        adapter.notifyDataSetChanged()

    } else Log.d("YouTubeProjects", "어댑터 널값?")
}

4. 어댑터가 호출되지 않는것을 보고 어댑터의 초기화가 재대로 되지않았는지 확인해보려고 로그를 찍어봤는데, 얘는 또 너무 잘 찍힌다. (데이터, 어댑터모두 정상적으로 초기화되고 데이터를 받아오고 있지만 어댑터는 호출하지않음)

 

 Fragment 

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View{

    setupView()
    setupListeners()

    return binding.root
}

5. 혹시나 onCreateView의 return값이 잘못되었나 봤지만 정상적으로 써져있었다.

 

 Fragment 

 6. 잘보면 1번 adapter를 HomeFragmentAdapter(requireContext())로 초기화했는데 맨 밑줄 adapter에 1번adapter를 넣어줘야되는데 2번어댑터와 1번어댑터가 서로 관련이 없어서 homeRecyclerView가 HomeFragmentAdapter를 인식못해서 어댑터를 호출못하고 결국 앱에 표시할 수 없었던거였다.

 

 

 

결론

변수명을 바꿔주니 서로 인식되어 정상적으로 데이터 출력이 되었고, 로그도 정상적으로 찍혔다.

귀찮다고 변수명을 대충 쓰지말고 규칙을 정해서 잘 써봐야겠다.

 

 

 

 

 

썸네일 출처

https://kr.freepik.com/free-photo/cute-ai-generated-cartoon-bunny_40572274.htm#query=%EA%B7%80%EC%97%AC%EC%9A%B4%20%EB%8F%99%EB%AC%BC&position=19&from_view=keyword&track=ais