안드로이드에서 API 서버와 통신을 하기 위한 라이브러리로 Retrofit2, Volley, HttpUrlConnection, OKHttp 등이 있다.
그중에서 가장 많이 사용되고 있는 라이브러리는 'Retrofit2'이고 이 라이브러리에 대해 자세히 알아보자.
Retrofit2는?
- Android에서 REST API 통신을 지원하기 위해 만들어진 라이브러리.
- 전달받는 데이터를 Client가 필요한 형태로 가공하여 전달받는 Type-Safe 한 HTTP 클라이언트 라이브러리.
- AsyncTask 없이 Background에서 작업을 수행하고 Callback을 통해 메인 스레드에서 동작.
- OkHttp 라이브러리의 상위 구현체.
Retrofit2의 장점
- 빨라진 성능
- 복잡하지 않은 구현
반복되는 작업들은 라이브러리들이 처리하고, 사용자는 필요한 구현에만 집중하면 된다. - 가독성
Interface 내의 어노테이션을 사용하여 호출 함수를 미리 지정/구현 없이 해당 함수를 호출만 하면 되므로 가독성이 증가하고
콜백 함수를 통한 직관적인 설계가 가능하다.
Retrofit2의 구성요소
- DTO (POJO)
- 'Data Transfer Object', 'Plain Old Java Object' 형태의 모델
- JSON 타입 변환에 사용됨
- InterFace
- 사용할 Http CRUD동작을 정의해놓은 InterFace
CRUD (Create/ Read/ Update/ Delete) -> Http Method (POST/ GET/ PUT/ DELETE)
- 사용할 Http CRUD동작을 정의해놓은 InterFace
- Retrofit.Builder 클래스
- Interface를 사용할 인스턴스로 baseUrl / Converter 설정
Retrofit2 사용 예제
1. Gradle 추가
// build.gradle(app)
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
2. Permission 추가
// AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
3. Model 생성
data class(
val id: Int,
val name: String,
@SerializedName("age")
val age: String
)
// @SerializedName을 사용하여 별도로 데이터 명칭을 일치시켜 주지않을 경우엔 클래스 변수명이 일치 해야한다.
4. Interface 정의
interface RetrofitService(
@GET("users/1")
fun getUser(): Call<User>
@GET("users/{index}")
fun getUserbyIndex(@Path)
)
5. Retrofit Builder 생성
object RetrofitManager {
var api: RetrofitService
init{
val retrofit = Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
api = retrofit.create(RetrofitService::class.java)
}
}
6. 요청 보내기
class UserViewModel : ViewModel() {
fun getUserInfo() = runCatching {
RetrofitManager.api.getUser()
}.getOrNull()
}
'Android' 카테고리의 다른 글
[Android] two-way binding 형식 지정하기 (0) | 2022.07.06 |
---|---|
[Android] Android Architecture Components(AAC) (0) | 2022.04.27 |
[Android] Shape에 margin 속성 추가하기 (0) | 2022.04.05 |
[Android] 디바이스 화면 해상도 구하기 (0) | 2022.03.28 |
[Android] CameraX (0) | 2022.01.10 |