본문 바로가기

Android

Retrofit2 예제 (feat. HTTP, REST API, OkHttp)

728x90

Retrofit에 대해 알아보기 전 HTTP, HTTPS, REST API, OkHttp를 간단하게 알아보겠습니다.

HTTP

인터넷 상에서 HTML 문서와 같은 데이터를 링크 기반으로 주고받기 위한 프로토콜(통신 규약)으로, 서버-클라이언트 모델(클라이언트 - 요청 / 서버 - 응답)을 따라는 애플리케이션 프로토콜로 TCP/IP(OSI 4계층) 위에서 작동합니다.

 

HTTP Method(GET, POST, PUT, DELETE) : 요청의 종류를 서버에 알리기 위해 사용합니다.

HTTPS

HTTP +  Secure Socket(보안 통신)의 약자로 모든 통신 내용을 암호화하며, 공개키 암호화 방식을 사용합니다.

REST API

REST 아키텍처의 제약 조건을 준수하는 API(Application programming Interface)를 뜻합니다.

 

즉, 자원(이미지, 동영상, DB 자원 등)에 고유한 URI를 부여하여 자원에 대한 상태를 주고 받는 것으로, 자원의 교환은 HTTP URI를 통해 자원을 명시하고 HTTP Method(GET, POST, PUT, DELETE)를 사용해 CRUD Operation을 적용합니다.

 

URI : 인터넷의 우편물 주소 같은 것으로, 리소스를 고유하게 식별하고 위치를 지정할 수 있으며, URI의 형태 중 하나가 URL(특정 서버의 한 리소스에 대한 구체적인 위치를 서술) 입니다.

 

자원(URI) : 고유한 ID를 가지며, 클라이언트(앱)는 ID(서버에 존재)에 해당하는 자원의 상태를 조작하기 위해 요청을 보냅니다.

 

행위(Method) : 자원을 조작하기 위해 요청을 보낼 시 어떤 작업을 원하는지 HTTP Method를 사용하여 요청합니다.

 

표현(Representation) : 클라이언트가 서버로 요청을 보내고 서버로부터 받는 응답인 자원의 상태를 Representation이라고 합니다. 하나의 자원은 JSON, XML, TEXT 등으로 나타낼 수 있습니다.

OkHttp

OkHttp는 서버와 HTTP, HTTP/2 프로토콜 통신을 위한 클라이언트 라이브러리입니다.


Retrofit이란

레트로핏은 안드로이드와 자바 또는 코틀린에서 REST API와 통신을 할 수 있도록 도와주는 TypeSafe한 HttpClient 라이브러리 입니다. 

 

TypeSafe란 네트워크로 부터 받은 데이터를 필요한 형태의 객체로 받을 수 있다는 의미입니다.

 

이제 본격적으로 Retrofit 사용법에 대해 알아보겠습니다.

 

1. Retrofit을 사용하기 위해서는 retrofit의 의존성이 필요하고, 결과를 원하는 객체로 변환하여 받기 위해서 gson converter 라이브러리를 추가해주면 됩니다.

    def retrofit_version = "2.9.0"
    implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
    implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"

 

인터넷 접속 권한도 추가해줍니다.

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

 

2. Interface

retrofit은 Interface를 HTTP API로 전환해주므로 요청할 API에 대한 내용을 Interface에 작성하면 됩니다.

interface Retrofit_Service {
	  @GET(API.GET_RLTMAIRPOLLUTION)
      fun get_rltmAirPollution(
          @Query("stationName") sttN: String,
          @Query("dataTerm") dataTerm: String,
          @Query("pageNo") pageNo: Int,
          @Query("numOfRows") numOfRows: Int,
          @Query("ver") ver: Double
      ) : Call<JsonElement>
}

API Annotation : HTTP Method인 GET, POST, DELETE, PUT을 사용하며, () 내부에는 요청할 서버의 자원의 위치를 나타내는 URL만 입력해주면 됩니다.

 

return Type : 반환되는 타입을 입력하며, 요청과 응답을 받는 코드에 따라 Call<객체> 또는 객체로 작성하면 됩니다.

 

3. Retrofit 초기화 및 호출

val retorfit = Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl(baseUrl)
            .build()

val service = retrofit.create(Interface::class.java)

service.get_rltmAirPollution(sttN, "daily", 1, 1, 1.3).enqueue(object : Callback<JsonElement> {
    override fun onResponse(call: Call<JsonElement>, response: Response<JsonElement>) {
            Log.d(Constants.TAG, 
                        "onResponse() called : response.raw(): ${response.raw()}")
            Log.d(Constants.TAG, 
                        "onResponse() called : response.body(): ${response.body()}")
            Log.d(Constants.TAG, 
                        "onResponse() called : response.code(): ${response.code()}")

            when (response.code()) {
                200 -> {
                    completion(RESPONSE_STATE.OK, response.body())
                }
            }
        }

        override fun onFailure(call: Call<JsonElement>, t: Throwable) {
            Log.d(Constants.TAG, 
                    "onFailure() called : ${t}")

            completion(RESPONSE_STATE.FAIL, null)
        }
    })    
}