단비의 개발블로그

[Android] Retrofit 2.0 사용 방법 (Kotlin) - 1. 시작하기 본문

Android

[Android] Retrofit 2.0 사용 방법 (Kotlin) - 1. 시작하기

단비냥 2019. 7. 28. 12:57
반응형

 

Retrofit 2.0 사용 방법에 대한 포스팅을 해보려고 합니다.

서버와 통신을 하는 데 많이 쓰는 아주 유용한 라이브러리입니다.

 

HttpURLConnection을 사용하여 통신을 위한 코드를 직접 작성할 수도 있지만

코드의 양도 많아지고, 아무래도 직접 작성한 코드는 여러가지 유형의 버그에 취약할 수 있죠.

 

Retrofit 2.0 은 인터페이스와, 여러가지 어노테이션을 사용하여 직관적이고, 간결하게 서버와 통신할 수 있도록 해줍니다.

한번도 써보지 않으신 분들은 신세계를 경험하실 거에요!

 

여기저기서 공부하고 직접 써본 후에 작성하는 포스팅이므로 잘못된 점이나, 더 나은 방법 혹은 질문이 있으시다면 얼마든지 댓글로 알려주세요 :) 시작하겠습니다!

 

1. 시작하기

app 단의 build.gradle

먼저 app단의 build.gradle에 라이브러리를 추가해야 합니다.

 

