[TIL] 230918 회고

서정한·2023년 9월 19일
0

내일배움캠프 7기

목록 보기
48/66

Intro

  • 저번시간 MVVM구조를 실습해본데이어 오늘은 해당구조를 그대로 들고와 올해 상반기에 나왔던 카카오뱅크 문제를 풀어보는 중이다.
  • Retrofit, Glide를 사용해 처리중인데 처음 감잡기 어려웠던게 retrofit이었다.

Retrofit

  • retrofit은 Java(kotlin)인터페이스에서 http통신을 사용할수있도록 지원하는 라이브러리라고한다.(Retrofit turns your HTTP API into a Java interface. - 공식문서에서-)

Retrofit 사용법

  • 일단 공식문서는 한번 써보기전까진 이해하기가 쉽지않다..! 이거보고 바로 구현할수있을까?!?(물론 구현할 수 있는사람들이 있겠지...?)
  • 검색해서 구현해본 후 이해한 기본컨셉은 다음과같았다.
    1. retrofit.builder Object class
    1. GET POST등을 날릴 API interface가 필요하다.
    2. 그리고 응답결과를 받을 data class들이 필요하다.
    • 구현하면서 참고한 사이트: 여기.
  • 아래는 내가 카카오 이미지와 영상 검색결과를 받기위해 만든 interface와 data class들이다.
// retrofit 생성
object ContentClient {
    private const val BASE_URL = "https://dapi.kakao.com/"

    private val retrofit by lazy {
        Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }

    val imageApi by lazy {
        retrofit.create(ImageApi::class.java)
    }

    val videoApi by lazy {
        retrofit.create(VideoApi::class.java)
    }
}
// API Interface
interface ImageApi {
    @GET("v2/search/image")
    suspend fun searchImage(
        @Header("Authorization") apiKey: String = KakaoAuth.AUTH_HEADER,
        @Query("query") query: String,
        @Query("sort") sort: String,
        @Query("page") page: Int,
        @Query("size") size: Int
    ): retrofit2.Response<ImageSearchResponse>
}
// body에 넘어오는 응답정보
data class ImageSearchResponse(
    @SerializedName("meta")
    val metaData: MetaData?,

    @SerializedName("documents")
    var documents: MutableList<ImageData>?
)
// kakao에서 건네준 MetaData정보
data class MetaData(
    @SerializedName("pageable_count")
    val pageableCount: Int?,

    @SerializedName("total_count")
    val totalCount: Int?,

    @SerializedName("is_end")
    val isEnd: Boolean?
)
// document에서 받을 실제 데이터(이것보다 훨씬 더 많이 넘어오지만 필요한것만 받음.
data class ImageData(
    val id: Long,
    @SerializedName("datetime")
    val dateTime: String,
    @SerializedName("thumbnail_url")
    val thumbnail: String
)
  • 아래는 실제 사용부분이다. 보면 알 수 있듯 viewModel을 사용하였기때문에 실제 사용할때 ViewModelScope에서 코루틴을 통해 불러온다.
viewModelScope.launch {
            val list: MutableList<ContentData> = mutableListOf()
            val imageRes= repository.searchImage(query, "recency")
            val videoRes= repository.searchVideo(query, "recency")

            if(imageRes.isSuccessful && videoRes.isSuccessful) {
                imageRes.body()?.documents?.let {imageList ->
                        contentList.value = list
                }
            }
        }

retrofit을 쓰면서 느낀 가장 큰 장점은 interface와 데이터가 1:1 매칭된다는 것이다. 서버스펙이 바뀌어도 쉽게 대응할 수 있을 것 같다.

Outro

  • 지금은 구현해서 사용하는 정도의 수준이라서 일단 과제를 구현한 이후에 어떻게 돌아가는지 공부를 좀 해봐야겠다.
  • Glide도 사용했는데 사실 사용법 자체는 너무 심플하고 편해서 여기에 굳이 넣지는 않았다. 그러나 Glide역시 어떻게 돌아가는지 내부를 좀 들여다봐야할 것 같다..! 끄읕
profile
잘부탁드립니다!

0개의 댓글