전에 Retrofit을 주제로 포스팅했던 글에서 이어서 작성을 해보겠다.
간단하게 아래와 같은 api를 여러 개 불러온다고 가정해보자.
@GET("posts/{number}")
fun getPostNumber(
@Path("number") number : Int
) : Call<Post>
api.getPost1().enqueue(object : Callback<Post>{
override fun onResponse(call: Call<Post>, response: Response<Post>) {
Log.d("API1", response.body().toString())
}
override fun onFailure(call: Call<Post>, t: Throwable) {
Log.d("API1", "fail")
}
})
api.getPostNumber(2).enqueue(object : Callback<Post>{
override fun onResponse(call: Call<Post>, response: Response<Post>) {
Log.d("API2", response.body().toString())
}
override fun onFailure(call: Call<Post>, t: Throwable) {
Log.d("API2", "fail")
}
})
이렇게 posts/{number}를 1, 2, 3, 4 위의 코드처럼 차례대로 불러온다고 가정해본다면,
처음 접하는 사람들은 1, 2, 3, 4이렇게 차례대로 실행된다고 예상할 것이다.
하지만 실제로 이 순서는 매우 달라진다.
왜냐하면 비동기적으로 실행되기 때문이다.
예를 들어, 된장찌개를 끓인다고 가정했을 때,
1. 물끓이기 -> 2. 두부, 야채 등 썰기 -> 3. 양념 만들기 -> 4. 밥하기 등 순서가 있을 것이다.
하지만 우리는 단계가 모두 완료되어야만 다음단계로 넘어가지 않는다.
즉, 동기적으로 실행하지 않고, 물끓이는 동안, 야채 등, 양념을 만들어 비동기적으로 실행하곤한다.
따라서 위의 코드도 api1이 실행되는 동안, 2, 3, 4가 먼저 실행되면 그 부터 로그가 찍혔던 것이다.
하지만!! 예를 들어, 1에서 유저정보 가져온 데이터 기반으로, 2에서 실행하고 2에서 가져온 정보로
3에서 실행된다면 1, 2, 3, 4 꼭 이 순서로 실행되어야만 한다.
그럼 다음과 같이 만들어줄 수 있다.
api.getPost1().enqueue(object : Callback<Post>{
override fun onResponse(call: Call<Post>, response: Response<Post>) {
Log.d("API1", response.body().toString())
api.getPostNumber(2).enqueue(object : Callback<Post>{
override fun onResponse(call: Call<Post>, response: Response<Post>) {
Log.d("API2", response.body().toString())
}
override fun onFailure(call: Call<Post>, t: Throwable) {
Log.d("API2", "fail")
}
})
}
override fun onFailure(call: Call<Post>, t: Throwable) {
Log.d("API1", "fail")
}
})
이렇게 api1 이 성공했을 때 api2를 호출하고 2안에 3, 3안에 4 이렇게 코드를 구현하면
1, 2, 3, 4 순차적으로 실행된다.
하지만 이렇게하면 callBack이 서로서로 붙어있어 코드가 엄청나게 복잡해질 우려가 있고,
이로인해 코드의 가독성이 매우 떨어지게 된다.
이렇게 기존의 Retrofit에는 CallBack Hell이라 불리는 콜백이 서로서로 붙어있는 문제가 있었다.
이러한 것을 해결하기 위해선 Coroutine을 사용해볼 수 있다.
'Android > JETPACK' 카테고리의 다른 글
[JETPACK개론] Retrofit 예제 + RecyclerView (0) | 2022.08.27 |
---|---|
[JETPACK개론] Coroutine / ViewModelScope (0) | 2022.08.26 |
[JETPACK개론] Retrofit (0) | 2022.08.24 |
[JETPACK개론] DataBinding + ViewModel + LiveData (0) | 2022.08.21 |
[JETPACK개론] Map / SwitchMap (0) | 2022.08.20 |