Reflection : 자바의 기능 중 하나로, 클래스나 인터페이스의 정보에 직접 접근 가능케하는 API을 일컫는다.
직렬화 : 특정 데이터를 다른 CPU로 보내기 전 통신이 가능하면서도 나중에 재구성이 가능한 포맷으로 환해주는 행위
역직렬화 : 직렬화된 데이터를 다시 객체 형태로 변환하는 행위
@JsonClass Annotation : JSON Object에 대응되는 역할을 한다. 해당 Annotation은 JSON Object에 대응되는 클래스 생성 시 상단에 붙인다.
파라미터로 들어가는 generateAdapter를 true로 Set 해주어야 codegen 방식으로 직렬화, 역직렬화가 가능해진다.
@Json(name = "key-name") : JSON 내부의 Key-value 값에 붙인다. 해당 Annotation은 name 파라미터를 가지는데, 반드시 json 포맷의 key 값에 대응시켜야한다.
@JsonClass(generateAdapter = true)
data class Advice(
@Json(name = "slip") val slip : Slip
)
data class Advice(
@Json(name = "slip") val slip : Slip
)
data class Slip(
val id: Int,
val advice: String
)
interface AdviceService {
@GET("advice")
fun getAdvice() : Call<Advice>
@GET("advice")
suspend fun getAdviceSuspend() : Advice
companion object {
const val BASE_URL = "https://api.adviceslip.com/"
}
}
val retrofit = Retrofit.Builder()
.baseUrl(AdviceService.BASE_URL)
//Moshi 사용을 위한 ConverterFactory 설정 필수
.addConverterFactory(MoshiConverterFactory.create())
.build()
val adviceService = retrofit.create(AdviceService::class.java)
CoroutineScope(Dispatchers.IO).launch {
val advice = adviceService.getAdviceSuspend()
withContext(CoroutineScope(Dispatchers.Main).coroutineContext) {
binding?.textView?.text = advice.slip.advice
}
}