Retrofit2 사용하기

2021. 5. 31. 16:39

네트워크 관련 라이브러리 중 하나인 Retrofit을 사용해보았다.

Retrofit을 사용하기 위해 권한을 추가해줘야한다.

implementation 'com.squareup.retrofit2:retrofit:2.6.4' 
implementation 'com.squareup.retrofit2:converter-gson:2.6.4'    

 

activity에 retrofit을 만들고 baseUrl을 적는다.

baseUrl은 URL 중 변하지 않는 도메인 주소를 뜻한다.

서버로부터 데이터를 받아와서 원하는 타입으로 데이터를 바꾸기 위해

addConverterFactory(GsonConverterFactory.create())를 사용한다.

val retrofit = Retrofit.Builder()
            .baseUrl("http://mellowcode.rog/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()

 

retrofit에서는 baseURL 뒷부분을 쉽게 관리할 수 있도록 interface 구조 제공한다.

어노테이션(@)을 사용하여 Request Type을 정의하고 value 값은 baseURL 뒷부분으로 한다.

Request Type은 다음과 같다.

  • GET : 정보 요청
  • POST : 정보 추가 요청
  • DELETE : 정보 삭제 요청
  • PUT : 정보 수정 요청

이를 호출하기 위한 함수를 만들어 최종적으로 원하는 타입을 Call 타입으로 받는다.

package com.example.prac_android

import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST

interface RetrofitService {

    @GET("json/students/")
    fun getStudentsList() : Call<ArrayList<PersonFromServer>>

    @POST("json/students/")
    fun createStudent(
        @Body person : PersonFromServer
    ) : Call<PersonFromServer>
}

activity에서 데이터 통신을 위해 서비스를 retrofit에 연결시킨다.

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

GET 요청

연결시킨 service에 getStudentsList()를 호출한다.

통신 실패할 경우 onFailure로 들어가고

통신 성공할 경우 onResponse로 들어가게 된다.

service.getStudentsList().enqueue(object : Callback<ArrayList<PersonFromServer>> {
            override fun onFailure(call: Call<ArrayList<PersonFromServer>>, t: Throwable) {
                Log.d("retrofitt", "GET ERROR : " + t.message)
            }

            override fun onResponse(
                call: Call<ArrayList<PersonFromServer>>,
                response: Response<ArrayList<PersonFromServer>>
            ) {
                //통신이 잘 된 경우
                if (response.isSuccessful){
                    val personList = response.body()
                    Log.d("retrofitt", "GET res : "+personList?.get(0)?.age)
                }
            }
        })

 

POST 요청

POST할 정보를 params에 담은 후 createStudent를 호출한다.

GET과 마찬가지로 onFailure는 전송 실패를, onResponse는 성공을 의미한다.

val params = PersonFromServer(name = "김철수", age = 12, intro = "하이철수")
service.createStudent(params).enqueue(object : Callback<PersonFromServer> {

            override fun onFailure(call: Call<PersonFromServer>, t: Throwable) {
                Log.d("retrofitt", "POST ERROR : " + t.message)
            }

            override fun onResponse(
                call: Call<PersonFromServer>,
                response: Response<PersonFromServer>
            ) {
                if (response.isSuccessful) {
                    val person = response.body()
                    Log.d("retrofitt", "POST name : " + person?.name)
                }
            }
        })

 

전체적인 activity는 다음과 같다.

package com.example.prac_android

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

class RetrofitActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_retrofit)

        val retrofit = Retrofit.Builder()
            .baseUrl("http://mellowcode.org/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()

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

        // GET 요청
        service.getStudentsList().enqueue(object : Callback<ArrayList<PersonFromServer>> {
            override fun onFailure(call: Call<ArrayList<PersonFromServer>>, t: Throwable) {
                Log.d("retrofitt", "GET ERROR : " + t.message)
            }

            override fun onResponse(
                call: Call<ArrayList<PersonFromServer>>,
                response: Response<ArrayList<PersonFromServer>>
            ) {
                //통신이 잘 된 경우
                if (response.isSuccessful){
                    val personList = response.body()
                    Log.d("retrofitt", "GET res : "+personList?.get(0)?.age)

                    val code = response.code()
                    val error = response.errorBody()
                    val header = response.headers()
                }
            }
        })

        //POST 요청
        val params = PersonFromServer(name = "김철수", age = 12, intro = "하이철수")
        service.createStudent(params).enqueue(object : Callback<PersonFromServer> {

            override fun onFailure(call: Call<PersonFromServer>, t: Throwable) {
                Log.d("retrofitt", "POST ERROR : " + t.message)
            }

            override fun onResponse(
                call: Call<PersonFromServer>,
                response: Response<PersonFromServer>
            ) {
                if (response.isSuccessful) {
                    val person = response.body()
                    Log.d("retrofitt", "POST name : " + person?.name)
                }
            }
        })

    }
}
728x90

'💻개발 > Android' 카테고리의 다른 글

ViewModel 사용하기  (0) 2021.06.05
기본 이미지 추가하기  (0) 2021.06.04
Async  (0) 2021.05.30
TabLayout과 Pager  (0) 2021.05.29
리스트뷰 그리는 방법3 : RecyclerView  (0) 2021.05.28

BELATED ARTICLES

more