1. Android 앱개발 심화 개인과제
어제 그렇게나 Retrofit을 완성시키려고 별에별 짓을 다 했는데도 결국 완성시키지 못했다.
수많은 오류 투성이만 맛봤을 뿐.
오늘은 이 Retrofit만 붙잡는 데에 3일이나 지났는데 과연 완성시킬 수 있을까?
Retrofit
결론부터 말하자면, 드디어 완성했다!
다음은 검색 기능을 구현시킨 동영상이다.
(지금 좋아요 기능을 추가한다고 좋아요 버튼이 떡하니 있는데 이것도 고쳐야 한다)
(젠장 또 대상혁이야)
그래도 이 앱의 존재의의의 70%나 차지하는 부분을 완성시키니 새삼 감격스럽기까지 하다.
그러면 지금까지 뭐가 문제였을까?
우선은 Fragment 부분.
SearchFragment.kt
class SearchFragment : Fragment() {
private var _binding: FragmentSearchBinding? = null
private val binding get() = _binding!!
private lateinit var adapter: SearchAdapter
private val items = mutableListOf<Document>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentSearchBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
with(binding) {
adapter = SearchAdapter(items)
recyclerview.adapter = adapter
recyclerview.layoutManager = GridLayoutManager(context, 2)
btnSearch.setOnClickListener {
val keyword = etSearch.text.toString()
callKeyword(keyword)
hideKeyboard()
saveData()
loadData()
}
}
}
private fun callKeyword(keyword: String) {
NetworkClient.searchApi.getSearchResult("KakaoAK $REST_API_KEY", query = keyword)
.enqueue(object : Callback<Search> {
@SuppressLint("NotifyDataSetChanged")
override fun onResponse(call: Call<Search>, response: Response<Search>) {
val body = response.body()
body?.let {
items.addAll(it.documents)
}
adapter.notifyDataSetChanged()
Log.d("api검사", "$items")
}
override fun onFailure(call: Call<Search>, t: Throwable) {
Log.d("api검사", "네트워크 오류 / 데이터변환 오류.")
}
})
}
private fun hideKeyboard() {
val inputMethodManager =
requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(view?.windowToken, 0)
}
private fun saveData() {
val pref = requireActivity().getSharedPreferences("pref", Context.MODE_PRIVATE)
val edit = pref.edit()
edit.putString("name", binding.etSearch.text.toString())
edit.apply()
}
private fun loadData() {
val pref = requireActivity().getSharedPreferences("pref", Context.MODE_PRIVATE)
binding.etSearch.setText(pref.getString("name", ""))
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
우선 처음에는 저기서 callKeyword 부분이 잘못된 건 줄 알고 저기만 이것저것 고쳤다. 왜냐하면 검색 버튼을 누르니 앱이 강제 종료가 되면 보통은 저기 부분을 의심하게 되니까.
그래도 고쳐지지 않아서 Logcat을 유--심히 살펴보다가 알게 된 1가지.
with(binding) 밑에 있는
adapter = SearchAdapter(items) 이 부분.
이 쪽에 adapter 앞에 val을 붙이는, 즉 위에서 lateinit var로 변수 선언을 했는데 중복으로 선언을 하는 크나큰 실수를 저질렀다!
이게 앱이 강제 종료되는 이유였다.
하지만, 그걸 고친 이후에도 응답이 여전히 오지 않았는데 이게 Response가 failure가 오는 것도 아니고 아예 응답 자체가 오질 않았다.
그 다음에는 Adapter.kt도 이리저리 만져보고, Object 부분도 이리저리 만져봤지만 여전히 먹통.
이제는 뭐가 문제일까 싶어서 interface를 찬찬히 살펴보다가 알게 됐다.
그 다음 내가 실수한 부분을.
이건 이전에 적은 코드와 수정한 코드를 비교하면서 살펴보자.
interface NetworkInterface {
@Headers("Authorization: KakaoAK ${REST_API_KEY}")
@GET("kakao")
suspend fun getSearchResult(
@Query("query") query: String,
@Query("sort") sort: String,
@Query("page") page: Int,
@Query("size") size: Int = 80
): Search
}
이것이 수정 전의 interface.
interface NetworkInterface {
@GET("v2/search/image")
fun getSearchResult(
@Header("Authorization") apiKey: String = "KakaoAK $REST_API_KEY",
@Query("query") query: String,
@Query("size") size: Int = 80
): Call<Search>
}
그리고 이것이 수정 후의 interface.
이전 코드에서 어떤 것이 문제였는지 보이는가?
참고로, 이렇게 보면 바로 한 눈에 알 수 있다.
그렇다.
@GET은 폼이 아니다.
https://dapi.kakao.com 은 BASE_URI이고, GET 부분에 나머지 URL인 'v2/search/image'를 넣었어야 했는데 나는 그냥 코드에 이름 짓듯이 그냥 무지성으로 kakao를 넣어서 응답이 오지 않았던 것.
역시 배움의 길은 멀고도 험하다.
이렇게 또 하나 배워나간다.
이렇게 장장 3일간의 똥꼬쇼노력 끝에 앱 구실은 만들었다.
이제 남은 건 클릭하면 좋아요 버튼이 생기는 것과, 좋아요 버튼이 생긴 이미지를 MyPage에 보이게 하는 것.
이건 Retrofit 이상으로 꽤나 힘들겠지만, 어떻게든 만들어봐야지.
'[TIL][내일배움캠프]' 카테고리의 다른 글
[내일배움캠프][TIL] 24.02.02 (금) - MVVM (0) | 2024.02.02 |
---|---|
[내일배움캠프][TIL] 24.02.01 (목) - Android 앱개발 심화 개인과제 : 좋아요 기능 추가 (1) | 2024.02.01 |
[내일배움캠프][TIL] 24.01.30 (화) - Android 앱개발 심화 개인과제 : 문제해결 (1) | 2024.01.30 |
[내일배움캠프][TIL] 24.01.29 (월) - Android 앱개발 심화 개인과제 : Retrofit (1) | 2024.01.29 |
[내일배움캠프][TIL] 24.01.26 (금) - Android 앱개발 심화 개인과제 : 카카오 API / UI 기초작업 (1) | 2024.01.26 |