data class KakaoImage(
@SerializedName("display_sitename")
val sitename : String,
val collection : String,
val image_url : String
)
응답값중에 사용하고 싶은 값만 지정해주면된다.
metadata
data class MetaData(
@SerializedName("total_count")
val totalCount: Int?,
@SerializedName("is_end")
val isEnd: Boolean?
)
Response
data class ImageSearchResponse(
@SerializedName("meta")
val metaData: MetaData?,
@SerializedName("documents")
var documents: MutableList<KakaoImage>?
)
사이트에 나와있는대로 쿼리를 사용해주고 반환값은 아까 만든 ImageSearchResponse 데이터클래스를 사용한다.
API키를 필요로 하므로 헤더값으로 API 키값을 넘겨야한다.
// 상수 저장
class Constants {
companion object{
const val BASE_URL = "https://dapi.kakao.com"
// 개인 API 사용
const val AUTH_HEADER = "KakaoAK $REST_API_KEY"
}
}
상수는 Constants 클래스를 만들어 따로 관리하였다.
헤더의 API키 값 자리는
Apikey 클래스를 따로 만들어 선언해주었으며
Apikey는 노출되면 안되기 때문에 gitignore로 숨겨주었다.
Retrofit.Builder
// 인터페이스를 사용하는 인스턴스. Builder는 BASE_URL와 Converter를 설정
object RetrofitInstance {
private val retrofit by lazy {
Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
val api : SimpleApi by lazy {
retrofit.create(SimpleApi::class.java)
}
}
실질적으로 통신하는 공간인 레포지토리를 생성해주어 페이지, 사이즈 파라미터는 그냥 하드코딩 해주었다.
ViewModel
class MainViewModel(private val repository : Repository) : ViewModel() {
val myCustomPosts : MutableLiveData<Response<ImageSearchResponse>> = MutableLiveData()
fun searchImage(){
viewModelScope.launch {
val response = repository.searchImage("페이커","accuracy")
myCustomPosts.value = response
}
}
}
라이브데이터를 생성해주고
코루틴으로 통신하여 결과값을 라이브데이터에 할당해준다.
여기서도 검색어 파라미터를 페이커, 정렬을 정확도 순으로 하드코딩해주었다.
ViewModelFactory
// 뷰모델에 인자를 넘겨주기 위한 팩토리 메서드
class MainViewModelFactory(
private val repository : Repository
) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return MainViewModel(repository) as T
}
}
뷰모델에서 레포지토리에 접근해야 하므로 그 파라미터를 전달받기 위한 팩토리메서드를 정의해준다.
메인액티비티
class MainActivity : AppCompatActivity() {
private lateinit var viewModel : MainViewModel
private lateinit var binding : ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 뷰바인딩
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val repository = Repository()
val viewModelFactory = MainViewModelFactory(repository)
viewModel = ViewModelProvider(this,viewModelFactory).get(MainViewModel::class.java)
binding.button.setOnClickListener {
viewModel.searchImage()
}
viewModel.myCustomPosts.observe(this, Observer { result ->
if(result.isSuccessful){
Log.d("test5", "$result")
for(i in result.body()!!.documents!!){
Log.d("test5", "$i")
}
binding.textView.text = result.body()!!.documents?.get(0)!!.image_url
}
else{
Log.d("test5", "fail")
}
})
}
}