서론
이전에 Retrofit에 대한 포스팅을 작성했었는데, Android project의 규모가 커질수록 API를 활용하는 경우가 잦아질 것이다.
인터페이스를 활용하여 API 응답 처리를 개인이 작성할 수도 있지만, Sandwich라는 간편한 라이브러리가 있어 간단하게 정리해보려고 한다.
Sanwich 라이브러리란?
- Kotlin의 Retrofi 네트워크 응답에서 표준화된 인터페이스 생성을 간소화하기 위해 고안된 라이브러리
- 다중 아키텍처 내에서 기능 연산자를 활용하여 데이터, 오류 및 예외처리를 효율적으로 할 수 있음
- Coroutine, Flow 등과 원활하게 통합되어 다양하게 활용 가능
사용법
build.gradle - 라이브러리 등록
dependencies {
implementation "com.github.skydoves:sandwich:1.3.9"
}
Retrofit Object - Retrofit Object에 CallAdapterFactory 추가
private val retrofit by lazy {
Retrofit.Builder()
.baseUrl(BaseurlConst.BaseUrl)
.client(mClient)
.addCallAdapterFactory(ApiResponseCallAdapterFactory.create()) //sandwich
.addConverterFactory(GsonConverterFactory.create()) //gson
.build()
}
Retrofit을 build 할 때 ApiResponseCallAdapterFactory를 활용해 준다.
Service Interface
@GET("/getIntroImage")
suspend fun requestIntroImage(): ApiResponse<IntroImageModel>
suspend로 API 호출 함수를 작성하고, 응답 데이터 형태를 ApiResponse로 정의한다.
API 호출 예시
val response = ysService.requestIntroImage()
response.onSuccess {
// API 호출이 성공적으로 이루어졌을 때
}.onError {
// API 호출에 error 발생
}.onException {
// API 호출에 excetion 발생
}
Sanwich 라이브러리를 활용하여, API 응답을 간단하게 해결 가능
ApiResponse Type
ApiResponse.Success : 해당 범위 안에서 본문 데이터에 직접 액세스 가능
val data: IntroImageModel? = response.data
val statusCode: StatusCode = response.statusCode
val headers: Headers = response.headers
- 네트워크 요청 성공을 의미하고, 응답의 데이터와 statusCode, Headers 등의 추가 정보를 얻을 수 있음
ApiResponse.Failure.Error / ApiResponse.Failure.Exception : message()를 활용하여 error body 확인 가능
val message: String = response.message()
val errorBody: ResponseBody? = response.errorBody
val statusCode: StatusCode = response.statusCode
val headers: Headers = response.headers
- 잘못된 요청이나 내부 서버 오류로 인해 네트워크 요청이 실패했음을 의미하고 오류 메시지, StatusCode 등의 추가 정보를 얻을 수 있음
마치며
최근 MVVM 패턴을 활용하여 Api 호출하는 프로젝트를 진행하고 있었는데, Api 호출이 점점 추가되면서 같은 코드가 반복되는 느낌이 들어 찾아본 라이브러리가 Sandwich 라이브러리다. 실제로 활용해 보니 Retrofit의 응답처리에 대한 코드가 2배는 줄어든 것 같다. Corutine, Flow 등을 활용하여 더 효율적으로 사용할 수 있다고 하니 부족한 부분을 추가적으로 공부해 볼 계획이다.
참고
GitHub - skydoves/sandwich: 🥪 An adaptable and lightweight sealed API library designed for Kotlin and Android, specializing i
🥪 An adaptable and lightweight sealed API library designed for Kotlin and Android, specializing in efficient Retrofit response modeling and exception handling. - GitHub - skydoves/sandwich: 🥪 An ad...
github.com