[kotlin]Retrofit 통신,,

kim hyun woo·2022년 7월 12일
1

오늘은 안드로이드에서 많이 자주 사용되는 Retrofit2배워보자!!..공부해보자..ㅎㅎ


우선 Retrofit이란..?
API 통신을 하기 위해 구현된 라이브러리로 OKHTTP의 상위 버전이다..

그럼 restful api는 무엇인가?

Rest Api란 URI를 통해 어떤 자원인지 명시하고, HTTP Method (GET, POST, PUT, PATCH, DELETE) 에 따라 해당 자원을 처리하여 자원의 상태(Representation)를 응답하도록 설계된 아키텍쳐라고 한다.

Retrofit의 역할은 자원을 주고받기 위한 통신 기술인 것 같다.


그럼 말로 하는 것 보단 직접 구현해보자

우선 어떤 open Api 쓸 것인지 찾아보자


가상화폐거래소인 Upbit의 api가 있다고해서 사용하기로 했다..
사실 코인에 관심은 없지만 나름 신선한 소재여서 사용했다


사용방법

1

우선 Url은 https://crix-api-endpoint.upbit.com/v1/crix/candles/lines?code=$code 이렇게 생겼다. code에 원하는 코인의 이름을 넣어주면 거기에 맞는 값을 반환해준다..

2

그리고나서 Retrofit을 사용하기 위해선 반환되는 데이터 타입을 알아야 한다.

요따구로 생겼다..

3

이제 Data class를 이용하여 반환할려는 클래스를 만들어보자!

data class Response(
    val unit: Int,
    val candles: List<CoinPrice>
)

data class CoinPrice(
    val tradePrice: Float
)

나는 이런식으로 tradePrice를 얻기 위해 이렇게 구성하였다. 내가 구하고자 하는 값이 리스트형태라 자료형도 리스트로 바꿔줘야 된다.

4

그다음 interface를 만들어보자..
무슨 방법을 쓸지 어노테이션을 이용하여 GET 또는 POST를 설정할 수 있다. 여기선 GET을 사용해봤다.
Query를 통해 파라미터도 지정해주자..

interface IRetrofit {

    @GET("/v1/crix/candles/lines")
    fun getPrice(
        @Query("code")  code : String
    ): Call<Response>
}

그리고 아까만든 Response 반환 타입의 클래스를 콜백함수로 지정해주었다..
이제 객체를 만들어 호출하기만 하면 끝..

5

이제 Retrofit객체를 생성해야된다..
Retrofit은 object를 이용하여 싱글턴 패턴을 이용해줬다.
그 이유는 Retrofit객체가 2개든 3개든 하는 역할은 똑같다..
하지만 메모리에 할당을 받기 때문에 한개 이상으로 생성하면 메모리 낭비이기 때문이다..!!!

object RetrofitClient {
    private var retrofitClient : Retrofit? = null

    fun getRetrofit(baseUrl : String) : Retrofit? {
        if(retrofitClient == null){
            retrofitClient = Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
        }
        return retrofitClient
    }
}

6

이제 객체를 만들었으니 호출할 서비스를 만들 차례이다.
인터페이스의 메소드를 호출하기 위해선 아까만든 retrofit의 객체를 이용해야 된다..

class RetrofitManage{
    val TAG = "Retrofit"
    var data : String? = null
    companion object{
        val manager = RetrofitManage()
    }
    private var iRetrofit : IRetrofit? = RetrofitClient.getRetrofit(Resource.BASEURL)?.create(IRetrofit::class.java)

    fun getFund(code : String) : String? {
        val call = iRetrofit?.getPrice(code)
        Log.d(TAG, "onResponse: $data")
        call?.enqueue(object : Callback<Response>{
            override fun onResponse(call: Call<Response>, response: retrofit2.Response<Response>) {
                data = response.body().toString()!!
                Log.d(TAG, "onResponse: $data")
            }
            override fun onFailure(call: Call<Response>, t: Throwable) {
                Log.d(TAG, "onFailure: $t ")
            }

        })
        return data
    }
}

이런식으로 성공했을 때 data를 반환하도록 만들어 주었다

7

이제 메인에서 위에서 만든 함수를 호출만 하면 끝~~!!

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

        button.setOnClickListener {
            var data = RetrofitManage.manager.getFund("CRIX.UPBIT.KRW-BTC")
            textView.text = data
        }
    }
}

8

대망의 결과는.....?

ㅎㅎ;;; 뭔 말인지 모르겠다..
하지만 내가 원하는 값은 성공적으로 호출 됐으니 그걸로 만족!!
다음에는 layout좀 더 신경쓰도록 하겠다..
오늘 공부 끝...

profile
TIL(Today I Learned)

0개의 댓글