[Android] Retrofit 으로 서버-앱 통신 구현하기

안드로이드 앱에서 서버-앱 통신으로 가장 많이 쓰이고, 가장 편하게 사용할 수 있는 프레임워크가 Retrofit 이다.
사용법은 간단하지만 각자 사용하는 방식이 달라 깔끔하게 정의하고 사용할 수 있도록 한다.

클라이언트의 입장에서만 기록한다.

준비사항

  • \interface\Constant 에 들어갈 내용 :
    BASE URL(연결할 사이트의 URL, 뒤에 꼭 “/“ 붙여야함), API KEY, USER KEY 등

  • manifest 에 Internet Permission 취득

    1
    <uses-permission android:name="android.permission.INTERNET" />
  • Rest API 에 사용되는 Request 함수 내용 정의

1. Retrofit 객체 생성

  • Retrofit 의 각종 기능들을 사용하기 위해 Retrofit 객체를 생성한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    /*
    * \model\ApiManager 폴더 생성
    * \model\ApiService 인터페이스를 만들어서
    다른 model 함수에서 통신함수를 만들 뼈대를 만들어준다.
    */

    object ApiManager {

    val retrofit = Retrofit.Builder()
    .baseURL(Constant.BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    // Json 객체 <-> Java 객체
    // 직렬화를 해주는 Gson Converter 라이브러리 추가
    .build()
    // 빌더 패턴을 사용해서 각 인자들을 정의함
    }

    --------------------------------------------------------------------

    /*
    * Main Activity 사용 예시
    */

    class MainActivity : AppCompatActivity() {
    var client : ApiService? = ApiManager.retrofit.create(ApiService::class.java)
    // retrofit 객체 생성

    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    }
    }
  • 추가사항으로 retrofit 객체 생성시 .client(httpClient.build()) 를 붙여 로그를 확인 가능하다.

  • addHeader를 통해 api key 추가도 가능하다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    /*
    * API 통신 로그 확인 및 고정 헤더 추가용
    * 사용시 Retrofit builder에 .client(httpClient.build()) 추가
    */

    fun HttpInterceptor(): OkHttpClient.Builder {
    val logging = HttpLoggingInterceptor()
    logging.level = HttpLoggingInterceptor.Level.BODY
    // 로그 레벨 정의

    val httpClient = OkHttpClient.Builder()
    httpClient.addInterceptor(Interceptor
    { chain ->
    val original = chain.request()
    val request = original.newBuilder()
    .addHeader("x-api-key", Constant.API_KEY)
    .build()
    return@Interceptor chain.proceed(request)
    })
    // 매 신호 송수신마다 헤더 추가
    .addInterceptor(logging)
    // 로그 인터셉터 추가
    .build()
    return httpClient
    }

2. GET/POST/DELETE 등의 Rest API 클래스 생성

  • Retrofit 객체를 가지고 통신을 하기위해 Rest API 가 정의되어있어야 한다.
  • ApiService 라는 Class를 만들어 내부 내용을 정의해준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
interface ApiService{    
@GET("lectures")
fun getLectures() : Call<LecturesResponseModel>

// BASE_URL/lectures&code="" 형식으로 들어간다
@GET("lectures")
fun getLectureByCode(@Query("code") code : String) : Call<LecturesResponseModel>

@POST("timetable")
fun addLecture(@Body addLectureBody: HashMap<String,Any>) : Call<JsonElement>

@DELETE("timetable")
fun deleteLecture(@Body deleteLectureBody: HashMap<String,Any>) : Call<JsonElement>

@GET("memo")
fun getMemoByCode(@Query("user_key") userKey : String?,@Query("code") code : String?) : Call<MemoResponseModel>
}

3. data model 정의

  • Request 및 Response에 필요한 data model 을 정의해준다.
  • kotlin 에는 data class 를 사용한다.
1
2
3
4
5
6
7
8
9
10
11
data class LecturesResponseModel(

@SerializedName("Items")
val lectures: List<LecturesModel>? = null,

@SerializedName("Count")
val count: Int? = null,

@SerializedName("ScannedCount")
val scannedCount: Int? = null
)
공유하기