본문 바로가기
🖥 Programming/📱 Android (Kotlin)

[kotlin][Android] retrofit2 (레트로핏) 사용방법

by MinChan-Youn 2021. 10. 20.

Retrofit2 - REST API 통신 라이브러리?

  • API 통신을 위해 구현된 OkHTTP의 HTTP 통신을 간편하게 만들어주는 라이브러리를 뜻함
  • Async Task가 없이 Background 쓰레드를 실행 -> CallBack을 통하여 Main Thread에서 UI를 업데이트
  • 동일 Squareup사의 OkHttp 라이브러리의 상위 구현체

Retrofit2의 장점 3가지

-Retrofit2의 장점은 3가지로 볼 수 있음 -> (속도, 편의성, 가독성)

  • OkHTTP 사용 시에 AsyncTask를 통해 비동기로 실행하여 속도가 느린이슈. 하지만 Retrofit2에서는 자체적 비동기 실행과 스레드 관리가 가능하여 속도를 빠르다는 장점! (AsyncTask의 3~10배 성능 차이가 난다고 함)
  • 함수 호출 시에 파라미터를 넘겨주어 작업량이 감소
  • Interface 내에서 어노테이션을 사용하여 호출 함수를 미리 지정, 구현 없이 해당 함수를 호출만 해주면 되기 때문에 코드를 읽기에 매우 편합니다. 또한 콜백 함수를 통한 직관적 설계가 가능
  • 동기/비동기 쉬운 구현
        * 동기 Synchronous: 동시에 일어난다는 의미, 요청-응답이 하나의 트랜잭션(작업)에서 발생, 요청 후 응답까지 대기한다는 의미

        * 비동기 Asynchronous: 동시에 일어나지 않는다는 뜻, 요청-응답은 별개의 트랜잭션, 요청 후 응답이 도착하면 Callback으로 받아서 처리

 


Retrofit2의 구성요소 3가지

  • DTO (POJO) - 'Data Transfer Object', 'Plain Old Java Object' 형태의 모델(Model) / JSON 타입변환에 사용
  • Interface - 사용할 HTTP CRUD동작(메소드) 들을 정의해놓은 인터페이스
         * CRUD ( Create / Read / Update / Delete ) -> HTTP Method ( POST / GET / PUT / DELETE )
  • Retrofit.Builder 클래스 - Interface를 사용할 인스턴스, baseUrl(URL) / Converter(변환기) 설정

Retrofit2 예제

1.  Gradle 추가

// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

 

 

2.  Permission (인터넷 권한) 설정

 

3.  DTO / POJO - 모델 클래스 생성

//ExampleResponse.kt
data class User(
    @SerializedName("userId")
    val userId: Int,

    @SerializedName("id")
    val id: String,

    @SerializedName("body")
    val body: String

    // @SerializedName으로 일치시켜 주지않을 경우엔 클래스 변수명이 일치해야함
    // @SerializedName()로 변수명을 입치시켜주면 클래스 변수명이 달라도 알아서 매핑
)
  • 위처럼 JSON 데이터 속성명, 변수명 + 타입(String, Boolean) 일치필수
  • JSON - @SerializedName("속성명")으로 속성명 일치시켜주면 변수명 다르게 사용 가능
  • XML - @Element(name="속성명")으로 XML은 @Element 애노테이션 사용

 

4.  Interface 정의

//RetorifitService.kt
interface RetrofitService {

    //GET 예제
    @GET("posts/1")
    fun getUser(): Call<User>

    @GET("posts/{page}")
    fun getUserPage(@Path("page") page: String): Call<User>


//    @GET("posts/1")
//    fun getStudent(@Query("school_id") schoolId: Int,
//                   @Query("grade") grade: Int,
//                   @Query("classroom") classroom: Int): Call<ExampleResponse>
//
//
//    //POST 예제 - 1(@Field를 사용O -> @FormUrlEncoded 선언)
//    @FormUrlEncoded
//    @POST("posts")
//    fun getContactsObject(@Field("idx") idx: String): Call<JsonObject>


//    //POST 예제 - 2(@Field를 사용X -> @FormUrlEncoded 미선언)
//    @POST("posts")
//    fun getContactsObject2(@Body dataObj: DataObj): Call<JsonObject>
}

 

 

5.  Retrofit2 인스턴스 생성

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

        val retrofit = Retrofit.Builder().baseUrl("https://jsonplaceholder.typicode.com/")
            .addConverterFactory(GsonConverterFactory.create()).build();
        val service = retrofit.create(RetrofitService::class.java);

        service.getUserPage("1")?.enqueue(object : Callback<User>{
            override fun onResponse(call: Call<User>, response: Response<User>) {
                if(response.isSuccessful){
                    // 정상적으로 통신이 성고된 경우
                    var result: User? = response.body()
                    Log.d("YMC", "onResponse 성공: " + result?.toString());
                }else{
                    // 통신이 실패한 경우(응답코드 3xx, 4xx 등)
                    Log.d("YMC", "onResponse 실패")
                }
            }

            override fun onFailure(call: Call<User>, t: Throwable) {
                // 통신 실패 (인터넷 끊킴, 예외 발생 등 시스템적인 이유)
                Log.d("YMC", "onFailure 에러: " + t.message.toString());
            }
        })
    }
}

 

 

6. 응답결과

  • 정상적인 응답 -> User 객체 변환 성공

 

 

글 정리 & 소스코드

[소스코드]
Retrofit2: https://github.com/younminchan/kotlin-study/tree/main/retrofit2_kotlin

 

GitHub - younminchan/kotlin-study: kotlin 다양한 예제코드

kotlin 다양한 예제코드. Contribute to younminchan/kotlin-study development by creating an account on GitHub.

github.com

 

[관련문서]

MVVM 디자인패턴: https://github.com/younminchan/kotlin-mvvm

 

GitHub - younminchan/kotlin-mvvm: 안드로이드 디자인패턴: mvvm

안드로이드 디자인패턴: mvvm. Contribute to younminchan/kotlin-mvvm development by creating an account on GitHub.

github.com

 

 

질문 또는 궁굼한 부분은 댓글을 남겨주세요! 친절하게 답변드리겠습니다!

응원의 댓글은 저에게 큰 힘이 된답니다! :)

즐거운 하루되세요!

 

깃허브 보러 놀러오세요 👇 (맞팔환영)

https://github.com/younminchan

 

younminchan - Overview

안드로이드 2년차 개발자 •⚽️/🎤/🥁/🖥/🏃‍♂️/🚴‍♂️/🤟 TechBlog⬇️ minchanyoun.tistory.com - younminchan

github.com