Retrofit2 - REST API 통신 라이브러리?
- API 통신을 위해 구현된 OkHTTP의 HTTP 통신을 간편하게 만들어주는 라이브러리를 뜻함
- Async Task가 없이 Background 쓰레드를 실행 -> CallBack을 통하여 Main Thread에서 UI를 업데이트
- 동일 Squareup사의 OkHttp 라이브러리의 상위 구현체
Retrofit2의 장점 3가지
-Retrofit2의 장점은 3가지로 볼 수 있음 -> (속도, 편의성, 가독성)
- OkHTTP 사용 시에 AsyncTask를 통해 비동기로 실행하여 속도가 느린이슈. 하지만 Retrofit2에서는 자체적 비동기 실행과 스레드 관리가 가능하여 속도를 빠르다는 장점! (AsyncTask의 3~10배 성능 차이가 난다고 함)
- 함수 호출 시에 파라미터를 넘겨주어 작업량이 감소
- Interface 내에서 어노테이션을 사용하여 호출 함수를 미리 지정, 구현 없이 해당 함수를 호출만 해주면 되기 때문에 코드를 읽기에 매우 편합니다. 또한 콜백 함수를 통한 직관적 설계가 가능
- 동기/비동기 쉬운 구현
* 동기 Synchronous: 동시에 일어난다는 의미, 요청-응답이 하나의 트랜잭션(작업)에서 발생, 요청 후 응답까지 대기한다는 의미
* 비동기 Asynchronous: 동시에 일어나지 않는다는 뜻, 요청-응답은 별개의 트랜잭션, 요청 후 응답이 도착하면 Callback으로 받아서 처리
Retrofit2의 구성요소 3가지
- DTO (POJO) - 'Data Transfer Object', 'Plain Old Java Object' 형태의 모델(Model) / JSON 타입변환에 사용
- Interface - 사용할 HTTP CRUD동작(메소드) 들을 정의해놓은 인터페이스
* CRUD ( Create / Read / Update / Delete ) -> HTTP Method ( POST / GET / PUT / DELETE ) - Retrofit.Builder 클래스 - Interface를 사용할 인스턴스, baseUrl(URL) / Converter(변환기) 설정
Retrofit2 예제
1. Gradle 추가
// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
2. Permission (인터넷 권한) 설정
3. DTO / POJO - 모델 클래스 생성
//ExampleResponse.kt
data class User(
@SerializedName("userId")
val userId: Int,
@SerializedName("id")
val id: String,
@SerializedName("body")
val body: String
// @SerializedName으로 일치시켜 주지않을 경우엔 클래스 변수명이 일치해야함
// @SerializedName()로 변수명을 입치시켜주면 클래스 변수명이 달라도 알아서 매핑
)
- 위처럼 JSON 데이터 속성명, 변수명 + 타입(String, Boolean) 일치필수
- JSON - @SerializedName("속성명")으로 속성명 일치시켜주면 변수명 다르게 사용 가능
- XML - @Element(name="속성명")으로 XML은 @Element 애노테이션 사용
4. Interface 정의
//RetorifitService.kt
interface RetrofitService {
//GET 예제
@GET("posts/1")
fun getUser(): Call<User>
@GET("posts/{page}")
fun getUserPage(@Path("page") page: String): Call<User>
// @GET("posts/1")
// fun getStudent(@Query("school_id") schoolId: Int,
// @Query("grade") grade: Int,
// @Query("classroom") classroom: Int): Call<ExampleResponse>
//
//
// //POST 예제 - 1(@Field를 사용O -> @FormUrlEncoded 선언)
// @FormUrlEncoded
// @POST("posts")
// fun getContactsObject(@Field("idx") idx: String): Call<JsonObject>
// //POST 예제 - 2(@Field를 사용X -> @FormUrlEncoded 미선언)
// @POST("posts")
// fun getContactsObject2(@Body dataObj: DataObj): Call<JsonObject>
}
5. Retrofit2 인스턴스 생성
//MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val retrofit = Retrofit.Builder().baseUrl("https://jsonplaceholder.typicode.com/")
.addConverterFactory(GsonConverterFactory.create()).build();
val service = retrofit.create(RetrofitService::class.java);
service.getUserPage("1")?.enqueue(object : Callback<User>{
override fun onResponse(call: Call<User>, response: Response<User>) {
if(response.isSuccessful){
// 정상적으로 통신이 성고된 경우
var result: User? = response.body()
Log.d("YMC", "onResponse 성공: " + result?.toString());
}else{
// 통신이 실패한 경우(응답코드 3xx, 4xx 등)
Log.d("YMC", "onResponse 실패")
}
}
override fun onFailure(call: Call<User>, t: Throwable) {
// 통신 실패 (인터넷 끊킴, 예외 발생 등 시스템적인 이유)
Log.d("YMC", "onFailure 에러: " + t.message.toString());
}
})
}
}
6. 응답결과
- 정상적인 응답 -> User 객체 변환 성공
글 정리 & 소스코드
[소스코드]
Retrofit2: https://github.com/younminchan/kotlin-study/tree/main/retrofit2_kotlin
[관련문서]
MVVM 디자인패턴: https://github.com/younminchan/kotlin-mvvm
질문 또는 궁굼한 부분은 댓글을 남겨주세요! 친절하게 답변드리겠습니다!
응원의 댓글은 저에게 큰 힘이 된답니다! :)
즐거운 하루되세요!
깃허브 보러 놀러오세요 👇 (맞팔환영)
https://github.com/younminchan
'🖥 Programming > 📱 Android (Kotlin)' 카테고리의 다른 글
[Android][kotlin] MVVM 패턴공부 (0) | 2021.10.30 |
---|---|
[Android][kotlin] DataBinding & LiveData 같이 사용하기 (0) | 2021.10.28 |
[Andorid][kotlin] Android JetPack 구성도 (0) | 2021.10.27 |
[Android][kotlin] LiveData 알아보기 (0) | 2021.10.26 |
[Android][kotlin] ViewBinding (뷰바인딩) (0) | 2021.10.25 |
[Android][kotlin] Execution failed for task ':app:dataBindingMergeDependencyArtifactsDebug'. 오류 해결 (0) | 2021.10.22 |
[Android] RecyclerView (리사이클러뷰) 알아보기 (0) | 2021.10.22 |
[Android][kotlin] No type arguments expected for class Call 에러 (0) | 2021.10.21 |