본문 바로가기
Android/이것저것

[Android] Retrofit, HTTP 통신을 위한 라이브러리

by 일상 속 둔치 2020. 7. 27.

안드로이드에서 REST API를 사용하기위해 HTTP 통신을 해야할 때 정말 유용하게 사용할 수 있는 라이브러리이다.

 

REST API란?

쉽게 이야기해 정해진 규격으로 URI에 정보들을 담아 통신하는 방법이다! 좀 더 자세하게는 다른 게시글에서 알아보자!

 

1. Gradle

    implementation 'com.squareup.retrofit2:retrofit:2.6.2'
    implementation 'com.squareup.retrofit2:retrofit-mock:2.6.2'
    implementation 'com.google.code.gson:gson:2.8.6'
    implementation 'com.squareup.retrofit2:converter-gson:2.6.2'

Retrofit과 json을 위한 라이브러인 gson을 import해주자.

 

2. Data Class

data class Category(
    @SerializedName("title")
    val category: String,
    @SerializedName("etc")
    val etc: String,
    @SerializedName("id")
    val id: Int
)

데이터를 주고 받을 데이터 클래스를 만들어주자! 위의 코드에서 @SerializedName은 Json에서 Key에 해당한다. 그리고 나중에 클래스 인스턴스를 만들었을 때의 값이 value가 되어 전송된다.

 

3. API interface

interface DBService {
    @GET("/category/read/{id}")
    fun getCategory(
        @Path("id") id: Int
    ): Call<List<GetCategory>>

    @POST("/category/create")
    fun categoryCreate(
        @Body category: Category
    ): Call<GetStatus>
}

어노테이션으로 사용할 HTTP Method를 적어주고 매개변수로는 URI를 적어주자.

이떄 {}로 묶으면 동적으로 변수를 넣어 줄 수 있다!

@Body의 경우 Request의 Body로 값을 넣어주는 것이고 @Path는 URI 변수에 해당하는 값을 넣어주는 것이다.

* Retrofit에서 GET에 @Body를 사용하면 에러가 난다. GET의 원래 사용법과 맞지 않기 때문이다. Body를 실어야하는 경우 POST를 통해 넘겨주자.

 

Call안에 Return 받을 Json을 파싱할 수 있는 클래스를 넣어주자. 이는 2번의 Data Class의 형태로 만들어서 @SerializedName으로 선언해주면 Json을 알아서 파싱해준다.

 

4. Implement interface

object DBServiceImpl {
    private const val BASE_URL = "http://localhost:3000"

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

    val service: DBService = retrofit.create(DBService::class.java)
}

위에서 선언한 Retrofit interface를 빌더를 통해서 알맞게 빌드를 해주자.

 

5. 사용

    private suspend fun categoryCreate(item: Category): String{
        val call: Call<GetStatus> = DBServiceImpl.service.categoryCreate(item)
        var statusCode = "default"

        var job = CoroutineScope(Dispatchers.IO).launch {
            var result = call.execute()
            statusCode = result.body()!!.status
        }
        job.join()

        return statusCode
    }

 

코루틴말고 2번째 줄이 핵심이다. 4번에서 Implement한 객체를 통해 요청을 할 수 있다.

이때 동기적으로 통신할 때에는 execute()를, 비동기적으로 통신할 때에는 enqueue() 함수를 사용하면 된다!

enqueue()의 경우 성공을 처리하는 onResponse함수와 실패를 처리하는 onFailure함수를 override해주어야한다.

* 코루틴의 경우 다른 게시글에서 다루겠다!

 

참고 : http://devflow.github.io/retrofit-kr/

 

-끝-

'Android > 이것저것' 카테고리의 다른 글

[Android] 안드로이드 Room으로 로컬 데이터베이스 이용하기  (0) 2020.10.25
[Android] ViewPager2  (0) 2020.10.11
[Android] Cleartext HTTP ~ bot permitted Error  (0) 2020.07.19
FloatingActionButton  (0) 2020.07.11
Fragment  (0) 2020.07.05

댓글