2024. 1. 4. 00:55ㆍ- 안드로이드/kotlin
retrofit2 라이브러리
retrofit2는 무엇인가?
REST API 통신을 위해 구현된 OkHTTP HTTP 통신을 간편하게 만들어주는 라이브러리를 말합니다. 동일 Squareup사의 OkHttp 라이브러리의 상위 구현체라고 보시면 되겠습니다.
retrofit2의 장점 3가지
1. OkHTTP 사용 시에 AsyncTask를 통해 비동기로 실행하여 속도가 느립니다. 하지만 retrofit2에서는 자체적 비동기 실행과 스레드 관리가 가능하여 속도가 빠릅니다. (AsyncTask의 3~10배 성능 차이가남)
2. 함수 호출 시에 파라미터를 넘겨주어 작업량이 감소 합니다.
3. Interface 내에서 어노테이션을 사용하여 호출 함수를 미리 지정. 구현 없이 해당 함수를 호출만 해주면 retrofit2이 자동으로 REST API를 구현합니다. 또한 콜백 함수를 통한 직관적 설계가 가능합니다.
retrofit2의 구성요소 3가지
1. DTO (POJO) : Data Transfer Object, Plain Old Java Object 형태의 모델 / JSON 타입변환에 사용
2. Interface : 사용할 HTTP CRUD 동작들을 정의해놓은 인터페이스
3. retrofit.Builder 클래스 : Interface를 사용할 인스턴스, baseUrl / Converter(변환기) 설정
retrofit2 직접 적용하여 사용방법에 대해 알아보겠습니다.
Gradle 추가
앱수준의 build.gradle 에 의존성을 추가해줍니다.
// Retrofit 라이브러리
implementation("com.squareup.retrofit2:retrofit:2.6.4")
// Gson 변환기 라이브러리
implementation("com.squareup.retrofit2:converter-gson:2.6.4")
// Scalars 변환기 라이브러리
implementation("com.squareup.retrofit2:converter-scalars:2.6.4")
Permission 설정
manifest에 아래 코드를 추가해줍니다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
...
<uses-permission android:name="android.permission.INTERNET"/>
...
</manifest>
DTO 모델 클래스 생성
REST API 요청할때 사용할 DTO 입니다.
LoginGoogleRequestModel.class
data class LoginGoogleRequestModel(
@SerializedName("grant_type")
private val grant_type: String,
@SerializedName("client_id")
private val client_id: String,
@SerializedName("client_secret")
private val client_secret: String,
@SerializedName("code")
private val code: String
)
사용할 JSON 키값을 @SerializedName("키값")과 일치 시켜 작성해줍니다.
응답받을때 사용할 DTO 입니다.
LoginGoogleResponseModel.class
data class LoginGoogleResponseModel(
@SerializedName("access_token") var access_token: String,
)
Interface 작성
LoginService.interface
interface LoginService {
@POST("oauth2/v4/token")
fun getAccessToken(
@Body request: LoginGoogleRequestModel
): Call<LoginGoogleResponseModel>
// @POST("login")
// @Headers("content-type: application/json")
// fun sendAccessToken(
// @Body accessToken: SendAccessTokenModel
// ): Call<String>
companion object {
private val gson = GsonBuilder().setLenient().create()
fun loginRetrofit(baseUrl: String): LoginService {
return Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
.create(LoginService::class.java)
}
}
}
@POST() 안에는 baseurl 뒤에 나머지 주소를 적어 줍니다. @POST에는 @Body 값을 추가 할 수 있습니다. REST API 형식에 맞게 모델 클래스 데이터를 추가 하여 요청합니다. Call<응답 받을 객체> 를 추가하여 응답 받는 JSON에 맞게 객체를 추가해 줍니다.
위에 사용한 어노테이션 말고도 많은 어노테이션이 있습니다.
어노테이션 정리
@Path
@GET("/{folder}/board.json")
fun getBoardJsonByPath(@Path("folder") path: String) : Call<BoardItem>
//파라미터 path로 받은 값을 윗줄 {folder}위치에 들어가서 경로를 지정한다.
url의 경로를 동적으로 지정할때 사용합니다.
@Query (GET방식)
@GET("/Retrofit/getTest.php")
fun getMethodTest(@Query("name") name: String, @Query("msg") msg: String) : Call<BoardItem>
//get파라미터 키를@Query("msg") 로 명시해준다, (키,값)
//@Query("key") value: String 식별자(key)와 값 value를 서버 php에 전달
get 방식에서 쿼리스트링 값을 추가 할때 @Query 를 사용합니다.
@QueryMap (GET방식)
@GET("/Retrofit/getTest.php")
fun getmethodTest3(@QueryMap datas: Map<String, String>) : Call<BoardItem>
// GET방식으로 보낼 값들을 Map collection으로 한방에 보내기 ( 한방에 보낼때 쓰는 어노테이션 @QueryMap )
// Map<key값 자료형, value 자료형> , 앞에꺼 키의 자료형 뒤에꺼 값의 자료형
@Body (POST방식)
@POST("/Retrofit/postTest.php")
fun postMethodTest(@Body item: BoardItem) : Call<BoardItem>
// POST방식으로 데이터 보내기 ( @Body ) - 객체를 전달하면 자동으로 json문자열로 변환(시리얼라이어블)하여 Body데이터에 넣어 서버로 전송
// 객체 자체를 보냄(BoardItem객체의 멤버변수(name,msg) 하나하나를 데이터로 보내는게 아님)
@Field (POST방식)
@FormUrlEncoded
@POST("/Retrofit/postTest2.php")
fun postMethodTest2(@Field("name") name: String, @Field("msg") msg: String) : Call<BoardItem>
// POST방식에서 멤버값들을 GET방식처럼 별도로 보내고 싶을때 ( @Field )
// @Field 는 반드시 @FormUrlEncode와 함께 써야함 (비주얼 스튜디오 코드의 form의 enctype="multipart/form-data" 이 설정을 한다고 생각해라)
@Headers
@Headers("Content-Type: application/json;charset=UTF-8")
@GET("/Retrofit/postTest2.php")
fun getParkInfo(): Call<BoardItem>
@Header
@POST("/app/DALONG")
fun getJsonString(@Header("Content-Type") String ContentType,
@Header("bx-timestamp-v1") nowDate: String,
@Header("bx-signature-v1") Encryption: String,
@Header("user-agent") user_agent: String,
@Body jsonItem: String) : Call<String>
Retrofit 호출
LoginService.loginRetrofit({BaseUrl}).getAccessToken(
request = LoginGoogleRequestModel(
grant_type = "authorization_code",
client_id = {google_login_client_id},
client_secret = {google_login_client_secret},
code = authCode.orEmpty()
)
).enqueue(object : Callback<LoginGoogleResponseModel> {
override fun onResponse(call: Call<LoginGoogleResponseModel>, response: Response<LoginGoogleResponseModel>) {
if(response.isSuccessful) {
// 응답값 처리
var data: LoginGoogleResponseModel? = response.body()
}
}
override fun onFailure(call: Call<LoginGoogleResponseModel>, t: Throwable) {
Log.e(TAG, "getOnFailure: ",t.fillInStackTrace() )
}
})
'- 안드로이드 > kotlin' 카테고리의 다른 글
Android kotlin jitpack로 라이브러리 사용하기 (0) | 2024.01.18 |
---|---|
코틀린 안드로이드 스튜디오 다크모드 비활성화 (0) | 2024.01.10 |
코틀린 fragment 화면 전환시 이전 화면 유지하기 (0) | 2023.12.17 |
getLaunchIntentForPackage로 다른앱 실행시키기 (0) | 2023.12.06 |
코틀린 뷰 바인딩 view binding 사용하기 (0) | 2023.12.06 |