1
2
3
4
5
6
7
8
dependencies {
    ...
    // Retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

dependencies 안에 이렇게 작성한 뒤 gradle sync 해줍니다.

converter-gson은 서버에서 가져온 json 객체를 gson으로 간단히 파싱해주기 위해 쓰는 것이고,

adapter-rxjava2는 rxjava와의 연결을 위한 것입니다. RxJava와의 사용은 추후 포스팅할 예정입니다.

 

아참, 서버 통신을 위해 인터넷을 사용하니 Manifest 파일에 permission 추가도 잊지마세요!

저도 맨날 빼먹어서 서버 통신이 되지 않아 코드를 잘못 작성한건가 잠시 고민하곤 한답니다 ㅋㅋㅋ

 

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

위치는 <application> 밖에 작성해주시면 됩니다.

 

 

2. Data Class 작성

서버에서 응답이 오는 Json 객체에 맞추어 Data class를 작성합니다.

Java는 get, set 메서드도 작성해야 하는 반면에 Kotlin은 Data class로 모든 것이 해결되니 너무 편하죠!!

Java에 익숙해져 있었지만 Kotlin으로 갈아탄 이유 중 하나입니다 ㅎㅎ

 

1
2
3
4
5
6
data class Example (
    var age: Int,
    var name: String,
    @SerializedName("user_seq")
    var userSeq: Int                              
)
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

 

예를 들어 이런 식으로, Json 응답과 다르게 변수명을 정해주고 싶을 경우

@SerializedName 어노테이션을 사용하여 괄호 안에 Json 응답과 동일하게 써주고, 변수명을 다르게 지정해주시면 됩니다.

 

Json 응답 변수가 너무 많아 귀찮을 경우를 대비하여 이런 사이트도 있습니다

Json to Java Object 서비스

 

Java, Scala로만 바꿔주는 단점이.. ㅠㅠ 

Kotlin 사용하시는 분들은 Java로 가져와 Android Studio가 자동으로 변환해주는 방법이 있습니다

 

* JSON 객체 중 필요한 정보가 일부라면, 일부만 써주셔도 됩니다.

  하지만 변수명이 조금이라도 틀리면 에러가 납니다 ㅠㅠ 

 

 

3. 인터페이스 작성

interface 파일을 새로 작성합니다. 저는 대략 RetrofitService라고 하겠습니다.

서버 통신 유형에 따라 여러가지 방법이 있는데, Twitch API 로 몇가지 유형을 소개하겠습니다.

저도 항상 잊어버려서 정리할 겸도 하고요 ㅎㅎ

 

(1) 기본

1
2
3
4
5
6
interface RetrofitService {
 
    @GET("kraken/streams/followed")
    fun getOnlineChannel():  Call<ChannelData>
 
}
 


@GET 어노테이션은 감이 오시죠? HTTP 메서드에 따라 @POST @DELETE 등등 앞에 붙여주시면 됩니다.

뒤는 URL 입니다. 주의하실 점은 https://api.twitch.tv/kraken/streams/followed

여기서 https://api.twitch.tv/ 부분을 baseUrl로 하시고 뒷부분만 써주시면 됩니다.

 

(2) Path 

1
2
3
4
 
@GET("kraken/channels/{id}/videos")
fun getVideo(@Path("id") id: String):  Call<Videos>
 
 

 

서버 Url Path가 동적으로 들어가야 할 때도 있죠. 그땐 이렇게!

 

(3) Query

1
2
3
4
 
@GET("kraken/search/streams")
fun searchChannels(@Query("query") query: String):  Call<ChannelData>
 
r
 
 

Url에 query parameter를 넣어줄 경우입니다.

kraken/search/streams/?query=

Url로 표현하면 이런식이겠죠.

 

(4) Body

1
2
3
4
 
@POST("kraken/search/streams")
fun searchChannels(@Body  body: YourBody):  Call<ChannelData>
 
er
 

 

Post로 요청할때 Body를 넣어 보내는 경우입니다.

 

(5) Header

1
2
3
4
5
6
7
8
9
 
@Headers({
      "Accept: application/vnd.twitchtv.v5+json",
      "Client-ID: // id 값",
      "Authorization: OAuth // auth 키"
})
@POST("kraken/search/streams")
fun searchChannels(@Body body: YourBody): Call<ChannelData>
 
hter
 

 

헤더가 필요한 경우입니다.

 

(6) FormUrlEncoded

조금 특이한 케이스인데, Content-Type이 x-www-form-urlencoded 인 경우, 

Header와 Body를 위와 같이 써주지 못합니다. 

 

1
2
3
4
5
6
7
 
 @FormUrlEncoded
 @POST("url") fun getAccessToken( @Field("client_id") clientId: String,
                                              @Field("client_secret") clientSecret: String,
                                              @Field("grant_type") grantType: String,
                                            ) : Call<OAuthResponse>
 
r
 

 

Body를 쓰지 못해 이렇게 @Field나 @FieldMap을 사용합니다. 

Header를 추가하는 방법은 초기화를 할 때 추가해줘야 합니다. 

다음 초기화 방법에서 함께 작성하도록 하겠습니다.

 

3. Initialize

1
2
3
4
5
6
7
8
val retrofit = Retrofit.Builder()
                .baseUrl(Url.ROOT)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build()
 
 
her
 

 

다음과 같이 Activity 클래스의 onCreate에서 초기화하여 사용하거나,

저같은 경우 클래스를 하나 생성하여 아래와 같이 사용합니다

 

1
2
3
4
5
6
7
8
9
fun getService(): RetrofitService {
            val retrofit = Retrofit.Builder()
                .baseUrl(Url.ROOT)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build()
 
            return retrofit.create(RetrofitService::class.java)
}
r
 

 

위와 같은 메서드를 작성하여 어느 Activity에서나 한줄로 불러올 수 있도록 사용합니다.

혹은 koin 등을 사용하여 의존성 주입을 하는 방법도 있습니다.

 

위에서 언급한 초기화 코드 내에서 Header를 추가하는 방법입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
            val client = OkHttpClient.Builder().addInterceptor { chain ->
                val newRequest = chain.request().newBuilder()
                    .addHeader("Authorization""Bearer $token")
                    .build()
                chain.proceed(newRequest)
            }.build()
 
            val retrofit = Retrofit.Builder()
                .client(client)
                .baseUrl(Url.ROOT)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build()
r
 

 

OkHttpClient로 interceptor를 추가하여 header를 넣어줍니다.

 

 

4. 마무리

이상으로 Retrofit 기본 인터페이스, 초기화를 하는 방법이었습니다.

더 자세한 것은 Retrofit 공식 홈에 있습니다!

 

 

 

2. Call 동기, 비동기 (다음 포스팅)

반응형
Comments