data class Post(
@SerializedName("userId")
val myUserId : Int,
val id : Int,
val title : String,
val body : String
)
레트로핏의 3가지 구성요소 중 Model 역할을 할 data class를 생성해준다.
기본적으로 json 파일과 같은 이름의 변수이면 SerializedName 하지 않아도 되지만
만약 변수이름을 다르게하고 싶거나, json 파일의 이름이 한글이거나 할 경우엔 @SerializedName 어노테이션을 사용하여 역/직렬화를 해주면 된다.
인터페이스 생성
interface SimpleApi {
@GET("posts/1")
suspend fun getPost() : Post
}
레트로핏의 3가지 구성요소 중 Interface역할을 할 인터페이스를 생성해준다.
여기서 posts/1 의 요소를 가져오는 동작을 하는 메소드를 정의해준다.
인스턴스 생성
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)
}
}
object로 싱글톤으로 객체를 생성한다.
레트로핏의 3가지 구성요소 중 Retrofit.Builder 클래스 역할로 BASE_URL와 Converter를 설정해준다.
여기서 둘다 by lazy 로 늦은 초기화 해줌으로써,
api 변수가 사용될 때 초기화되고, 그 안에서 retrofit 변수를 사용하기 때문에 초기화 된다.
class Constants {
companion object{
const val BASE_URL = "https://jsonplaceholder.typicode.com"
}
}
또한 baseUrl은 따로 상수 클래스를 생성하여 별도로 관리해준다.
Repository 생성
class Repository {
suspend fun getPost() : Post {
return RetrofitInstance.api.getPost()
}
}
MVVM 패턴을 위해 데이터 통신을 하는 Repository 를 생성해준다.
여기서 통신한 값을 뷰모델에서 사용할 것이다.
ViewModel 생성
class MainViewModel(private val repository : Repository) : ViewModel() {
val myResponse : MutableLiveData<Post> = MutableLiveData()
fun getPost() {
viewModelScope.launch {
val response = repository.getPost()
myResponse.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
}
}
또한 뷰모델에서 파라미터로 Repository를 받아야 하기 때문에 Factory를 생성해준다.
메인액티비티
class MainActivity : AppCompatActivity() {
private lateinit var viewModel : MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val repository = Repository()
val viewModelFactory = MainViewModelFactory(repository)
viewModel = ViewModelProvider(this,viewModelFactory).get(MainViewModel::class.java)
viewModel.getPost()
viewModel.myResponse.observe(this, Observer {
Log.d("Response",it.myUserId.toString())
Log.d("Response",it.id.toString())
Log.d("Response",it.title)
Log.d("Response",it.body)
})
}
}
repository와 뷰모델을 연결해주고,
getPost()를 호출해주어 통신을 요청한다.
응답에 대한 결과를 옵저버가 감시하여 변경될 시 로그를 찍는다.
통신이 성공적으로 된 것을 알 수 있다.
❗ 하지만 존재하지 않는 페이지를 호출하는 등의 통신오류가 발생할 경우 충돌이 발생하게 된다.