본문 바로가기
Android/Android Studio

[안드로이드/Kotlin] Retrofit2 + okhttp 개념

by YOONAYEON 2022. 6. 27.
서버 통신 라이브러리

 

OkHttp

 

- REST API, Http통신을 간편하게 구현할 수 있도록 다양한 기능을 제공해주는 Java 오픈소스 라이브러리

- Retrofit 라이브러리의 베이스

 

 

Retrofit2

 

- Rest API 통신을 위한 라이브러리

- AsyncTask가 없이 Background스레드를 실행 -> CallBack을 통하여 Main Thread에서 UI를 업데이트

-  OkHttp를 기반으로 더 안전하고 직관적으로 사용할 수 있게 만들어진 라이브러리

 

<OkHttp와의 차이점>

- Annotation사용으로 코드의 가독성이 좋고, 직관적인 설계 가능

- 통신 결과값을 JSON으로 변환해 줄 필요없이 바로 객체 대입 가능

- 결과값을 메인 스레드에서 바로 사용 가능

 

✔️ okhttp의 경우 네트워크 Intercepter를 통해 API가 통신되는 모든 활동을 모니터링할 수 있으며 서버 통신 시간 조절이 가능하다는 장점이 존재한다. 따라서 최고의 성능을 위해서는 둘 다 사용하는 것이 보편적.

 

 

1. build.gradle파일에 관련 라이브러리 추가

//Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'

//okHttp
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0'

 

 

2. manifest파일에 인터넷 허용 퍼미션 추가

<uses-permission android:name="android.permission.INTERNET"/>

 

 

3. 서버와 통신할 기능을 적은 RetrofitInterface작성

interface RetrofitInterface {
    @GET("/posts")
    fun getPosts(): Call<List<Post>>
    
    @GET("/post/{pk}")
    fun getPost(@Path("pk")pk:Int): Call<Post>
    
    @POST("/post")
    fun registerPost(@Body p:Post): Call<Response>
}

 

기본 Annotation

@GET

데이터 조회 요청

 

@POST

데이터 추가 요청

 

@DELETE

데이터 삭제 요청

 

@PUT

데이터 수정 요청

 

@PATCH

데이터 일부 수정 요청
(put의 경우, 자원 전체를 갱신을 의미하고 patch는 해당 자원의 일부를 교체하는 의미로 사용)

 

@Query

http://xxx.x.x?index=1&page=2 식의 요청 매개변수로 넣어주는 어노테이션

 

@Path

http://xxx.x.x/index/1 식의 요청 매개변수로 넣어주는 어노테이션

 

@SerialzedName

JSON으로 serialize 될 때 매칭되는 이름을 명시하는 목적으로 사용되는 마킹 어노테이션

 

@Expose

object 중 해당 값이 null일 경우, json으로 만들 필드를 자동 생략

 

 

4. 여러 곳에서 쓰일 레트로핏 객체를 반환해주는 모듈파일 작성

const val BASE_URL = "BASE URL주소"

var gson = GsonBuilder().setLenient().create()

//레트로핏 객체 반환
fun getRetrofit(): Retrofit {

    val retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build()

    return retrofit
}

 

 

5. 필요한 곳에서 레트로핏 통신 코드 작성

//레트로핏 객체 생성
val service = getRetrofit().create(RetrofitInterface::class.java)

//요청
pk = 1
service.getPosts(pk)
	.enqueue(object: Callback<Post>{
    	override fun onResponse(call: Call<Post>, response: Response<Post>) {
        	//레트로핏 성공
        }
        
        override fun onFailure(call: Call<Post>, t: Throwable) {
        	//네트워크 연결 실패
        }
})

 

 

✔️ 레트로핏 통신 코드를 좀 더 빌드창을 통해 자세히 확인하고 싶을 때 OkHttpClient 객체 이용

레트로핏 객체 모듈 작성 파일에서 다음 내용 추가

fun getRetrofit(): Retrofit {

    val okHttpClient: OkHttpClient by lazy{
        OkHttpClient.Builder()
            .addInterceptor(HttpLoggingInterceptor().apply{
                level = HttpLoggingInterceptor.Level.BODY
            })
            .build()
    }

    val retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create(gson))
        .client(okHttpClient)
        .build()

    return retrofit
}